diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index ace73e9a..c90d880f 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -387,6 +387,8 @@ void Game::init(void) shouldreturntoeditor = false; #endif + over30mode = false; + /* Terry's Patrons... */ const char* superpatrons_arr[] = { "Anders Ekermo", @@ -4746,6 +4748,11 @@ void Game::loadstats() skipfakeload = atoi(pText); } + if (pKey == "over30mode") + { + over30mode = atoi(pText); + } + if (pKey == "notextoutline") { graphics.notextoutline = atoi(pText); @@ -4991,6 +4998,10 @@ void Game::savestats() msg->LinkEndChild(doc.NewText(help.String((int)graphics.showmousecursor).c_str())); dataNode->LinkEndChild(msg); + msg = doc.NewElement("over30mode"); + msg->LinkEndChild(doc.NewText(help.String((int) over30mode).c_str())); + dataNode->LinkEndChild(msg); + for (size_t i = 0; i < controllerButton_flip.size(); i += 1) { msg = doc.NewElement("flipButton"); @@ -7063,6 +7074,7 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ ) option("toggle filter"); option("toggle analogue"); option("toggle mouse"); + option("toggle fps"); option("return"); menuxoff = -50; menuyoff = 8; diff --git a/desktop_version/src/Game.h b/desktop_version/src/Game.h index c94f71dc..b2cc0d65 100644 --- a/desktop_version/src/Game.h +++ b/desktop_version/src/Game.h @@ -401,6 +401,8 @@ public: { return inintermission || insecretlab || intimetrial || nodeathmode; } + + bool over30mode; }; extern Game game; diff --git a/desktop_version/src/Input.cpp b/desktop_version/src/Input.cpp index cc0becbf..c82e583b 100644 --- a/desktop_version/src/Input.cpp +++ b/desktop_version/src/Input.cpp @@ -358,6 +358,12 @@ void menuactionpress() graphics.showmousecursor = true; } break; + case 5: + //toggle 30+ fps + music.playef(11); + game.over30mode = !game.over30mode; + game.savestats(); + break; default: //back music.playef(11); diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp index 4bbc65af..99203359 100644 --- a/desktop_version/src/Render.cpp +++ b/desktop_version/src/Render.cpp @@ -162,6 +162,20 @@ void menurender() graphics.Print(-1, 85, "Current mode: HIDE", tr/2, tg/2, tb/2, true); } break; + case 5: + graphics.bigprint(-1, 30, "Toggle 30+ FPS", tr, tg, tb, true); + graphics.Print(-1, 65, "Change whether the game", tr, tg, tb, true); + graphics.Print(-1, 75, "runs at 30 or over 30 FPS.", tr, tg, tb, true); + + if (!game.over30mode) + { + graphics.Print(-1, 95, "Current mode: 30 FPS", tr/2, tg/2, tb/2, true); + } + else + { + graphics.Print(-1, 95, "Current mode: Over 30 FPS", tr, tg, tb, true); + } + break; } break; case Menu::credits: diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp index 2b0b535c..dd36e173 100644 --- a/desktop_version/src/main.cpp +++ b/desktop_version/src/main.cpp @@ -306,12 +306,34 @@ int main(int argc, char *argv[]) volatile Uint32 time = 0; volatile Uint32 timePrev = 0; volatile Uint32 accumulator = 0; + volatile Uint32 f_time = 0; + volatile Uint32 f_timePrev = 0; + volatile Uint32 f_accumulator = 0; game.infocus = true; key.isActive = true; game.gametimer = 0; while(!key.quitProgram) { + f_timePrev = f_time; + f_time = SDL_GetTicks(); + const float f_rawdeltatime = static_cast(f_time - f_timePrev); + if (!game.over30mode) + { + f_accumulator += f_rawdeltatime; + } + + while ((game.over30mode || f_accumulator >= 34) && !key.quitProgram) + { + if (game.over30mode) + { + f_accumulator = 0; + } + else + { + f_accumulator = fmodf(f_accumulator, 34); + } + timePrev = time; time = SDL_GetTicks(); @@ -601,6 +623,7 @@ int main(int argc, char *argv[]) } gameScreen.FlipScreen(); } + } } game.savestats();