High-level game flow manager for NoChillquarium. Defines GameScreen enum and GameFlow static class that tracks current screen, raises change events, and provides methods to transition between screens (warning, menu, settings, achievements, playing, ending). Methods also trigger audio, save/load operations, and reset or initialize various gameplay subsystems.
namespace NoChillquarium;
/// <summary>
/// High-level app screens. Gameplay systems hang off <see cref="GameScreen.Playing"/>.
/// </summary>
public enum GameScreen
{
Warning,
MainMenu,
Settings,
Achievements,
Playing,
Ending
}
public static class GameFlow
{
public static GameScreen Screen { get; private set; } = GameScreen.Warning;
public static event Action Changed;
public static bool CanContinue => SaveGame.HasSave;
public static void SetScreen( GameScreen screen )
{
if ( Screen == screen )
return;
Screen = screen;
Changed?.Invoke();
}
public static void AcceptWarning()
{
GameAudio.PlayUi( GameAudio.Confirm );
Achievements.OnWarningAccepted();
// Menu Achievements count should match save immediately.
SaveGame.PrefetchAchievementsForMenu();
SetScreen( GameScreen.MainMenu );
GameAudio.StartMenuMusic();
}
public static void OpenSettings()
{
GameAudio.PlayUi( GameAudio.Notice );
SetScreen( GameScreen.Settings );
}
public static void CloseSettings()
{
GameAudio.PlayUi( GameAudio.Close );
SetScreen( GameScreen.MainMenu );
}
public static void OpenAchievements()
{
// Show progress from save even before Continue is pressed.
SaveGame.PrefetchAchievementsForMenu();
GameAudio.PlayUi( GameAudio.Notice );
SetScreen( GameScreen.Achievements );
}
public static void CloseAchievements()
{
GameAudio.PlayUi( GameAudio.Close );
SetScreen( GameScreen.MainMenu );
}
public static void NewGame()
{
GameAudio.PlayUi( GameAudio.Confirm );
GameAudio.StopMusic();
Economy.ResetForNewGame(); // also clears FeedSystem
Chaos.Reset();
Karma.Reset();
Shop.ResetInventory();
Achievements.ClearProgress();
TankSim.StartNewGame();
TrainingSystem.Clear();
BattleSystem.ResetProgress();
SharkSystem.ResetProgress();
EndingSystem.Reset();
ExplodeSystem.Clear();
DeathFeel.Clear();
BoomFeel.Clear();
DogeFloat.Clear();
StatFloat.Clear();
DarkWeb.Clear();
MethRush.Load( 0 );
SpriteCatalog.Warmup();
// Keep strobe-warning unlock if they already accepted this session.
Achievements.OnWarningAccepted();
Achievements.OnNewGameStarted();
SaveGame.TrySave();
SetScreen( GameScreen.Playing );
GameAudio.StartTankMusic();
}
public static void ContinueGame()
{
if ( !SaveGame.ApplyLoadedSave() )
{
GameAudio.PlayUi( GameAudio.Error );
Log.Warning( "[NO-CHILLquarium] Continue failed — no valid save." );
return;
}
// ApplyLoadedSave already restored FeedSystem / Training syringes / progress.
// Only clear transient runtime UI — never wipe unlocks again.
ExplodeSystem.Clear();
DeathFeel.Clear();
BoomFeel.Clear();
DogeFloat.Clear();
StatFloat.Clear();
TrainingSystem.CancelInject();
BattleSystem.Clear();
SharkSystem.Clear();
SpriteCatalog.Warmup();
TankSim.ReseatAllDecor();
Achievements.OnContinue();
GameAudio.PlayUi( GameAudio.Confirm );
GameAudio.StopMusic();
SetScreen( GameScreen.Playing );
GameAudio.StartTankMusic();
}
public static void ReturnToMenu()
{
GameAudio.PlayUi( GameAudio.Close );
SaveGame.TrySave();
GameAudio.StopMusic();
FeedSystem.Clear();
ExplodeSystem.Clear();
BattleSystem.Clear();
SharkSystem.Clear();
DeathFeel.Clear();
BoomFeel.Clear();
TankSim.Clear();
SetScreen( GameScreen.MainMenu );
GameAudio.StartMenuMusic();
}
public static void Quit()
{
if ( TankSim.IsActive )
SaveGame.TrySave();
GameAudio.PlayUi( GameAudio.Close );
GameAudio.StopMusic();
Game.Close();
}
}