/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define FORBIDDEN_SYMBOL_ALLOW_ALL #include "common/archive.h" #include "common/config-manager.h" #include "common/events.h" #include "qdengine/resource.h" #include "qdengine/qdcore/qd_game_dispatcher.h" #include "qdengine/qdcore/qd_game_scene.h" #include "qdengine/qdcore/qd_trigger_chain.h" #include "qdengine/qdcore/qd_setup.h" #include "qdengine/system/sound/snd_dispatcher.h" #include "qdengine/qdcore/qd_trigger_profiler.h" #include "qdengine/qdcore/qd_file_manager.h" #include "qdengine/qdcore/util/plaympp_api.h" #include "qdengine/qdcore/util/splash_screen.h" #include "qdengine/qdcore/util/ResourceDispatcher.h" #include "qdengine/qdcore/util/WinVideo.h" #include "qdengine/system/graphics/gr_dispatcher.h" #include "qdengine/system/app_core.h" #include "qdengine/system/input/input_wndproc.h" #include "qdengine/system/input/mouse_input.h" #include "qdengine/system/input/keyboard_input.h" namespace QDEngine { namespace qdrt { void init_graphics(); bool init_graphics_dispatcher(); void restore_graphics(); void qd_show_load_progress(int percents_loaded, void *p); void restore(); grDispatcher *grD = NULL; qdGameDispatcher *qd_gameD = NULL; }; // namespace qdrt using namespace qdrt; static void generateTagMap(int date, bool verbose = true) { int n = 0; memset(g_engine->_tagMap, 0, QDSCR_MAX_KEYWORD_ID * sizeof(int)); for (int i = 0; i < QDSCR_MAX_KEYWORD_ID; i++) if (idTagVersionAll[i * 2] <= date) g_engine->_tagMap[n++] = idTagVersionAll[i * 2 + 1]; if (verbose) warning("Generated %d ids for version %d", n, date); } void searchTagMap(int id, int targetVal) { Common::HashMap dates; for (int i = 0; i < QDSCR_MAX_KEYWORD_ID; i++) dates[idTagVersionAll[i * 2]] = true; Common::Array sdates; for (auto it : dates) sdates.push_back(it._key); Common::sort(sdates.begin(), sdates.end()); for (auto d : sdates) { generateTagMap(d, false); int matchedId = -1; int len = QDSCR_MAX_KEYWORD_ID; for (int i = 0; i < QDSCR_MAX_KEYWORD_ID; i++) { if (!g_engine->_tagMap[i]) { len = i; break; } if (g_engine->_tagMap[i] == id) matchedId = i + 1; } warning("ver: %d val: %d of %d", d, matchedId, len); if (g_engine->_tagMap[targetVal - 1] == id) warning("searchTagMap(): Matched version %d", d); } warning("searchTagMap(): No match"); } int engineMain() { Common::ArchiveMemberList files; SearchMan.listMatchingMembers(files, "*.qml"); Common::ArchiveMemberPtr p = files.front(); Common::String firstFileName; std::string script_name; if (p) { firstFileName = p->getFileName(); script_name = firstFileName.c_str(); } if (script_name.empty()) { return 0; } grD = new grDispatcher(); #ifdef __QD_TRIGGER_PROFILER__ if (ConfMan.getBool("trigger_profiler")) qdTriggerProfiler::instance().enable(); #endif grD->HideMouse(); grD->ShowMouse(); // FIXME HACK qdGameConfig::get_config().load(); #ifdef __QD_TRIGGER_PROFILER__ if (qdGameConfig::get_config().is_profiler_enabled()) qdTriggerProfiler::instance().enable(); if (0 != strlen(qdGameConfig::get_config().profiler_file())) qdTriggerProfiler::instance().set_work_file(qdGameConfig::get_config().profiler_file()); #endif SplashScreen sp; if (qdGameConfig::get_config().is_splash_enabled()) { sp.create(IDB_SPLASH); sp.set_mask(IDB_SPLASH_MASK); sp.show(); } //searchTagMap(QDSCR_GAME_TITLE, 207); Common::String gameID = g_engine->getGameId(); if (gameID == "karliknos") { generateTagMap(20030919); // QDSCR_GAME_TITLE = 182 } else if (gameID == "nupogodi3") { generateTagMap(20031014); // QDSCR_TEXT_DB = 184 } else if (gameID == "pilots3") { generateTagMap(20040519); // QDSCR_GAME_TITLE = 203 } else if (gameID == "rybalka") { generateTagMap(20040601); // QDSCR_GAME_TITLE = 206 } else if (gameID == "pilots3d") { generateTagMap(20040601); // QDSCR_GAME_TITLE = 206 } else if (gameID == "pilots3d-2") { generateTagMap(20041201); // QDSCR_GAME_TITLE = 207 } else if (gameID == "mng") { generateTagMap(20050101); // QDSCR_GLOBAL_DEPEND = 214 } else if (gameID == "maski") { generateTagMap(20060129); // QDSCR_GAME_TITLE = 214 } else if (gameID == "3mice1") { generateTagMap(20060715); // QDSCR_SCREEN_TRANSFORM = 232 } else if (gameID == "shveik") { generateTagMap(20070503); // QDSCR_GAME_TITLE = 231, QDSCR_RESOURCE_COMPRESSION = 243 } else if (gameID == "klepa") { generateTagMap(20070503); // QDSCR_GAME_TITLE = 231, QDSCR_RESOURCE_COMPRESSION = 243 } else if (gameID == "3mice2") { generateTagMap(20070503); // QDSCR_RESOURCE_COMPRESSION = 243 } else if (gameID == "dogncat") { generateTagMap(20070503); // QDSCR_RESOURCE_COMPRESSION = 243 } else if (gameID == "dogncat2") { generateTagMap(20070503); // QDSCR_RESOURCE_COMPRESSION = 243 } else { warning("Unprocessed tagMap, switching to shveik"); generateTagMap(20070503); } #if 0 for (int i = 1; i < __argc; i++) { debugCN(3, kDebugLog, "'\' %s '\'", __argv[i]); } debugC(3, kDebugLog, ""); #endif grDispatcher::set_default_font(qdGameDispatcher::create_font(0)); qd_gameD = new qdGameDispatcher; qd_gameD->load_script(script_name.c_str()); if (ConfMan.getBool("dump_scripts")) { qd_gameD->save_script("qd_game.xml"); } qd_gameD->set_scene_loading_progress_callback(qd_show_load_progress); if (qdGameConfig::get_config().is_splash_enabled()) { sp.wait(qdGameConfig::get_config().splash_time()); sp.destroy(); } init_graphics(); sndDispatcher *sndD = new sndDispatcher; qdGameConfig::get_config().update_sound_settings(); qdGameConfig::get_config().update_music_settings(); winVideo::init(); qd_gameD->load_resources(); if (ConfMan.hasKey("boot_param")) { const char *scene_name = ""; // FIXME. Implement actual scene selection if (!qd_gameD->select_scene(scene_name)) error("Cannot find the startup scene"); } else { bool music_enabled = mpegPlayer::instance().is_enabled(); mpegPlayer::instance().disable(); qd_gameD->toggle_main_menu(true); if (!qd_gameD->start_intro_videos()) { if (music_enabled) mpegPlayer::instance().enable(true); } else { if (music_enabled) mpegPlayer::instance().enable(false); } } qd_gameD->update_time(); qd_gameD->quant(); ResourceDispatcher resD; resD.setTimer(qdGameConfig::get_config().logic_synchro_by_clock(), qdGameConfig::get_config().logic_period(), 300); resD.attach(new MemberFunctionCallResourceUser(*qd_gameD, &qdGameDispatcher::quant, qdGameConfig::get_config().logic_period())); sndD->set_frequency_coeff(qdGameConfig::get_config().game_speed()); resD.set_speed(qdGameConfig::get_config().game_speed()); resD.start(); bool exit_flag = false; bool was_inactive = false; // Activate the window grDispatcher::activate(true); Common::Event event; while (!exit_flag && !qd_gameD->need_exit()) { while (g_system->getEventManager()->pollEvent(event)) { switch (event.type) { case Common::EVENT_QUIT: if (!grDispatcher::instance()->is_in_reinit_mode()) exit_flag = true; break; case Common::EVENT_KEYDOWN: if (event.kbd.ascii == 'f') qdGameConfig::get_config().toggle_fps(); #ifdef __QD_DEBUG_ENABLE__ else if (event.kbd.keycode == Common::KEYCODE_PAGEDOWN) { float speed = qdGameConfig::get_config().game_speed() * 0.9f; if (speed < 0.1f) speed = 0.1f; qdGameConfig::get_config().set_game_speed(speed); sndD->set_frequency_coeff(speed); resD.set_speed(qdGameConfig::get_config().game_speed()); } else if (event.kbd.keycode == Common::KEYCODE_PAGEUP) { float speed = qdGameConfig::get_config().game_speed() * 1.1f; if (speed > 10.0f) speed = 10.0f; qdGameConfig::get_config().set_game_speed(speed); sndD->set_frequency_coeff(speed); resD.set_speed(qdGameConfig::get_config().game_speed()); } else if (event.kbd.keycode == Common::KEYCODE_HOME) { qdGameConfig::get_config().set_game_speed(1.0f); sndD->set_frequency_coeff(1.0f); resD.set_speed(qdGameConfig::get_config().game_speed()); } else if (event.kbd.ascii == 'g') qdGameConfig::get_config().toggle_show_grid(); #endif break; default: break; } input::keyboard_wndproc(event, keyboardDispatcher::instance()); input::mouse_wndproc(event, mouseDispatcher::instance()); } if (grDispatcher::instance()->is_mouse_hidden()) grDispatcher::instance()->set_null_mouse_cursor(); else grDispatcher::instance()->set_default_mouse_cursor(); if (grDispatcher::is_active()) { if (was_inactive) { was_inactive = false; // При активации ждем, чтобы звукововая система успела настроиться // на наше приложение (предположение) g_system->delayMillis(500); } resD.quant(); qd_gameD->redraw(); } else { was_inactive = true; g_system->delayMillis(100); resD.skip_time(); } g_system->updateScreen(); } delete qd_gameD; grDispatcher::instance()->Finit(); qdFileManager::instance().Finit(); delete sndD; delete grD; winVideo::done(); return 0; } namespace qdrt { void init_graphics() { grDispatcher::set_restore_handler(restore_graphics); grDispatcher::instance()->Finit(); grDispatcher::set_instance(grD); if (!init_graphics_dispatcher()) return; qdGameConfig::get_config().set_pixel_format(grDispatcher::instance()->pixel_format()); grDispatcher::instance()->SetClip(); grDispatcher::instance()->SetClipMode(1); grDispatcher::instance()->Fill(0); g_system->updateScreen(); grDispatcher::instance()->Flush(); } bool init_graphics_dispatcher() { grDispatcher::instance()->init(qdGameConfig::get_config().screen_sx(), qdGameConfig::get_config().screen_sy(), (grPixelFormat)qdGameConfig::get_config().pixel_format()); return true; } void qd_show_load_progress(int percents_loaded, void *p) { const int rect_sx = 200; const int rect_sy = 10; int sx = rect_sx * percents_loaded / 100; if (sx < 0) sx = 0; if (sx > rect_sx) sx = rect_sx; int x = 10; int y = grDispatcher::instance()->Get_SizeY() - rect_sy - 10; grDispatcher::instance()->Rectangle(x, y, rect_sx, rect_sy, 0xFFFFFF, 0, GR_OUTLINED); grDispatcher::instance()->Rectangle(x, y, sx, rect_sy, 0xFFFFFF, 0xFFFFFF, GR_FILLED); grDispatcher::instance()->Flush(x, y, rect_sx, rect_sy); } void restore_graphics() { if (sndDispatcher * dp = sndDispatcher::get_dispatcher()) dp->set_volume(dp->volume()); if (qdGameDispatcher * dp = qdGameDispatcher::get_dispatcher()) dp->set_flag(qdGameDispatcher::FULLSCREEN_REDRAW_FLAG); } void restore() { } }; // namespace main } // namespace QDEngine