diff options
Diffstat (limited to 'src/game.cpp')
-rw-r--r-- | src/game.cpp | 147 |
1 files changed, 64 insertions, 83 deletions
diff --git a/src/game.cpp b/src/game.cpp index ac50e9aba..f1ee9f8e2 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "camera.h" #include "client.h" #include "client/clientevent.h" +#include "client/gameui.h" #include "client/inputhandler.h" #include "client/tile.h" // For TextureSource #include "client/keys.h" @@ -965,7 +966,8 @@ static void updateChat(Client &client, f32 dtime, bool show_debug, while (!chat_log_error_buf.empty()) { std::wstring error_message = utf8_to_wide(chat_log_error_buf.get()); if (!g_settings->getBool("disable_escape_sequences")) { - error_message = L"\x1b(c@red)" + error_message + L"\x1b(c@white)"; + error_message = L"\x1b(c@red)"; + error_message.append(error_message).append(L"\x1b(c@white)"); } chat_backend.addMessage(L"", error_message); } @@ -1392,41 +1394,41 @@ private: InputHandler *input; - Client *client; - Server *server; + Client *client = nullptr; + Server *server = nullptr; - IWritableTextureSource *texture_src; - IWritableShaderSource *shader_src; + IWritableTextureSource *texture_src = nullptr; + IWritableShaderSource *shader_src = nullptr; // When created, these will be filled with data received from the server - IWritableItemDefManager *itemdef_manager; - IWritableNodeDefManager *nodedef_manager; + IWritableItemDefManager *itemdef_manager = nullptr; + IWritableNodeDefManager *nodedef_manager = nullptr; GameOnDemandSoundFetcher soundfetcher; // useful when testing - ISoundManager *sound; + ISoundManager *sound = nullptr; bool sound_is_dummy = false; - SoundMaker *soundmaker; + SoundMaker *soundmaker = nullptr; - ChatBackend *chat_backend; + ChatBackend *chat_backend = nullptr; - GUIFormSpecMenu *current_formspec; + GUIFormSpecMenu *current_formspec = nullptr; //default: "". If other than "", empty show_formspec packets will only close the formspec when the formname matches std::string cur_formname; - EventManager *eventmgr; - QuicktuneShortcutter *quicktune; + EventManager *eventmgr = nullptr; + QuicktuneShortcutter *quicktune = nullptr; - GUIChatConsole *gui_chat_console; // Free using ->Drop() - MapDrawControl *draw_control; - Camera *camera; - Clouds *clouds; // Free using ->Drop() - Sky *sky; // Free using ->Drop() - Inventory *local_inventory; - Hud *hud; - Minimap *mapper; + std::unique_ptr<GameUI> m_game_ui; + GUIChatConsole *gui_chat_console = nullptr; // Free using ->Drop() + MapDrawControl *draw_control = nullptr; + Camera *camera = nullptr; + Clouds *clouds = nullptr; // Free using ->Drop() + Sky *sky = nullptr; // Free using ->Drop() + Inventory *local_inventory = nullptr; + Hud *hud = nullptr; + Minimap *mapper = nullptr; GameRunData runData; - GameUIFlags flags; /* 'cache' This class does take ownership/responsibily for cleaning up etc of any of @@ -1496,27 +1498,7 @@ private: }; Game::Game() : - client(NULL), - server(NULL), - texture_src(NULL), - shader_src(NULL), - itemdef_manager(NULL), - nodedef_manager(NULL), - sound(NULL), - soundmaker(NULL), - chat_backend(NULL), - current_formspec(NULL), - cur_formname(""), - eventmgr(NULL), - quicktune(NULL), - gui_chat_console(NULL), - draw_control(NULL), - camera(NULL), - clouds(NULL), - sky(NULL), - local_inventory(NULL), - hud(NULL), - mapper(NULL) + m_game_ui(new GameUI()) { g_settings->registerChangedCallback("doubletap_jump", &settingChangedCallback, this); @@ -1643,10 +1625,8 @@ bool Game::startup(bool *kill, runData.profiler_max_page = 3; runData.update_wielded_item_trigger = true; - memset(&flags, 0, sizeof(flags)); - flags.show_chat = true; - flags.show_hud = true; - flags.show_debug = g_settings->getBool("show_debug"); + m_game_ui->initFlags(); + m_invert_mouse = g_settings->getBool("invert_mouse"); m_first_loop_after_window_activation = true; @@ -1737,12 +1717,13 @@ void Game::run() processClientEvents(&cam_view_target); updateCamera(draw_times.busy_time, dtime); updateSound(dtime); - processPlayerInteraction(dtime, flags.show_hud, flags.show_debug); + processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud, + m_game_ui->m_flags.show_debug); updateFrame(&graph, &stats, dtime, cam_view); updateProfilerGraphs(&graph); // Update if minimap has been disabled by the server - flags.show_minimap &= client->shouldShowMinimap(); + m_game_ui->m_flags.show_minimap &= client->shouldShowMinimap(); if (m_does_lost_focus_pause_game && !device->isWindowFocused() && !isMenuActive()) { showPauseMenu(); @@ -1935,7 +1916,7 @@ bool Game::createClient(const std::string &playername, } GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory( - &flags.force_fog_off, &runData.fog_range, client); + &m_game_ui->m_flags.force_fog_off, &runData.fog_range, client); shader_src->addShaderConstantSetterFactory(scsf); // Update cached textures, meshes and materials @@ -2128,7 +2109,7 @@ bool Game::connectToServer(const std::string &playername, client = new Client(playername.c_str(), password, *address, *draw_control, texture_src, shader_src, itemdef_manager, nodedef_manager, sound, eventmgr, - connect_address.isIPv6(), &flags); + connect_address.isIPv6(), m_game_ui.get()); if (!client) return false; @@ -2816,9 +2797,9 @@ void Game::toggleAutoforward() void Game::toggleChat() { - flags.show_chat = !flags.show_chat; + m_game_ui->m_flags.show_chat = !m_game_ui->m_flags.show_chat; runData.statustext_time = 0; - if (flags.show_chat) + if (m_game_ui->m_flags.show_chat) showStatusTextSimple("Chat shown"); else showStatusTextSimple("Chat hidden"); @@ -2827,9 +2808,9 @@ void Game::toggleChat() void Game::toggleHud() { - flags.show_hud = !flags.show_hud; + m_game_ui->m_flags.show_hud = !m_game_ui->m_flags.show_hud; runData.statustext_time = 0; - if (flags.show_hud) + if (m_game_ui->m_flags.show_hud) showStatusTextSimple("HUD shown"); else showStatusTextSimple("HUD hidden"); @@ -2837,7 +2818,7 @@ void Game::toggleHud() void Game::toggleMinimap(bool shift_pressed) { - if (!mapper || !flags.show_hud || !g_settings->getBool("enable_minimap")) + if (!mapper || !m_game_ui->m_flags.show_hud || !g_settings->getBool("enable_minimap")) return; if (shift_pressed) { @@ -2856,7 +2837,7 @@ void Game::toggleMinimap(bool shift_pressed) mode = MINIMAP_MODE_OFF; } - flags.show_minimap = true; + m_game_ui->m_flags.show_minimap = true; switch (mode) { case MINIMAP_MODE_SURFACEx1: showStatusTextSimple("Minimap in surface mode, Zoom x1"); @@ -2878,7 +2859,7 @@ void Game::toggleMinimap(bool shift_pressed) break; default: mode = MINIMAP_MODE_OFF; - flags.show_minimap = false; + m_game_ui->m_flags.show_minimap = false; if (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) showStatusTextSimple("Minimap hidden"); else @@ -2891,9 +2872,9 @@ void Game::toggleMinimap(bool shift_pressed) void Game::toggleFog() { - flags.force_fog_off = !flags.force_fog_off; + m_game_ui->m_flags.force_fog_off = !m_game_ui->m_flags.force_fog_off; runData.statustext_time = 0; - if (flags.force_fog_off) + if (m_game_ui->m_flags.force_fog_off) showStatusTextSimple("Fog disabled"); else showStatusTextSimple("Fog enabled"); @@ -2906,21 +2887,21 @@ void Game::toggleDebug() // 1x toggle: Debug text with chat // 2x toggle: Debug text with profiler graph // 3x toggle: Debug text and wireframe - if (!flags.show_debug) { - flags.show_debug = true; - flags.show_profiler_graph = false; + if (!m_game_ui->m_flags.show_debug) { + m_game_ui->m_flags.show_debug = true; + m_game_ui->m_flags.show_profiler_graph = false; draw_control->show_wireframe = false; showStatusTextSimple("Debug info shown"); - } else if (!flags.show_profiler_graph && !draw_control->show_wireframe) { - flags.show_profiler_graph = true; + } else if (!m_game_ui->m_flags.show_profiler_graph && !draw_control->show_wireframe) { + m_game_ui->m_flags.show_profiler_graph = true; showStatusTextSimple("Profiler graph shown"); } else if (!draw_control->show_wireframe && client->checkPrivilege("debug")) { - flags.show_profiler_graph = false; + m_game_ui->m_flags.show_profiler_graph = false; draw_control->show_wireframe = true; showStatusTextSimple("Wireframe shown"); } else { - flags.show_debug = false; - flags.show_profiler_graph = false; + m_game_ui->m_flags.show_debug = false; + m_game_ui->m_flags.show_profiler_graph = false; draw_control->show_wireframe = false; if (client->checkPrivilege("debug")) { showStatusTextSimple("Debug info, profiler graph, and wireframe hidden"); @@ -2934,9 +2915,9 @@ void Game::toggleDebug() void Game::toggleUpdateCamera() { - flags.disable_camera_update = !flags.disable_camera_update; + m_game_ui->m_flags.disable_camera_update = !m_game_ui->m_flags.disable_camera_update; runData.statustext_time = 0; - if (flags.disable_camera_update) + if (m_game_ui->m_flags.disable_camera_update) showStatusTextSimple("Camera update disabled"); else showStatusTextSimple("Camera update enabled"); @@ -3529,7 +3510,7 @@ void Game::updateCamera(u32 busy_time, f32 dtime) m_camera_offset_changed = (camera_offset != old_camera_offset); - if (!flags.disable_camera_update) { + if (!m_game_ui->m_flags.disable_camera_update) { client->getEnv().getClientMap().updateCamera(camera_position, camera_direction, camera_fov, camera_offset); @@ -4224,7 +4205,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, clouds->update(camera_node_position, sky->getCloudColor()); if (clouds->isCameraInsideCloud() && m_cache_enable_fog && - !flags.force_fog_off) { + !m_game_ui->m_flags.force_fog_off) { // if inside clouds, and fog enabled, use that as sky // color(s) video::SColor clouds_dark = clouds->getColor() @@ -4249,7 +4230,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, Fog */ - if (m_cache_enable_fog && !flags.force_fog_off) { + if (m_cache_enable_fog && !m_game_ui->m_flags.force_fog_off) { driver->setFog( sky->getBgColor(), video::EFT_FOG_LINEAR, @@ -4277,8 +4258,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, v2u32 screensize = driver->getScreenSize(); - updateChat(*client, dtime, flags.show_debug, screensize, - flags.show_chat, runData.profiler_current_page, + updateChat(*client, dtime, m_game_ui->m_flags.show_debug, screensize, + m_game_ui->m_flags.show_chat, runData.profiler_current_page, *chat_backend, guitext_chat); /* @@ -4351,7 +4332,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, TimeTaker tt_draw("mainloop: draw"); driver->beginScene(true, true, skycolor); - bool draw_wield_tool = (flags.show_hud && + bool draw_wield_tool = (m_game_ui->m_flags.show_hud && (player->hud_flags & HUD_FLAG_WIELDITEM_VISIBLE) && (camera->getCameraMode() == CAMERA_MODE_FIRST)); bool draw_crosshair = ( @@ -4363,13 +4344,13 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, } catch (SettingNotFoundException) { } #endif - RenderingEngine::draw_scene(skycolor, flags.show_hud, flags.show_minimap, - draw_wield_tool, draw_crosshair); + RenderingEngine::draw_scene(skycolor, m_game_ui->m_flags.show_hud, + m_game_ui->m_flags.show_minimap, draw_wield_tool, draw_crosshair); /* Profiler graph */ - if (flags.show_profiler_graph) + if (m_game_ui->m_flags.show_profiler_graph) graph->draw(10, screensize.Y - 10, driver, g_fontengine->getFont()); /* @@ -4397,7 +4378,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, /* Update minimap pos and rotation */ - if (mapper && flags.show_minimap && flags.show_hud) { + if (mapper && m_game_ui->m_flags.show_minimap && m_game_ui->m_flags.show_hud) { mapper->setPos(floatToInt(player->getPosition(), BS)); mapper->setAngle(player->getYaw()); } @@ -4429,7 +4410,7 @@ void Game::updateGui(const RunStats &stats, f32 dtime, const CameraOrientation & LocalPlayer *player = client->getEnv().getLocalPlayer(); v3f player_position = player->getPosition(); - if (flags.show_debug) { + if (m_game_ui->m_flags.show_debug) { static float drawtime_avg = 0; drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05; u16 fps = 1.0 / stats.dtime_jitter.avg; @@ -4462,7 +4443,7 @@ void Game::updateGui(const RunStats &stats, f32 dtime, const CameraOrientation & guitext->setRelativePosition(rect); } - if (flags.show_debug) { + if (m_game_ui->m_flags.show_debug) { std::ostringstream os(std::ios_base::binary); os << std::setprecision(1) << std::fixed << "pos: (" << (player_position.X / BS) @@ -4498,7 +4479,7 @@ void Game::updateGui(const RunStats &stats, f32 dtime, const CameraOrientation & } setStaticText(guitext_info, translate_string(infotext).c_str()); - guitext_info->setVisible(flags.show_hud && g_menumgr.menuCount() == 0); + guitext_info->setVisible(m_game_ui->m_flags.show_hud && g_menumgr.menuCount() == 0); float statustext_time_max = 1.5; |