using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Assets.CoreScripts; using InnerNet; using UnityEngine; public class EndGameManager : DestroyableSingleton { public TextRenderer WinText; public MeshRenderer BackgroundBar; public MeshRenderer Foreground; public FloatRange ForegroundRadius; public SpriteRenderer FrontMost; public PoolablePlayer PlayerPrefab; public Sprite GhostSprite; public SpriteRenderer PlayAgainButton; public SpriteRenderer ExitButton; public AudioClip DisconnectStinger; public AudioClip CrewStinger; public AudioClip ImpostorStinger; public float BaseY = -0.25f; private float stingerTime; public void Start() { if (TempData.showAd && !SaveManager.BoughtNoAds) { AdPlayer.RequestInterstitial(); } this.SetEverythingUp(); base.StartCoroutine(this.CoBegin()); base.Invoke("ShowButtons", 1.1f); } private void ShowButtons() { this.FrontMost.gameObject.SetActive(false); this.PlayAgainButton.gameObject.SetActive(true); this.ExitButton.gameObject.SetActive(true); } private void SetEverythingUp() { StatsManager instance = StatsManager.Instance; uint gamesFinished = instance.GamesFinished; instance.GamesFinished = gamesFinished + 1U; bool flag = TempData.DidHumansWin(TempData.EndReason); if (TempData.EndReason == GameOverReason.ImpostorDisconnect) { StatsManager.Instance.AddDrawReason(TempData.EndReason); this.WinText.Text = DestroyableSingleton.Instance.GetString(StringNames.ImpostorDisconnected, Array.Empty()); SoundManager.Instance.PlaySound(this.DisconnectStinger, false, 1f); } else if (TempData.EndReason == GameOverReason.HumansDisconnect) { StatsManager.Instance.AddDrawReason(TempData.EndReason); this.WinText.Text = DestroyableSingleton.Instance.GetString(StringNames.CrewmatesDisconnected, Array.Empty()); SoundManager.Instance.PlaySound(this.DisconnectStinger, false, 1f); } else { if (TempData.winners.Any((WinningPlayerData h) => h.IsYou)) { StatsManager.Instance.AddWinReason(TempData.EndReason); this.WinText.Text = DestroyableSingleton.Instance.GetString(StringNames.Victory, Array.Empty()); this.BackgroundBar.material.SetColor("_Color", Palette.CrewmateBlue); WinningPlayerData winningPlayerData = TempData.winners.FirstOrDefault((WinningPlayerData h) => h.IsYou); if (winningPlayerData != null) { DestroyableSingleton.Instance.WonGame(winningPlayerData.ColorId, winningPlayerData.HatId); } } else { StatsManager.Instance.AddLoseReason(TempData.EndReason); this.WinText.Text = DestroyableSingleton.Instance.GetString(StringNames.Defeat, Array.Empty()); this.WinText.Color = Color.red; } if (flag) { SoundManager.Instance.PlayDynamicSound("Stinger", this.CrewStinger, false, new DynamicSound.GetDynamicsFunction(this.GetStingerVol), false); } else { SoundManager.Instance.PlayDynamicSound("Stinger", this.ImpostorStinger, false, new DynamicSound.GetDynamicsFunction(this.GetStingerVol), false); } } List list = TempData.winners.OrderBy(delegate(WinningPlayerData b) { if (!b.IsYou) { return 0; } return -1; }).ToList(); for (int i = 0; i < list.Count; i++) { WinningPlayerData winningPlayerData2 = list[i]; int num = (i % 2 == 0) ? -1 : 1; int num2 = (i + 1) / 2; float num3 = 1f - (float)num2 * 0.075f; float num4 = 1f - (float)num2 * 0.035f; float num5 = (float)((i == 0) ? -8 : -1); PoolablePlayer poolablePlayer = UnityEngine.Object.Instantiate(this.PlayerPrefab, base.transform); poolablePlayer.transform.localPosition = new Vector3(0.8f * (float)num * (float)num2 * num4, this.BaseY - 0.25f + (float)num2 * 0.1f, num5 + (float)num2 * 0.01f) * 1.25f; Vector3 vector = new Vector3(num3, num3, num3) * 1.25f; poolablePlayer.transform.localScale = vector; if (winningPlayerData2.IsDead) { poolablePlayer.Body.sprite = this.GhostSprite; poolablePlayer.SetDeadFlipX(i % 2 != 0); } else { poolablePlayer.SetFlipX(i % 2 == 0); } if (!winningPlayerData2.IsDead) { DestroyableSingleton.Instance.SetSkin(poolablePlayer.SkinSlot, winningPlayerData2.SkinId); } else { poolablePlayer.HatSlot.color = new Color(1f, 1f, 1f, 0.5f); } PlayerControl.SetPlayerMaterialColors(winningPlayerData2.ColorId, poolablePlayer.Body); PlayerControl.SetHatImage(winningPlayerData2.HatId, poolablePlayer.HatSlot); PlayerControl.SetPetImage(winningPlayerData2.PetId, winningPlayerData2.ColorId, poolablePlayer.PetSlot); if (flag) { poolablePlayer.NameText.gameObject.SetActive(false); } else { poolablePlayer.NameText.Text = winningPlayerData2.Name; if (winningPlayerData2.IsImpostor) { poolablePlayer.NameText.Color = Palette.ImpostorRed; } poolablePlayer.NameText.transform.localScale = vector.Inv(); } } } private void GetStingerVol(AudioSource source, float dt) { this.stingerTime += dt * 0.75f; source.volume = Mathf.Clamp(1f / this.stingerTime, 0f, 1f); } public IEnumerator CoBegin() { Color c = this.WinText.Color; Color fade = Color.black; Color white = Color.white; Vector3 titlePos = this.WinText.transform.localPosition; float timer = 0f; while (timer < 3f) { timer += Time.deltaTime; float num = Mathf.Min(1f, timer / 3f); this.Foreground.material.SetFloat("_Rad", this.ForegroundRadius.ExpOutLerp(num * 2f)); fade.a = Mathf.Lerp(1f, 0f, num * 3f); this.FrontMost.color = fade; c.a = Mathf.Clamp(FloatRange.ExpOutLerp(num, 0f, 1f), 0f, 1f); this.WinText.Color = c; titlePos.y = 2.7f - num * 0.3f; this.WinText.transform.localPosition = titlePos; yield return null; } this.FrontMost.gameObject.SetActive(false); yield break; } public void NextGame() { this.PlayAgainButton.gameObject.SetActive(false); this.ExitButton.gameObject.SetActive(false); if (TempData.showAd && !SaveManager.BoughtNoAds) { TempData.showAd = false; AdPlayer.ShowInterstitial(this, true); return; } base.StartCoroutine(this.CoJoinGame()); } public IEnumerator CoJoinGame() { AmongUsClient.Instance.JoinGame(); yield return EndGameManager.WaitWithTimeout(() => AmongUsClient.Instance.ClientId >= 0); if (AmongUsClient.Instance.ClientId < 0) { AmongUsClient.Instance.ExitGame(AmongUsClient.Instance.LastDisconnectReason); } yield break; } public void Exit() { this.PlayAgainButton.gameObject.SetActive(false); this.ExitButton.gameObject.SetActive(false); if (TempData.showAd && !SaveManager.BoughtNoAds) { TempData.showAd = false; AdPlayer.ShowInterstitial(this, false); return; } AmongUsClient.Instance.ExitGame(DisconnectReasons.ExitGame); } public static IEnumerator WaitWithTimeout(Func success) { float timer = 0f; while (timer < 5f && !success()) { yield return null; timer += Time.deltaTime; } yield break; } }