From 92aa38bdfc36fd7599a8e85722825381c89f0f9c Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Mon, 6 Jan 2014 17:37:23 +0200
Subject: [PATCH] Actually pause singleplayer game in pause menu and use lower
 maximum FPS in it

---
 minetest.conf.example   |  2 ++
 src/defaultsettings.cpp |  1 +
 src/game.cpp            | 35 ++++++++++++++++++++---------------
 src/guiPauseMenu.h      |  4 +++-
 src/guiVolumeChange.h   |  2 ++
 src/mainmenumanager.h   | 11 +++++++++++
 src/modalMenu.h         |  1 +
 7 files changed, 40 insertions(+), 16 deletions(-)

diff --git a/minetest.conf.example b/minetest.conf.example
index 243c84f3a..fa54bde8d 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -68,6 +68,8 @@
 # If FPS would go higher than this, limit it by sleeping
 # (to not waste CPU power for no benefit)
 #fps_max = 60
+# Maximum FPS when game is paused
+#pause_fps_max = 20
 # The allowed adjustment range for the automatic rendering range adjustment
 #viewing_range_nodes_max = 160
 #viewing_range_nodes_min = 35
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 5a1dabebf..a7187faea 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -77,6 +77,7 @@ void set_default_settings(Settings *settings)
 
 	settings->setDefault("wanted_fps", "30");
 	settings->setDefault("fps_max", "60");
+	settings->setDefault("pause_fps_max", "20");
 	// A bit more than the server will send around the player, to make fog blend well
 	settings->setDefault("viewing_range_nodes_max", "240");
 	settings->setDefault("viewing_range_nodes_min", "35");
diff --git a/src/game.cpp b/src/game.cpp
index c768440d3..b751a2b62 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1513,7 +1513,9 @@ void the_game(
 		*/
 
 		{
-			float fps_max = g_settings->getFloat("fps_max");
+			float fps_max = g_menumgr.pausesGame() ?
+					g_settings->getFloat("pause_fps_max") :
+					g_settings->getFloat("fps_max");
 			u32 frametime_min = 1000./fps_max;
 			
 			if(busytime_u32 < frametime_min)
@@ -2192,25 +2194,28 @@ void the_game(
 			LocalPlayer* player = client.getEnv().getLocalPlayer();
 			player->keyPressed=keyPressed;
 		}
-		
+
 		/*
-			Run server
+			Run server, client (and process environments)
 		*/
-
-		if(server != NULL)
+		bool can_be_and_is_paused =
+				(simple_singleplayer_mode && g_menumgr.pausesGame());
+		if(can_be_and_is_paused)
 		{
-			//TimeTaker timer("server->step(dtime)");
-			server->step(dtime);
+			// No time passes
+			dtime = 0;
 		}
-
-		/*
-			Process environment
-		*/
-		
+		else
 		{
-			//TimeTaker timer("client.step(dtime)");
-			client.step(dtime);
-			//client.step(dtime_avg1);
+			if(server != NULL)
+			{
+				//TimeTaker timer("server->step(dtime)");
+				server->step(dtime);
+			}
+			{
+				//TimeTaker timer("client.step(dtime)");
+				client.step(dtime);
+			}
 		}
 
 		{
diff --git a/src/guiPauseMenu.h b/src/guiPauseMenu.h
index 25011a34a..2808c93b1 100644
--- a/src/guiPauseMenu.h
+++ b/src/guiPauseMenu.h
@@ -51,7 +51,9 @@ class GUIPauseMenu : public GUIModalMenu
 	void drawMenu();
 
 	bool OnEvent(const SEvent& event);
-	
+
+	bool pausesGame(){ return true; }
+
 private:
 	IGameCallback *m_gamecallback;
 	bool m_simple_singleplayer_mode;
diff --git a/src/guiVolumeChange.h b/src/guiVolumeChange.h
index 1dcc7fbde..5258ee107 100644
--- a/src/guiVolumeChange.h
+++ b/src/guiVolumeChange.h
@@ -44,6 +44,8 @@ class GUIVolumeChange : public GUIModalMenu
 
 	bool OnEvent(const SEvent& event);
 	
+	bool pausesGame(){ return true; }
+
 private:
 	Client* m_client;
 
diff --git a/src/mainmenumanager.h b/src/mainmenumanager.h
index d151cf48d..ecfb89fd3 100644
--- a/src/mainmenumanager.h
+++ b/src/mainmenumanager.h
@@ -91,6 +91,17 @@ class MainMenuManager : public IMenuManager
 		return m_stack.size();
 	}
 
+	bool pausesGame()
+	{
+		for(std::list<GUIModalMenu*>::iterator
+				i = m_stack.begin(); i != m_stack.end(); ++i)
+		{
+			if((*i)->pausesGame())
+				return true;
+		}
+		return false;
+	}
+
 	std::list<GUIModalMenu*> m_stack;
 };
 
diff --git a/src/modalMenu.h b/src/modalMenu.h
index c8b45a247..251b7aa3b 100644
--- a/src/modalMenu.h
+++ b/src/modalMenu.h
@@ -124,6 +124,7 @@ class GUIModalMenu : public gui::IGUIElement
 	virtual void drawMenu() = 0;
 	virtual bool preprocessEvent(const SEvent& event) { return false; };
 	virtual bool OnEvent(const SEvent& event) { return false; };
+	virtual bool pausesGame(){ return false; } // Used for pause menu
 
 protected:
 	//bool m_force_regenerate_gui;
-- 
GitLab