summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game.cpp57
1 files changed, 25 insertions, 32 deletions
diff --git a/src/game.cpp b/src/game.cpp
index b4bce33d3..272abe783 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1212,6 +1212,7 @@ struct GameRunData {
bool ldown_for_dig;
bool left_punch;
bool update_wielded_item_trigger;
+ bool reset_jump_timer;
float nodig_delay_timer;
float dig_time;
float dig_time_complete;
@@ -1332,6 +1333,7 @@ protected:
void processKeyboardInput(VolatileRunFlags *flags,
float *statustext_time,
float *jump_timer,
+ bool *reset_jump_timer,
u32 *profiler_current_page,
u32 profiler_max_page);
void processItemSelection(u16 *new_playeritem);
@@ -1568,9 +1570,7 @@ void Game::run()
flags.show_chat = true;
flags.show_hud = true;
-
- /* FIXME: This should be updated every iteration, or not stored locally
- now that key settings can be changed in-game */
+ flags.show_debug = g_settings->getBool("show_debug");
flags.invert_mouse = g_settings->getBool("invert_mouse");
/* Clear the profiler */
@@ -1585,6 +1585,8 @@ void Game::run()
&runData.fog_range,
client));
+ std::vector<aabb3f> highlight_boxes;
+
while (device->run() && !(*kill || g_gamecallback->shutdown_requested)) {
/* Must be called immediately after a device->run() call because it
@@ -1602,8 +1604,6 @@ void Game::run()
processQueues();
- std::vector<aabb3f> highlight_boxes;
-
infotext = L"";
hud->resizeHotbar();
addProfilerGraphs(stats, draw_times, dtime);
@@ -2307,6 +2307,7 @@ void Game::processUserInput(VolatileRunFlags *flags,
flags,
&interact_args->statustext_time,
&interact_args->jump_timer,
+ &interact_args->reset_jump_timer,
&interact_args->profiler_current_page,
interact_args->profiler_max_page);
@@ -2317,6 +2318,7 @@ void Game::processUserInput(VolatileRunFlags *flags,
void Game::processKeyboardInput(VolatileRunFlags *flags,
float *statustext_time,
float *jump_timer,
+ bool *reset_jump_timer,
u32 *profiler_current_page,
u32 profiler_max_page)
{
@@ -2339,6 +2341,7 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
toggleFreeMove(statustext_time);
} else if (input->wasKeyDown(getKeySetting("keymap_jump"))) {
toggleFreeMoveAlt(statustext_time, jump_timer);
+ *reset_jump_timer = true;
} else if (input->wasKeyDown(getKeySetting("keymap_fastmove"))) {
toggleFast(statustext_time);
} else if (input->wasKeyDown(getKeySetting("keymap_noclip"))) {
@@ -2390,6 +2393,11 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
<< std::endl;
debug_stacks_print();
}
+
+ if (!input->isKeyDown(getKeySetting("keymap_jump")) && *reset_jump_timer) {
+ *reset_jump_timer = false;
+ *jump_timer = 0.0;
+ }
}
@@ -2485,10 +2493,8 @@ void Game::toggleFreeMove(float *statustext_time)
void Game::toggleFreeMoveAlt(float *statustext_time, float *jump_timer)
{
- if (g_settings->getBool("doubletap_jump") && *jump_timer < 0.2f) {
+ if (g_settings->getBool("doubletap_jump") && *jump_timer < 0.2f)
toggleFreeMove(statustext_time);
- *jump_timer = 0;
- }
}
@@ -3759,6 +3765,7 @@ void Game::updateGui(float *statustext_time, const RunStats& stats,
drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05;
u16 fps = 1.0 / stats.dtime_jitter.avg;
+ //s32 fps = driver->getFPS();
std::ostringstream os(std::ios_base::binary);
os << std::fixed
@@ -3871,18 +3878,16 @@ inline void Game::updateProfilerGraphs(ProfilerGraph *graph)
****************************************************************************/
/* On some computers framerate doesn't seem to be automatically limited
- *
- * *Must* be called after device->run() so that device->getTimer()->getTime();
- * is correct
*/
inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime)
{
// not using getRealTime is necessary for wine
+ device->getTimer()->tick(); // Maker sure device time is up-to-date
u32 time = device->getTimer()->getTime();
u32 last_time = fps_timings->last_time;
- if (time > last_time) // Make sure time hasn't overflowed
+ if (time > last_time) // Make sure time hasn't overflowed
fps_timings->busy_time = time - last_time;
else
fps_timings->busy_time = 0;
@@ -3894,37 +3899,25 @@ inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime)
if (fps_timings->busy_time < frametime_min) {
fps_timings->sleep_time = frametime_min - fps_timings->busy_time;
device->sleep(fps_timings->sleep_time);
- time += fps_timings->sleep_time;
} else {
fps_timings->sleep_time = 0;
}
- if (time > last_time) // Checking for overflow
- *dtime = (time - last_time) / 1000.0;
- else
- *dtime = 0.03; // Choose 30fps as fallback in overflow case
-
- fps_timings->last_time = time;
-
-#if 0
-
- /* This is the old method for calculating new_time and dtime, and seems
- * like overkill considering timings are messed up by expected variation
- * in execution speed in other places anyway. (This has nothing to do with
- * WINE... the new method above calculates dtime based on sleep_time)
+ /* Get the new value of the device timer. Note that device->sleep() may
+ * not sleep for the entire requested time as sleep may be interrupted and
+ * therefore it is arguably more accurate to get the new time from the
+ * device rather than calculating it by adding sleep_time to time.
*/
- // Necessary for device->getTimer()->getTime()
- device->run();
+ device->getTimer()->tick(); // Update device timer
time = device->getTimer()->getTime();
- if (time > last_time) // Make sure last_time hasn't overflowed
+ if (time > last_time) // Make sure last_time hasn't overflowed
*dtime = (time - last_time) / 1000.0;
else
- *dtime = 0.033;
+ *dtime = 0;
- params->last_time = time;
-#endif
+ fps_timings->last_time = time;
}