+/****************************************************************************
+ Fast key cache for main game loop
+ ****************************************************************************/
+
+/* This is faster than using getKeySetting with the tradeoff that functions
+ * using it must make sure that it's initialised before using it and there is
+ * no error handling (for example bounds checking). This is really intended for
+ * use only in the main running loop of the client (the_game()) where the faster
+ * (up to 10x faster) key lookup is an asset. Other parts of the codebase
+ * (e.g. formspecs) should continue using getKeySetting().
+ */
+struct KeyCache {
+
+ KeyCache() { populate(); }
+
+ enum {
+ // Player movement
+ KEYMAP_ID_FORWARD,
+ KEYMAP_ID_BACKWARD,
+ KEYMAP_ID_LEFT,
+ KEYMAP_ID_RIGHT,
+ KEYMAP_ID_JUMP,
+ KEYMAP_ID_SPECIAL1,
+ KEYMAP_ID_SNEAK,
+
+ // Other
+ KEYMAP_ID_DROP,
+ KEYMAP_ID_INVENTORY,
+ KEYMAP_ID_CHAT,
+ KEYMAP_ID_CMD,
+ KEYMAP_ID_CONSOLE,
+ KEYMAP_ID_FREEMOVE,
+ KEYMAP_ID_FASTMOVE,
+ KEYMAP_ID_NOCLIP,
+ KEYMAP_ID_CINEMATIC,
+ KEYMAP_ID_SCREENSHOT,
+ KEYMAP_ID_TOGGLE_HUD,
+ KEYMAP_ID_TOGGLE_CHAT,
+ KEYMAP_ID_TOGGLE_FORCE_FOG_OFF,
+ KEYMAP_ID_TOGGLE_UPDATE_CAMERA,
+ KEYMAP_ID_TOGGLE_DEBUG,
+ KEYMAP_ID_TOGGLE_PROFILER,
+ KEYMAP_ID_CAMERA_MODE,
+ KEYMAP_ID_INCREASE_VIEWING_RANGE,
+ KEYMAP_ID_DECREASE_VIEWING_RANGE,
+ KEYMAP_ID_RANGESELECT,
+
+ KEYMAP_ID_QUICKTUNE_NEXT,
+ KEYMAP_ID_QUICKTUNE_PREV,
+ KEYMAP_ID_QUICKTUNE_INC,
+ KEYMAP_ID_QUICKTUNE_DEC,
+
+ KEYMAP_ID_DEBUG_STACKS,
+
+ // Fake keycode for array size and internal checks
+ KEYMAP_INTERNAL_ENUM_COUNT
+
+
+ };
+
+ void populate();
+
+ KeyPress key[KEYMAP_INTERNAL_ENUM_COUNT];
+};
+
+void KeyCache::populate()
+{
+ key[KEYMAP_ID_FORWARD] = getKeySetting("keymap_forward");
+ key[KEYMAP_ID_BACKWARD] = getKeySetting("keymap_backward");
+ key[KEYMAP_ID_LEFT] = getKeySetting("keymap_left");
+ key[KEYMAP_ID_RIGHT] = getKeySetting("keymap_right");
+ key[KEYMAP_ID_JUMP] = getKeySetting("keymap_jump");
+ key[KEYMAP_ID_SPECIAL1] = getKeySetting("keymap_special1");
+ key[KEYMAP_ID_SNEAK] = getKeySetting("keymap_sneak");
+
+ key[KEYMAP_ID_DROP] = getKeySetting("keymap_drop");
+ key[KEYMAP_ID_INVENTORY] = getKeySetting("keymap_inventory");
+ key[KEYMAP_ID_CHAT] = getKeySetting("keymap_chat");
+ key[KEYMAP_ID_CMD] = getKeySetting("keymap_cmd");
+ key[KEYMAP_ID_CONSOLE] = getKeySetting("keymap_console");
+ key[KEYMAP_ID_FREEMOVE] = getKeySetting("keymap_freemove");
+ key[KEYMAP_ID_FASTMOVE] = getKeySetting("keymap_fastmove");
+ key[KEYMAP_ID_NOCLIP] = getKeySetting("keymap_noclip");
+ key[KEYMAP_ID_CINEMATIC] = getKeySetting("keymap_cinematic");
+ key[KEYMAP_ID_SCREENSHOT] = getKeySetting("keymap_screenshot");
+ key[KEYMAP_ID_TOGGLE_HUD] = getKeySetting("keymap_toggle_hud");
+ key[KEYMAP_ID_TOGGLE_CHAT] = getKeySetting("keymap_toggle_chat");
+ key[KEYMAP_ID_TOGGLE_FORCE_FOG_OFF]
+ = getKeySetting("keymap_toggle_force_fog_off");
+ key[KEYMAP_ID_TOGGLE_UPDATE_CAMERA]
+ = getKeySetting("keymap_toggle_update_camera");
+ key[KEYMAP_ID_TOGGLE_DEBUG]
+ = getKeySetting("keymap_toggle_debug");
+ key[KEYMAP_ID_TOGGLE_PROFILER]
+ = getKeySetting("keymap_toggle_profiler");
+ key[KEYMAP_ID_CAMERA_MODE]
+ = getKeySetting("keymap_camera_mode");
+ key[KEYMAP_ID_INCREASE_VIEWING_RANGE]
+ = getKeySetting("keymap_increase_viewing_range_min");
+ key[KEYMAP_ID_DECREASE_VIEWING_RANGE]
+ = getKeySetting("keymap_decrease_viewing_range_min");
+ key[KEYMAP_ID_RANGESELECT]
+ = getKeySetting("keymap_rangeselect");
+
+ key[KEYMAP_ID_QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
+ key[KEYMAP_ID_QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
+ key[KEYMAP_ID_QUICKTUNE_INC] = getKeySetting("keymap_quicktune_inc");
+ key[KEYMAP_ID_QUICKTUNE_DEC] = getKeySetting("keymap_quicktune_dec");
+
+ key[KEYMAP_ID_DEBUG_STACKS] = getKeySetting("keymap_print_debug_stacks");
+}
+