diff options
Diffstat (limited to 'src/frontend/mame/mame.cpp')
-rw-r--r-- | src/frontend/mame/mame.cpp | 129 |
1 files changed, 95 insertions, 34 deletions
diff --git a/src/frontend/mame/mame.cpp b/src/frontend/mame/mame.cpp index b996bae1dc0..a44bd19814f 100644 --- a/src/frontend/mame/mame.cpp +++ b/src/frontend/mame/mame.cpp @@ -19,11 +19,14 @@ #include "cheat.h" #include "clifront.h" #include "emuopts.h" +#include "fileio.h" #include "luaengine.h" #include "mameopts.h" #include "pluginopts.h" +#include "rendlay.h" #include "validity.h" +#include "corestr.h" #include "xmlfile.h" #include "osdepend.h" @@ -71,6 +74,7 @@ mame_machine_manager::mame_machine_manager(emu_options &options,osd_interface &o mame_machine_manager::~mame_machine_manager() { + m_autoboot_script.reset(); m_lua.reset(); s_manager = nullptr; } @@ -139,10 +143,7 @@ void mame_machine_manager::start_luaengine() std::string pluginpath; while (iter.next(pluginpath)) { - // user may specify environment variables; subsitute them - osd_subst_env(pluginpath, pluginpath); - - // and then scan the directory recursively + // scan the directory recursively m_plugins->scan_directory(pluginpath, true); } @@ -150,7 +151,7 @@ void mame_machine_manager::start_luaengine() // parse the file // attempt to open the output file emu_file file(options().ini_path(), OPEN_FLAG_READ); - if (file.open("plugin.ini") == osd_file::error::NONE) + if (!file.open("plugin.ini")) { try { @@ -166,18 +167,18 @@ void mame_machine_manager::start_luaengine() // process includes for (const std::string &incl : split(options().plugin(), ',')) { - plugin *p = m_plugins->find(incl); + plugin_options::plugin *p = m_plugins->find(incl); if (!p) - fatalerror("Fatal error: Could not load plugin: %s\n", incl.c_str()); + fatalerror("Fatal error: Could not load plugin: %s\n", incl); p->m_start = true; } // process excludes for (const std::string &excl : split(options().no_plugin(), ',')) { - plugin *p = m_plugins->find(excl); + plugin_options::plugin *p = m_plugins->find(excl); if (!p) - fatalerror("Fatal error: Unknown plugin: %s\n", excl.c_str()); + fatalerror("Fatal error: Unknown plugin: %s\n", excl); p->m_start = false; } } @@ -185,7 +186,7 @@ void mame_machine_manager::start_luaengine() // we have a special way to open the console plugin if (options().console()) { - plugin *p = m_plugins->find(OPTION_CONSOLE); + plugin_options::plugin *p = m_plugins->find(OPTION_CONSOLE); if (!p) fatalerror("Fatal error: Console plugin not found.\n"); @@ -196,12 +197,32 @@ void mame_machine_manager::start_luaengine() { emu_file file(options().plugins_path(), OPEN_FLAG_READ); - osd_file::error filerr = file.open("boot.lua"); - if (filerr == osd_file::error::NONE) + std::error_condition const filerr = file.open("boot.lua"); + if (!filerr) { - std::string exppath; - osd_subst_env(exppath, std::string(file.fullpath())); - m_lua->load_script(exppath.c_str()); + const std::string exppath = file.fullpath(); + auto &l(*lua()); + auto load_result = l.load_script(exppath); + if (!load_result.valid()) + { + sol::error err = load_result; + sol::load_status status = load_result.status(); + fatalerror("Error plugin bootstrap script %s: %s error\n%s\n", + exppath, + sol::to_string(status), + err.what()); + } + sol::protected_function func = load_result; + sol::protected_function_result call_result = l.invoke(func); + if (!call_result.valid()) + { + sol::error err = call_result; + sol::call_status status = call_result.status(); + fatalerror("Error running plugin bootstrap script %s: %s error\n%s\n", + options().autoboot_script(), + sol::to_string(status), + err.what()); + } } } } @@ -243,7 +264,7 @@ int mame_machine_manager::execute() m_options.revert(OPTION_PRIORITY_INI); std::ostringstream errors; - mame_options::parse_standard_inis(m_options, errors); + mame_options::parse_standard_inis(m_options, errors, system); } // otherwise, perform validity checks before anything else @@ -277,7 +298,10 @@ int mame_machine_manager::execute() else { if (machine.exit_pending()) + { m_options.set_system_name(""); + m_options.set_value(OPTION_BIOS, "", OPTION_PRIORITY_CMDLINE); + } } if (machine.exit_pending() && (!started_empty || is_empty)) @@ -292,21 +316,35 @@ int mame_machine_manager::execute() TIMER_CALLBACK_MEMBER(mame_machine_manager::autoboot_callback) { - if (strlen(options().autoboot_script())!=0) { - mame_machine_manager::instance()->lua()->load_script(options().autoboot_script()); + if (*options().autoboot_script()) + { + assert(m_autoboot_script); + sol::protected_function func = *m_autoboot_script; + sol::protected_function_result result = lua()->invoke(func); + if (!result.valid()) + { + sol::error err = result; + sol::call_status status = result.status(); + fatalerror("Error running autoboot script %s: %s error\n%s\n", + options().autoboot_script(), + sol::to_string(status), + err.what()); + } } - else if (strlen(options().autoboot_command())!=0) { - std::string cmd = std::string(options().autoboot_command()); + else if (*options().autoboot_command()) + { + std::string cmd(options().autoboot_command()); strreplace(cmd, "'", "\\'"); std::string val = std::string("emu.keypost('").append(cmd).append("')"); - mame_machine_manager::instance()->lua()->load_string(val.c_str()); + auto &l(*lua()); + l.invoke(l.load_string(val).get<sol::protected_function>()); } } void mame_machine_manager::reset() { // setup autoboot if needed - m_autoboot_timer->adjust(attotime(options().autoboot_delay(),0),0); + m_autoboot_timer->adjust(attotime(options().autoboot_delay(), 0), 0); } ui_manager* mame_machine_manager::create_ui(running_machine& machine) @@ -316,8 +354,6 @@ ui_manager* mame_machine_manager::create_ui(running_machine& machine) machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(&mame_machine_manager::reset, this)); - m_ui->set_startup_text("Initializing...", true); - return m_ui.get(); } @@ -334,7 +370,7 @@ void mame_machine_manager::before_load_settings(running_machine& machine) m_lua->on_machine_before_load_settings(); } -void mame_machine_manager::create_custom(running_machine& machine) +void mame_machine_manager::create_custom(running_machine &machine) { // start the inifile manager m_inifile = std::make_unique<inifile_manager>(m_ui->options()); @@ -344,6 +380,25 @@ void mame_machine_manager::create_custom(running_machine& machine) // start favorite manager m_favorite = std::make_unique<favorite_manager>(m_ui->options()); + + // attempt to load the autoboot script if configured + m_autoboot_script.reset(); + if (*options().autoboot_script()) + { + auto result = lua()->load_script(options().autoboot_script()); + if (!result.valid()) + { + sol::error err = result; + sol::load_status status = result.status(); + fatalerror("Error loading autoboot script %s: %s error\n%s\n", + options().autoboot_script(), + sol::to_string(status), + err.what()); + } + m_autoboot_script.reset(new sol::load_result(std::move(result))); + sol::protected_function func = *m_autoboot_script; + sol::set_environment(lua()->make_environment(), func); + } } void mame_machine_manager::load_cheatfiles(running_machine& machine) @@ -363,7 +418,7 @@ std::vector<std::reference_wrapper<const std::string>> mame_machine_manager::mis assert(m_machine); // make sure that any required image has a mounted file - for (device_image_interface &image : image_interface_iterator(m_machine->root_device())) + for (device_image_interface &image : image_interface_enumerator(m_machine->root_device())) { if (image.must_be_loaded()) { @@ -404,9 +459,9 @@ int emulator_info::start_frontend(emu_options &options, osd_interface &osd, int return start_frontend(options, osd, args); } -void emulator_info::draw_user_interface(running_machine& machine) +bool emulator_info::draw_user_interface(running_machine& machine) { - mame_machine_manager::instance()->ui().update_and_render(machine.render().ui_container()); + return mame_machine_manager::instance()->ui().update_and_render(machine.render().ui_container()); } void emulator_info::periodic_check() @@ -424,14 +479,20 @@ void emulator_info::sound_hook() return mame_machine_manager::instance()->lua()->on_sound_update(); } -void emulator_info::layout_file_cb(util::xml::data_node const &layout) +void emulator_info::layout_script_cb(layout_file &file, const char *script) { - util::xml::data_node const *const mamelayout = layout.get_child("mamelayout"); - if (mamelayout) + // TODO: come up with a better way to pass multiple arguments to plugin + //mame_machine_manager::instance()->lua()->call_plugin_set("layout", std::make_tuple(&file, script->get_value())); + auto &lua(mame_machine_manager::instance()->lua()->sol()); + sol::object obj = lua.registry()["cb_layout"]; + if (obj.is<sol::protected_function>()) { - util::xml::data_node const *const script = mamelayout->get_child("script"); - if (script) - mame_machine_manager::instance()->lua()->call_plugin_set("layout", script->get_value()); + auto res = obj.as<sol::protected_function>()(sol::make_reference(lua, &file), sol::make_reference(lua, script)); + if (!res.valid()) + { + sol::error err = res; + osd_printf_error("[LUA ERROR] in call_plugin: %s\n", err.what()); + } } } |