/****** Boots and starts emulation ******/ void main_menu::boot_game() { //Check to see if the file actually exists QFile test_file(QString::fromStdString(config::rom_file)); if(!test_file.exists()) { std::string mesg_text = "The specified file: '" + config::rom_file + "' could not be loaded"; warning_box->setText(QString::fromStdString(mesg_text)); warning_box->show(); return; } config::sample_rate = settings->sample_rate; config::pause_emu = false; //Check OpenGL status if(settings->ogl->isChecked()) { config::use_opengl = true; sw_screen->setEnabled(false); sw_screen->hide(); hw_screen->setEnabled(true); hw_screen->show(); } else { config::use_opengl = false; sw_screen->setEnabled(true); sw_screen->show(); hw_screen->setEnabled(false); hw_screen->hide(); } //Check cheats status if(settings->cheats->isChecked()) { config::use_cheats = true; parse_cheats_file(); } else { config::use_cheats = false; } //Check multicart status if(settings->multicart->isChecked()) { config::use_multicart = true; } else { config::use_multicart = false; } //Check rumble status if(settings->rumble_on->isChecked()) { config::use_haptics = true; } else { config::use_haptics = false; } findChild<QAction*>("pause_action")->setChecked(false); menu_height = menu_bar->height(); //Determine Gameboy type based on file name //Note, DMG and GBC games are automatically detected in the Gameboy MMU, so only check for GBA types here std::size_t dot = config::rom_file.find_last_of("."); std::string ext = config::rom_file.substr(dot); config::gb_type = settings->sys_type->currentIndex(); if(ext == ".gba") { config::gb_type = 3; } else if((ext != ".gba") && (config::gb_type == 3)) { config::gb_type = 2; config::gba_enhance = true; } else { config::gba_enhance = false; } //Determine CGFX scaling factor cgfx::scaling_factor = (settings->cgfx_scale->currentIndex() + 1); if(!cgfx::load_cgfx) { cgfx::scaling_factor = 1; } //Start the appropiate system core - DMG/GBC or GBA if(config::gb_type == 3) { base_width = 240; base_height = 160; main_menu::gbe_plus = new AGB_core(); resize((base_width * config::scaling_factor), (base_height * config::scaling_factor) + menu_height); qt_gui::screen = new QImage(240, 160, QImage::Format_ARGB32); //Resize drawing screens if(config::use_opengl) { hw_screen->resize((base_width * config::scaling_factor), (base_height * config::scaling_factor)); } else { sw_screen->resize((base_width * config::scaling_factor), (base_height * config::scaling_factor)); } } else { base_width = (160 * cgfx::scaling_factor); base_height = (144 * cgfx::scaling_factor); main_menu::gbe_plus = new DMG_core(); resize((base_width * config::scaling_factor), (base_height * config::scaling_factor) + menu_height); //Resize drawing screens if(config::use_opengl) { hw_screen->resize((base_width * config::scaling_factor), (base_height * config::scaling_factor)); } else { sw_screen->resize((base_width * config::scaling_factor), (base_height * config::scaling_factor)); } if(qt_gui::screen != NULL) { delete qt_gui::screen; } qt_gui::screen = new QImage(base_width, base_height, QImage::Format_ARGB32); } //Read specified ROM file main_menu::gbe_plus->read_file(config::rom_file); //Read BIOS file optionally if(config::use_bios) { switch(config::gb_type) { case 0x1 : config::bios_file = config::dmg_bios_path; reset_dmg_colors(); break; case 0x2 : config::bios_file = config::gbc_bios_path; reset_dmg_colors(); break; case 0x3 : config::bios_file = config::agb_bios_path; break; } if(!main_menu::gbe_plus->read_bios(config::bios_file)) { return; } } //Reset GUI debugger dmg_debugger->debug_reset = true; //If the fullscreen command-line argument was passed, be sure to boot into fullscreen mode if(config::flags & 0x80000000) { findChild<QAction*>("fullscreen_action")->setChecked(true); config::flags &= ~0x80000000; fullscreen(); } //Engage the core main_menu::gbe_plus->start(); main_menu::gbe_plus->db_unit.debug_mode = config::use_debugger; if(main_menu::gbe_plus->db_unit.debug_mode) { SDL_CloseAudio(); } //Actually run the core main_menu::gbe_plus->run_core(); }
int main(int argc, char* args[]) { std::cout<<"GBE+ 1.3 [SDL]\n"; core_emu* gbe_plus = NULL; //Start SDL from the main thread now, report specific init errors later in the core SDL_Init(SDL_INIT_VIDEO); //Grab command-line arguments for(int x = 0; x++ < argc - 1;) { std::string temp_arg = args[x]; config::cli_args.push_back(temp_arg); parse_filenames(); } //Parse .ini options parse_ini_file(); //Load OSD font load_osd_font(); //Parse cheat file if(config::use_cheats) { parse_cheats_file(false); } if(config::mute) { config::volume = 0; } //Parse command-line arguments //These will override .ini options! if(!parse_cli_args()) { return 0; } //Get emulated system type from file config::gb_type = get_system_type_from_file(config::rom_file); //GBA core if(config::gb_type == 3) { gbe_plus = new AGB_core(); } //DMG-GBC core else if((config::gb_type >= 0) && (config::gb_type <= 2)) { gbe_plus = new DMG_core(); } //Super Game Boy (SGB1 and SGB2) else if((config::gb_type == 5) || (config::gb_type == 6)) { gbe_plus = new SGB_core(); } //NDS core else { gbe_plus = new NTR_core(); } //Read BIOS file optionally if(config::use_bios) { //If no bios file was passed from the command-line arguments, defer to .ini options if(config::bios_file == "") { switch(config::gb_type) { case 0x1 : config::bios_file = config::dmg_bios_path; break; case 0x2 : config::bios_file = config::gbc_bios_path; break; case 0x3 : config::bios_file = config::agb_bios_path; break; } } if(!gbe_plus->read_bios(config::bios_file)) { return 0; } } //Read specified ROM file if(!gbe_plus->read_file(config::rom_file)) { return 0; } //Read firmware optionally (NDS) if((config::use_firmware) && (config::gb_type == 4)) { if(!gbe_plus->read_firmware(config::nds_firmware_path)) { return 0; } } //Engage the core gbe_plus->start(); gbe_plus->db_unit.debug_mode = config::use_debugger; if(gbe_plus->db_unit.debug_mode) { SDL_CloseAudio(); } //Disbale mouse cursor in SDL, it's annoying SDL_ShowCursor(SDL_DISABLE); //Actually run the core gbe_plus->run_core(); return 0; }
/****** Main menu constructor ******/ main_menu::main_menu(QWidget *parent) : QWidget(parent) { //Setup actions QAction* open = new QAction("Open", this); QAction* quit = new QAction ("Quit", this); QAction* pause = new QAction("Pause", this); QAction* reset = new QAction("Reset", this); QAction* fullscreen = new QAction("Fullscreen", this); QAction* screenshot = new QAction("Screenshot", this); QAction* nplay_start = new QAction("Start Netplay", this); QAction* nplay_stop = new QAction("Stop Netplay", this); QAction* general = new QAction("General Settings...", this); QAction* display = new QAction("Display", this); QAction* sound = new QAction("Sound", this); QAction* controls = new QAction("Controls", this); QAction* netplay = new QAction("Netplay", this); QAction* paths = new QAction("Paths", this); QAction* custom_gfx = new QAction("Custom Graphics...", this); QAction* debugging = new QAction("Debugger", this); QAction* about = new QAction("About", this); //Set shortcuts for actions open->setShortcut(tr("CTRL+O")); quit->setShortcut(tr("CTRL+Q")); pause->setShortcut(tr("CTRL+P")); reset->setShortcut(tr("F8")); fullscreen->setShortcut(tr("F12")); screenshot->setShortcut(tr("F9")); nplay_start->setShortcut(tr("F5")); nplay_stop->setShortcut(tr("F6")); pause->setCheckable(true); pause->setObjectName("pause_action"); fullscreen->setCheckable(true); fullscreen->setObjectName("fullscreen_action"); menu_bar = new QMenuBar(this); //Setup File menu QMenu* file; file = new QMenu(tr("File"), this); file->addAction(open); recent_list = file->addMenu(tr("Recent Files")); file->addSeparator(); state_save_list = file->addMenu(tr("Save State")); state_load_list = file->addMenu(tr("Load State")); file->addSeparator(); file->addAction(quit); menu_bar->addMenu(file); //Setup Emulation menu QMenu* emulation; emulation = new QMenu(tr("Emulation"), this); emulation->addAction(pause); emulation->addAction(reset); emulation->addSeparator(); emulation->addAction(fullscreen); emulation->addAction(screenshot); emulation->addSeparator(); emulation->addAction(nplay_start); emulation->addAction(nplay_stop); menu_bar->addMenu(emulation); //Setup Options menu QMenu* options; options = new QMenu(tr("Options"), this); options->addAction(general); options->addSeparator(); options->addAction(display); options->addAction(sound); options->addAction(controls); options->addAction(netplay); options->addAction(paths); menu_bar->addMenu(options); //Advanced menu QMenu* advanced; advanced = new QMenu(tr("Advanced"), this); advanced->addAction(custom_gfx); advanced->addAction(debugging); menu_bar->addMenu(advanced); //Setup Help menu QMenu* help; help = new QMenu(tr("Help"), this); help->addAction(about); menu_bar->addMenu(help); //Setup signals connect(quit, SIGNAL(triggered()), this, SLOT(quit())); connect(open, SIGNAL(triggered()), this, SLOT(open_file())); connect(pause, SIGNAL(triggered()), this, SLOT(pause())); connect(fullscreen, SIGNAL(triggered()), this, SLOT(fullscreen())); connect(screenshot, SIGNAL(triggered()), this, SLOT(screenshot())); connect(nplay_start, SIGNAL(triggered()), this, SLOT(start_netplay())); connect(nplay_stop, SIGNAL(triggered()), this, SLOT(stop_netplay())); connect(reset, SIGNAL(triggered()), this, SLOT(reset())); connect(general, SIGNAL(triggered()), this, SLOT(show_settings())); connect(display, SIGNAL(triggered()), this, SLOT(show_display_settings())); connect(sound, SIGNAL(triggered()), this, SLOT(show_sound_settings())); connect(controls, SIGNAL(triggered()), this, SLOT(show_control_settings())); connect(netplay, SIGNAL(triggered()), this, SLOT(show_netplay_settings())); connect(paths, SIGNAL(triggered()), this, SLOT(show_paths_settings())); connect(custom_gfx, SIGNAL(triggered()), this, SLOT(show_cgfx())); connect(debugging, SIGNAL(triggered()), this, SLOT(show_debugger())); connect(about, SIGNAL(triggered()), this, SLOT(show_about())); sw_screen = new soft_screen(); hw_screen = new hard_screen(); QVBoxLayout* layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, -1); layout->addWidget(sw_screen); layout->addWidget(hw_screen); layout->setMenuBar(menu_bar); setLayout(layout); config::scaling_factor = 2; hw_screen->hide(); hw_screen->setEnabled(false); //Parse .ini options parse_ini_file(); //Parse cheats file if(config::use_cheats) { parse_cheats_file(); } //Parse command-line arguments //These will override .ini options! if(!parse_cli_args()) { exit(0); } //Some command-line arguments are invalid for the Qt version config::use_debugger = false; //Setup Recent Files list_mapper = new QSignalMapper(this); for(int x = (config::recent_files.size() - 1); x >= 0; x--) { QString path = QString::fromStdString(config::recent_files[x]); QFileInfo file(path); path = file.fileName(); QAction* temp = new QAction(path, this); recent_list->addAction(temp); connect(temp, SIGNAL(triggered()), list_mapper, SLOT(map())); list_mapper->setMapping(temp, x); } connect(list_mapper, SIGNAL(mapped(int)), this, SLOT(load_recent(int))); //Setup Save States QSignalMapper* save_mapper = new QSignalMapper(this); for(int x = 0; x < 10; x++) { QAction* temp; if(x == 0) { temp = new QAction(tr("Quick Save"), this); temp->setShortcut(tr("F1")); } else { std::string slot_id = "Slot " + util::to_str(x); QString slot_name = QString::fromStdString(slot_id); temp = new QAction(slot_name, this); } state_save_list->addAction(temp); connect(temp, SIGNAL(triggered()), save_mapper, SLOT(map())); save_mapper->setMapping(temp, x); } connect(save_mapper, SIGNAL(mapped(int)), this, SLOT(save_state(int))); //Setup Load States QSignalMapper* load_mapper = new QSignalMapper(this); for(int x = 0; x < 10; x++) { QAction* temp; if(x == 0) { temp = new QAction(tr("Quick Load"), this); temp->setShortcut(tr("F2")); } else { std::string slot_id = "Slot " + util::to_str(x); QString slot_name = QString::fromStdString(slot_id); temp = new QAction(slot_name, this); } state_load_list->addAction(temp); connect(temp, SIGNAL(triggered()), load_mapper, SLOT(map())); load_mapper->setMapping(temp, x); } connect(load_mapper, SIGNAL(mapped(int)), this, SLOT(load_state(int))); //Set up settings dialog settings = new gen_settings(); settings->set_ini_options(); //Set up custom graphics dialog cgfx = new gbe_cgfx(); cgfx->hide(); cgfx->advanced->setChecked(true); //Set up DMG-GBC debugger main_menu::dmg_debugger = new dmg_debug(); main_menu::dmg_debugger->hide(); //Setup About pop-up about_box = new QWidget(); about_box->resize(300, 250); about_box->setWindowTitle("About GBE+"); QDialogButtonBox* about_button = new QDialogButtonBox(QDialogButtonBox::Close); connect(about_button->button(QDialogButtonBox::Close), SIGNAL(clicked()), about_box, SLOT(close())); QLabel* emu_title = new QLabel("GBE+ 1.0"); QFont font = emu_title->font(); font.setPointSize(18); font.setBold(true); emu_title->setFont(font); QImage logo(QString::fromStdString(config::cfg_path + "data/icons/gbe_plus.png")); logo = logo.scaled(128, 128); QLabel* emu_desc = new QLabel("A GB/GBC/GBA emulator with enhancements"); QLabel* emu_copyright = new QLabel("Copyright D.S. Baxter 2014-2016"); QLabel* emu_proj_copyright = new QLabel("Copyright GBE+ Team 2014-2016"); QLabel* emu_license = new QLabel("This program is licensed under the GNU GPLv2"); QLabel* emu_site = new QLabel("<a href=\"https://github.com/shonumi/gbe-plus/\">GBE+ on GitHub</a>"); emu_site->setOpenExternalLinks(true); QLabel* emu_logo = new QLabel; emu_logo->setPixmap(QPixmap::fromImage(logo)); QVBoxLayout* about_layout = new QVBoxLayout; about_layout->addWidget(emu_title, 0, Qt::AlignCenter | Qt::AlignTop); about_layout->addWidget(emu_desc, 0, Qt::AlignCenter | Qt::AlignTop); about_layout->addWidget(emu_copyright, 0, Qt::AlignCenter | Qt::AlignTop); about_layout->addWidget(emu_proj_copyright, 0, Qt::AlignCenter | Qt::AlignTop); about_layout->addWidget(emu_license, 0, Qt::AlignCenter | Qt::AlignTop); about_layout->addWidget(emu_site, 0, Qt::AlignCenter | Qt::AlignTop); about_layout->addWidget(emu_logo, 0, Qt::AlignCenter | Qt::AlignTop); about_layout->addWidget(about_button); about_box->setLayout(about_layout); about_box->setWindowIcon(QIcon(QString::fromStdString(config::cfg_path + "data/icons/gbe_plus.png"))); about_box->hide(); //Setup warning message box warning_box = new QMessageBox; QPushButton* warning_box_ok = warning_box->addButton("OK", QMessageBox::AcceptRole); warning_box->setIcon(QMessageBox::Warning); warning_box->hide(); display_width = QApplication::desktop()->screenGeometry().width(); display_height = QApplication::desktop()->screenGeometry().height(); fullscreen_mode = false; }