/** * Update the ship countdown display text */ static void updateShip(ref uGUI_SunbeamCountdown __instance, float timeLeft) { TimeSpan timeSpan = TimeSpan.FromSeconds((double)timeLeft); string text = string.Format("{0:D2}:{1:D2}:{2:D2}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds); __instance.countdownText.text = text; }
/** * Hide the ship countdown if we're currently showing it */ static void hideShip(ref uGUI_SunbeamCountdown __instance) { if (!showingShip) { return; } __instance.countdownHolder.SetActive(false); showingShip = false; }
public static void uGUI_SunbeamCountdown_Start_Postfix(uGUI_SunbeamCountdown __instance) { Vector2 midCenter = new Vector2(0.5f, 0.5f); __instance.countdownHolder.GetComponent <RectTransform>().anchorMax = midCenter; __instance.countdownHolder.GetComponent <RectTransform>().anchorMin = midCenter; __instance.countdownHolder.GetComponent <RectTransform>().pivot = midCenter; __instance.countdownHolder.GetComponent <RectTransform>().anchoredPosition = new Vector2(0f, -275f); __instance.countdownHolder.GetComponent <RectTransform>().localScale = Vector3.one * 0.75f; __instance.transform.Find("Background").GetComponent <CanvasRenderer>().SetAlpha(0f); }
/** * Show the ship countdown, if not already showing */ static void showShip(ref uGUI_SunbeamCountdown __instance) { if (showingShip) { return; } __instance.countdownTitle.text = "Drive Core Explosion"; __instance.countdownHolder.SetActive(true); showingShip = true; }
/** * Returns true if we're currently showing the Sunbeam Arrival countdown */ static bool isSunbeamShowing(uGUI_SunbeamCountdown __instance) { StoryGoalCustomEventHandler main = StoryGoalCustomEventHandler.main; return(main && main.countdownActive); }
public static void Postfix(ref uGUI_SunbeamCountdown __instance) { if (DayNightCycle.main == null) { return; } if (CrashedShipExploder.main == null) { return; } // These are the internal parameters for the Aurora story events (see AuroraWarnings for time thresholds) float timeToStartWarning = CrashedShipExploder.main.GetTimeToStartWarning(); float timeToStartCountdown = CrashedShipExploder.main.GetTimeToStartCountdown(); float timeNow = DayNightCycle.main.timePassedAsFloat; DeathRun.countdownMonitor.Update(timeNow); int deep; if (Config.EXPLOSION_DEATHRUN.Equals(DeathRun.config.explodeDepth)) { deep = 100; } else if (Config.EXPLOSION_HARD.Equals(DeathRun.config.explodeDepth)) { deep = 50; } else { deep = 0; } if (deep > 0) { // At time of second Aurora warning if (DeathRun.countdownMonitor.JustWentAbove(Mathf.Lerp(timeToStartWarning, timeToStartCountdown, 0.5f))) { DeathRunUtils.CenterMessage("Explosion Shockwave Will Be", MESSAGE_TIME); DeathRunUtils.CenterMessage("Over " + deep + "m Deep!", MESSAGE_TIME, 1); } if (DeathRun.countdownMonitor.JustWentAbove(Mathf.Lerp(timeToStartWarning, timeToStartCountdown, 0.5f) + MESSAGE_TIME)) { ErrorMessage.AddMessage("WARNING: Explosion will produce shockwave over " + deep + "m deep!"); } // At time of third Aurora warning if (DeathRun.countdownMonitor.JustWentAbove(Mathf.Lerp(timeToStartWarning, timeToStartCountdown, 0.8f))) { DeathRunUtils.CenterMessage("Prepare To Evacuate At Least", MESSAGE_TIME); DeathRunUtils.CenterMessage("" + deep + "m Deep. Preferably Inside.", MESSAGE_TIME, 1); } if (DeathRun.countdownMonitor.JustWentAbove(Mathf.Lerp(timeToStartWarning, timeToStartCountdown, 0.8f) + MESSAGE_TIME)) { ErrorMessage.AddMessage("Prepare to evacuate at least " + deep + "m deep, preferably inside!"); } // At time of final countdown if (DeathRun.countdownMonitor.JustWentAbove(timeToStartCountdown)) { DeathRunUtils.CenterMessage("Seek Safe Depth Immediately!", MESSAGE_TIME); DeathRunUtils.CenterMessage("Preferably Inside!", MESSAGE_TIME, 1); } if (DeathRun.countdownMonitor.JustWentAbove(timeToStartCountdown + MESSAGE_TIME)) { ErrorMessage.AddMessage("Seek safe depth immediately! Preferably inside!"); } } deep = (int)RadiationUtils.getRadiationMaxDepth(); if (deep > 0) { if (DeathRun.countdownMonitor.JustWentAbove(timeToStartCountdown + 100f)) { DeathRunUtils.CenterMessage("Radiation Will Gradually Permeate", MESSAGE_TIME); DeathRunUtils.CenterMessage("Ocean As Deep As " + deep + "m.", MESSAGE_TIME, 1); } if (DeathRun.countdownMonitor.JustWentAbove(timeToStartCountdown + 100f + MESSAGE_TIME)) { ErrorMessage.AddMessage("Radiation will gradually permeate the sea, as deep as " + deep + "m."); } if (DeathRun.countdownMonitor.JustWentAbove(timeToStartCountdown + 100f + MESSAGE_TIME * 2)) { DeathRunUtils.CenterMessage("All devices will consume power more rapidly", MESSAGE_TIME); DeathRunUtils.CenterMessage("while exposed to RADIATION, and recharge slowly.", MESSAGE_TIME, 1); } if (DeathRun.countdownMonitor.JustWentAbove(timeToStartCountdown + 100f + MESSAGE_TIME * 3)) { ErrorMessage.AddMessage("All devices will consume power more rapidly while exposed to RADIATION and recharge slowly."); } } // If the Sunbeam rescue timer is showing, give that precedence over our countdown timer. if (isSunbeamShowing(__instance)) { showingShip = false; return; } // This is the time of the very first warning about the Aurora if (timeNow >= Mathf.Lerp(timeToStartWarning, timeToStartCountdown, 0.2f) && // Time of first Aurora warning (timeNow < timeToStartCountdown + 24f)) // Actual explosion time (24 sec after countdown) { float timeLeft = (timeToStartCountdown + 24f) - timeNow; if (timeLeft < 0) { timeLeft *= -1; } showShip(ref __instance); updateShip(ref __instance, timeLeft); } else { hideShip(ref __instance); } }