GameFlow.cs
namespace NoChillquarium;
/// <summary>
/// High-level app screens. Gameplay systems hang off <see cref="GameScreen.Playing"/>.
/// </summary>
public enum GameScreen
{
Warning,
MainMenu,
Settings,
Playing,
Ending
}
public static class GameFlow
{
public static GameScreen Screen { get; private set; } = GameScreen.MainMenu;
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 );
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 NewGame()
{
GameAudio.PlayUi( GameAudio.Confirm );
GameAudio.StopMusic();
Economy.ResetForNewGame(); // also clears FeedSystem
Chaos.Reset();
Karma.Reset();
Shop.ResetInventory();
TankSim.StartNewGame();
TrainingSystem.Clear();
BattleSystem.ResetProgress();
SharkSystem.ResetProgress();
EndingSystem.Reset();
ExplodeSystem.Clear();
DeathFeel.Clear();
BoomFeel.Clear();
FusionFeel.Clear();
BuyReveal.Clear();
PixelFx.Clear();
FishRarityInfo.ResetPity();
FishFusion.Clear();
DogeFloat.Clear();
StatFloat.Clear();
DarkWeb.Clear();
MethRush.Load( 0 );
StorySystem.ResetForNewGame();
GrandmaGifts.ResetForNewGame();
GrandmaReact.ResetForNewGame();
JanitorPeep.ResetForNewGame();
CrimeSystem.ResetForNewGame();
AchievementSystem.ResetForNewGame();
WaterFx.Clear();
LotRunSystem.ResetProgress();
// Gifts auto-trigger: establishing shot → tank → later wallet. No forced popup.
SpriteCatalog.Warmup();
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();
FusionFeel.Clear();
BuyReveal.Clear();
PixelFx.Clear();
FishFusion.Clear();
DogeFloat.Clear();
StatFloat.Clear();
TrainingSystem.CancelInject();
BattleSystem.Clear();
SharkSystem.Clear();
GrandmaGifts.Clear(); // no mid-dialogue resume; received flags already loaded
GrandmaReact.Clear(); // pending quip only; said flags loaded via ApplyLoadedSave
JanitorPeep.ResetForNewGame();
CrimeSystem.Clear();
AchievementSystem.Clear();
WaterFx.Clear();
LotRunSystem.Clear();
SpriteCatalog.Warmup();
TankSim.ReseatAllDecor();
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();
FusionFeel.Clear();
BuyReveal.Clear();
PixelFx.Clear();
FishFusion.Clear();
StorySystem.Clear();
GrandmaGifts.Clear();
GrandmaReact.Clear();
JanitorPeep.Clear();
CrimeSystem.Clear();
AchievementSystem.Clear();
WaterFx.Clear();
LotRunSystem.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();
}
}