/// <summary> /// Shows the game over dialog. /// </summary> /// Override this in your own base class if you want to customise the game over window. Be sure to call this base instance when done. public virtual void Show(bool isWon) { Assert.IsTrue(LevelManager.IsActive, "Ensure that you have a LevelManager component attached to your scene."); var currentLevel = GameManager.Instance.Levels.Selected; // update the player score if necessary if ((UpdatePlayerScore == CopyType.Always) || (UpdatePlayerScore == CopyType.OnWin && isWon)) { GameManager.Instance.Player.AddPoints(currentLevel.Score); } // update the player coins if necessary if ((UpdatePlayerCoins == CopyType.Always) || (UpdatePlayerCoins == CopyType.OnWin && isWon)) { GameManager.Instance.Player.AddCoins(currentLevel.Coins); } // show won / lost game objects as appropriate GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Lost", true), !isWon); // see if the world or game is won and also if we should unlock the next world / level GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "GameWon", true), false); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "WorldWon", true), false); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "LevelWon", true), false); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Won", true), false); if (isWon) { //TODO: if coins unlock mode then need to check all levels are done before saying world complete - same for game... //TODO: perhaps in future we might want to distinguish between the first and subsequent times a user completes something? //// is the game won //if (GameHelper.IsCurrentLevelLastInGame()) { // GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "GameWon", true), true); //} //// is a world won //else if (GameHelper.IsCurrentLevelLastInGame()) //{ // GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "WorldWon", true), true); //} //// level won //else if (GameManager.Instance.Levels.GetNextItem() != null) //{ // GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "LevelWon", true), true); //} //// else won with some other condition //else //{ GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Won", true), true); //} // process and update game state - do this last so we can check some bits above. GameHelper.ProcessCurrentLevelComplete(); } // set some text based upon the result UIHelper.SetTextOnChildGameObject(DialogInstance.gameObject, "AchievementText", LocaliseText.Format(LocalisationBase + ".Achievement", currentLevel.Score, currentLevel.Name)); // setup stars var starsGameObject = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Stars", true); GameObjectHelper.SafeSetActive(starsGameObject, ShowStars); if (ShowStars) { Assert.IsNotNull(starsGameObject, "GameOver->ShowStars is enabled, but could not find a 'Stars' gameobject. Disable the option or fix the structure."); starsGameObject.SetActive(ShowStars); var newStarsWon = GetNewStarsWon(); currentLevel.StarsWon |= newStarsWon; var star1WonGameObject = GameObjectHelper.GetChildNamedGameObject(starsGameObject, "Star1", true); var star2WonGameObject = GameObjectHelper.GetChildNamedGameObject(starsGameObject, "Star2", true); var star3WonGameObject = GameObjectHelper.GetChildNamedGameObject(starsGameObject, "Star3", true); StarWon(currentLevel.StarsWon, newStarsWon, star1WonGameObject, 1); StarWon(currentLevel.StarsWon, newStarsWon, star2WonGameObject, 2); StarWon(currentLevel.StarsWon, newStarsWon, star3WonGameObject, 4); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(starsGameObject, "StarWon", true), newStarsWon != 0); } // set time var difference = DateTime.Now - LevelManager.Instance.StartTime; var timeGameObject = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Time", true); GameObjectHelper.SafeSetActive(timeGameObject, ShowTime); if (ShowTime) { Assert.IsNotNull(timeGameObject, "GameOver->ShowTime is enabled, but could not find a 'Time' gameobject. Disable the option or fix the structure."); UIHelper.SetTextOnChildGameObject(timeGameObject, "TimeResult", difference.Minutes.ToString("D2") + "." + difference.Seconds.ToString("D2"), true); } // set coins var coinsGameObject = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Coins", true); GameObjectHelper.SafeSetActive(coinsGameObject, ShowCoins); if (ShowCoins) { Assert.IsNotNull(coinsGameObject, "GameOver->ShowCoins is enabled, but could not find a 'Coins' gameobject. Disable the option or fix the structure."); UIHelper.SetTextOnChildGameObject(coinsGameObject, "CoinsResult", currentLevel.Coins.ToString(), true); } // set score var scoreGameObject = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Score", true); GameObjectHelper.SafeSetActive(scoreGameObject, ShowScore); if (ShowScore) { Assert.IsNotNull(scoreGameObject, "GameOver->ShowScore is enabled, but could not find a 'Score' gameobject. Disable the option or fix the structure."); var distanceText = LocaliseText.Format(LocalisationBase + ".ScoreResult", currentLevel.Score.ToString()); if (currentLevel.HighScore > currentLevel.OldHighScore) { distanceText += "\n" + LocaliseText.Get(LocalisationBase + ".NewHighScore"); } UIHelper.SetTextOnChildGameObject(scoreGameObject, "ScoreResult", distanceText, true); } UpdateNeededCoins(); // save game state. GameManager.Instance.Player.UpdatePlayerPrefs(); currentLevel.UpdatePlayerPrefs(); PreferencesFactory.Save(); //show dialog DialogInstance.Show(); //TODO bug - as we increase TimesPlayedForRatingPrompt on both game start (GameManager) and level finish we can miss this comparison. if (GameManager.Instance.TimesPlayedForRatingPrompt == TimesPlayedBeforeRatingPrompt) { var gameFeedback = new GameFeedback(); gameFeedback.GameFeedbackAssumeTheyLikeOptional(); } #if UNITY_ANALYTICS // record some analytics on the level played var values = new Dictionary <string, object> { { "score", currentLevel.Score }, { "Coins", currentLevel.Coins }, { "time", difference }, { "level", currentLevel.Number } }; Analytics.CustomEvent("GameOver", values); #endif // co routine to periodic updates of display (don't need to do this every frame) if (!Mathf.Approximately(PeriodicUpdateDelay, 0)) { StartCoroutine(PeriodicUpdate()); } }
public virtual void Show(bool isWon, float time, int points = 0, ChallengeManager.GameStates gameState = ChallengeManager.GameStates.Leaved, ChallengeManager.GameStateMessage message = null) { _multiplayer = GameSparksManager.Instance.GetGameMode() == GameMode.Multi; _buttonPurchaseObject = GameObject.Find("PurchaseButton"); if (_buttonPurchaseObject != null && !_multiplayer) { _inviteOriginalParent = _buttonPurchaseObject.transform.parent.gameObject; _inviteOriginalPosition = _buttonPurchaseObject.transform.position; _inviteButtonObject = gameObject; DialogInstance _inviteDialogInstance = gameObject.GetComponent <DialogInstance>(); GameObjectUtils.MoveObjectToAtIndex(_buttonPurchaseObject, _inviteDialogInstance.Target, 1); } pointsView = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "PointsView", true); shareView = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "SharingView", true); multiplayerView = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "MultiplayerPointsView", true); if (_multiplayer) { pointsView.SetActive(false); multiplayerView.SetActive(true); if (gameState == ChallengeManager.GameStates.Won || gameState == ChallengeManager.GameStates.Draw) { ButtonUtils.PlayWinSound(); } else { ButtonUtils.PlayLoseSound(); } } else { pointsView.SetActive(true); multiplayerView.SetActive(false); ButtonUtils.PlayWinSound(); } var currentLevel = GameManager.Instance.Levels.Selected; int coins = 0; bool firstTimePlayed = _multiplayer ? true : currentLevel.ProgressBest < 0.9f; LevelManager.Instance.EndLevel(); this.Coins = coins; if (firstTimePlayed && !_multiplayer) { currentLevel.AddPoints(points); currentLevel.ProgressBest = 1.0f; } if (_multiplayer && gameState == ChallengeManager.GameStates.Lost) { points *= -1; } GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Dialog", true), false); Assert.IsTrue(LevelManager.IsActive, "Ensure that you have a LevelManager component attached to your scene."); if (coins > 0 && !_multiplayer) { // add coins for this level currentLevel.AddCoins(coins); GameManager.Instance.Player.AddCoins(coins); } GameManager.Instance.Player.AddPoints(points); // update the player coins if necessary if (((UpdatePlayerCoins == CopyType.Always) || (UpdatePlayerCoins == CopyType.OnWin && isWon)) && !_multiplayer) { GameManager.Instance.Player.AddCoins(currentLevel.Coins); } // show won / lost game objects as appropriate GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Lost", true), !isWon); // see if the world or game is won and also if we should unlock the next world / level GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "GameWon", true), false); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "WorldWon", true), false); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "LevelWon", true), false); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Won", true), false); GameObject levelName = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "LevelName", true); if (_multiplayer) { levelName.GetComponent <Text>().text = LocaliseText.Get("LevelCompleted.Match"); } else { levelName.GetComponent <Text>().text = LocaliseText.Format("LevelCompleted.LevelName", currentLevel.Number); } GameObjectHelper.SafeSetActive(levelName, true); if (!_multiplayer && isWon) { GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Won", true), true); // process and update game state - do this last so we can check some bits above. GameHelper.ProcessCurrentLevelComplete(); } // set some text based upon the result UIHelper.SetTextOnChildGameObject(DialogInstance.gameObject, "AchievementText", LocaliseText.Format(LocalisationBase + ".Achievement", currentLevel.Score, currentLevel.Name)); // setup stars var starsGameObject = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Stars", true); GameObjectHelper.SafeSetActive(starsGameObject, ShowStars); if (ShowStars && !_multiplayer) { Assert.IsNotNull(starsGameObject, "GameOver->ShowStars is enabled, but could not find a 'Stars' gameobject. Disable the option or fix the structure."); starsGameObject.SetActive(ShowStars); var newStarsWon = GetNewStarsWon(); currentLevel.StarsWon |= newStarsWon; var star1WonGameObject = GameObjectHelper.GetChildNamedGameObject(starsGameObject, "Star1", true); var star2WonGameObject = GameObjectHelper.GetChildNamedGameObject(starsGameObject, "Star2", true); var star3WonGameObject = GameObjectHelper.GetChildNamedGameObject(starsGameObject, "Star3", true); StarWon(currentLevel.StarsWon, newStarsWon, star1WonGameObject, 1, coins); StarWon(currentLevel.StarsWon, newStarsWon, star2WonGameObject, 2, coins); StarWon(currentLevel.StarsWon, newStarsWon, star3WonGameObject, 4, coins); GameObjectHelper.SafeSetActive(GameObjectHelper.GetChildNamedGameObject(starsGameObject, "StarWon", true), newStarsWon != 0); } // set time var timeGameObject = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Time", true); GameObjectHelper.SafeSetActive(timeGameObject, ShowTime); if (!_multiplayer && ShowTime) { TimeSpan timeSpan = TimeSpan.FromSeconds(time); string timeText = LocaliseText.Format("LevelCompleted.Time", timeSpan.Minutes, timeSpan.Seconds); Assert.IsNotNull(timeGameObject, "GameOver->ShowTime is enabled, but could not find a 'Time' gameobject. Disable the option or fix the structure."); UIHelper.SetTextOnChildGameObject(timeGameObject, "TimeResult", timeText, true); } if (!_multiplayer && currentLevel.TimeBest < 0.05) { // save only first time played currentLevel.TimeBest = time; } // set coins if (ShowCoins && coins > 0) { var coinsGameObject = GameObjectHelper.GetChildNamedGameObject(DialogInstance.gameObject, "Coins", true); GameObjectHelper.SafeSetActive(coinsGameObject, ShowCoins); Assert.IsNotNull(coinsGameObject, "GameOver->ShowCoins is enabled, but could not find a 'Coins' gameobject. Disable the option or fix the structure."); UIHelper.SetTextOnChildGameObject(coinsGameObject, "CoinsResult", coins.ToString(), true); } if (!_multiplayer) { if (firstTimePlayed) { GameObject DoubleButton = GameObjectHelper.GetChildNamedGameObject(pointsView, "DoubleButton", true); DoubleButton.SetActive(Reachability.Instance.IsReachable()); } else { GameObject ShareButton = GameObjectHelper.GetChildNamedGameObject(pointsView, "ShareButton", true); ShareButton.SetActive(true); } } // set score var scoreGameObject = GameObjectHelper.GetChildNamedGameObject(_multiplayer ? multiplayerView : pointsView, "Score", true); GameObjectHelper.SafeSetActive(scoreGameObject, ShowScore); if (!firstTimePlayed) { GameObjectHelper.SafeSetActive(scoreGameObject, false); } if (!_multiplayer && firstTimePlayed) { GameObject adsObject = GameObjectHelper.GetChildNamedGameObject(pointsView, "Ads", true); Text unlockText = GameObjectHelper.GetChildComponentOnNamedGameObject <Text>(pointsView, "UnlockText", true); if (LevelController.Instance.LastLevelInPack(currentLevel)) { Pack pack = LevelController.Instance.PackForLevel(currentLevel); Pack nextPack = LevelController.Packs().GetItem(pack.Number + 1); if (nextPack) { nextPack.LoadData(); adsObject.SetActive(false); unlockText.gameObject.SetActive(true); unlockText.text = LocaliseText.Format("LevelCompleted.LastLevelInPack", LocaliseText.Get(nextPack.JsonData.GetString("name"))); } } if (LevelController.Instance.LastLevelInRank(currentLevel)) { Rank rank = LevelController.Instance.RankForLevel(currentLevel); Rank nextRank = LevelController.Ranks().GetItem(rank.Number + 1); if (nextRank) { nextRank.LoadData(); adsObject.SetActive(false); unlockText.gameObject.SetActive(true); unlockText.text = LocaliseText.Format("LevelCompleted.LastLevelInRank", LocaliseText.Get(nextRank.JsonData.GetString("name"))); } } } if (ShowScore) { Assert.IsNotNull(scoreGameObject, "GameOver->ShowScore is enabled, but could not find a 'Score' gameobject. Disable the option or fix the structure."); UIHelper.SetTextOnChildGameObject(scoreGameObject, "ScoreResult", LocaliseText.Format("LevelCompleted.Score", "0"), true); AnimateScoreText(points); } if (_multiplayer) { var resultStateObject = GameObjectHelper.GetChildNamedGameObject(multiplayerView, "ResultState", true); GameObjectHelper.SafeSetActive(resultStateObject, true); string text = ""; switch (gameState) { case ChallengeManager.GameStates.Won: text = LocaliseText.Get("Game.YouWon"); break; case ChallengeManager.GameStates.Lost: text = LocaliseText.Get("Game.YouLost"); break; case ChallengeManager.GameStates.Draw: text = LocaliseText.Get("Game.ItsDrawn"); break; } resultStateObject.GetComponent <Text>().text = text; } if (!_multiplayer) { UpdateNeededCoins(); LevelController.Instance.PackProgressCompleted(currentLevel); UnlockNextLevel(); // int StartupLevels = ((CustomGameManager)CustomGameManager.Instance).StartupLevels; if (StartupLevels == currentLevel.Number) { GameObject adsObject = GameObjectHelper.GetChildNamedGameObject(pointsView, "Ads", true); Text adsText = adsObject.GetComponent <Text>(); adsText.text = LocaliseText.Get("Text.PlayedAllLevels"); adsText.fontSize = 39; adsText.resizeTextForBestFit = false; if (!Debug.isDebugBuild) { Flurry.Flurry.Instance.LogEvent("Game_LastLevel", new Dictionary <string, string>() { { "Level", currentLevel.Number.ToString() } }); Fabric.Answers.Answers.LogCustom("Game_LastLevel", new Dictionary <string, object>() { { "Level", currentLevel.Number.ToString() } }); } } } if (!_multiplayer && firstTimePlayed) { JSONObject pointsData = new JSONObject(); pointsData.Add("Level", currentLevel.Number.ToString()); pointsData.Add("Language", LocaliseText.Language); pointsData.Add("RealLanguage", LanguageUtils.RealLanguage(LocaliseText.Language)); pointsData.Add("Time", time.ToString()); pointsData.Add("UsedHints", GameController.Instance.usedHintsCount); pointsData.Add("UserCoins", GameManager.Instance.Player.Coins); pointsData.Add("Words", JsonUtils.ListToArray(GameController.Instance.GetFoundWords())); pointsData.Add("Date", DateTimeUtils.DateTimeToISO8601(UnbiasedTime.Instance.UTCNow())); GameSparksManager.Instance.SendPoints(points, "LevelComplete", pointsData); } // GameObject completeTextGameObject = GameObjectHelper.GetChildNamedGameObject(_multiplayer ? multiplayerView : pointsView, "CompleteText", true); // save game state. GameManager.Instance.Player.UpdatePlayerPrefs(); if (!_multiplayer) { currentLevel.UpdatePlayerPrefs(); } PreferencesFactory.Save(); GameObject NameContainer = GameObjectHelper.GetChildNamedGameObject(DialogInstance.Content, "NameContainer", true); GameObject LevelName = GameObjectHelper.GetChildNamedGameObject(DialogInstance.Content, "LevelName", true); GameObject Results = GameObjectHelper.GetChildNamedGameObject(DialogInstance.Content, "Results", true); GameObject Buttons = GameObjectHelper.GetChildNamedGameObject(DialogInstance.Content, "Buttons", true); GameObject CloseButton = GameObjectHelper.GetChildNamedGameObject(DialogInstance.Content, "Close", true); GameObject parent = DialogInstance.Content.transform.parent.gameObject; Vector3 currentScale = parent.transform.localScale; parent.transform.DOScale(new Vector3(0, 0, 0), 0.0f); NameContainer.transform.localScale = new Vector3(0, 0, 0); LevelName.transform.localScale = new Vector3(0, 0, 0); Results.transform.localScale = new Vector3(0, 0, 0); Buttons.transform.localScale = new Vector3(0, 0, 0); completeTextGameObject.transform.localScale = new Vector3(0, 0, 0); CloseButton.GetComponent <Image>().color = new Color(1, 1, 1, 0); //show dialog DialogInstance.Show(); parent.transform.DOScale(currentScale, 1.0f).SetEase(Ease.OutElastic); NameContainer.transform.DOScale(new Vector3(1, 1, 1), 1.5f).SetDelay(0.1f).SetEase(Ease.OutElastic); LevelName.transform.DOScale(new Vector3(1, 1, 1), 0.8f).SetDelay(0.2f).SetEase(Ease.OutElastic); Results.transform.DOScale(new Vector3(1, 1, 1), 0.8f).SetDelay(0.2f).SetEase(Ease.OutElastic); Buttons.transform.DOScale(new Vector3(1, 1, 1), 0.8f).SetDelay(0.2f).SetEase(Ease.OutElastic); completeTextGameObject.transform.DOScale(new Vector3(1, 1, 1), 0.8f).SetDelay(0.35f).SetEase(Ease.OutElastic); CloseButton.GetComponent <Image>().DOFade(1, 0.5f).SetDelay(0.7f); GameObject Light = GameObjectHelper.GetChildNamedGameObject(completeTextGameObject, "Light", true); Light.transform.DOLocalRotate(new Vector3(0, 0, -360), 10, RotateMode.LocalAxisAdd).SetLoops(-1).SetEase(Ease.Linear); //TODO bug - as we increase TimesPlayedForRatingPrompt on both game start (GameManager) and level finish we can miss this comparison. if (GameManager.Instance.TimesPlayedForRatingPrompt == TimesPlayedBeforeRatingPrompt) { GameFeedback gameFeedback = new GameFeedback(); gameFeedback.GameFeedbackAssumeTheyLikeOptional(); } #if UNITY_ANALYTICS // record some analytics on the level played if (!_multiplayer) { var values = new Dictionary <string, object> { { "score", currentLevel.Score }, { "Coins", coins }, { "time", time }, { "level", currentLevel.Number } }; Analytics.CustomEvent("LevelCompleted", values); } #endif #if UNITY_EDITOR if (!_multiplayer) { GameSparksManager.Instance.SyncProgressCoroutine(); } #endif #if !UNITY_EDITOR AdColonyManager.Instance.RequestAd(); AdColonyManager.Instance.RequestAd(Constants.AdColonyDoubleCoins); LoadInterstitialAd(); LoadAdmobRewarderVideo(); #endif // co routine to periodic updates of display (don't need to do this every frame) if (!Mathf.Approximately(PeriodicUpdateDelay, 0)) { StartCoroutine(PeriodicUpdate()); } }