int ModApiMainMenu::l_create_world(lua_State *L) { GUIEngine* engine = getGuiEngine(L); assert(engine != 0); const char *name = luaL_checkstring(L, 1); int gameidx = luaL_checkinteger(L,2) -1; std::string path = porting::path_user + DIR_DELIM "worlds" + DIR_DELIM + name; std::vector<SubgameSpec> games = getAvailableGames(); if ((gameidx >= 0) && (gameidx < (int) games.size())) { // Create world if it doesn't exist if(!initializeWorld(path, games[gameidx].id)){ lua_pushstring(L, "Failed to initialize world"); } else { lua_pushnil(L); } } else { lua_pushstring(L, "Invalid game index"); } return 1; }
int ModApiMainMenu::l_get_games(lua_State *L) { GUIEngine* engine = getGuiEngine(L); assert(engine != 0); std::vector<SubgameSpec> games = getAvailableGames(); lua_newtable(L); int top = lua_gettop(L); unsigned int index = 1; for (unsigned int i = 0; i < games.size(); i++) { lua_pushnumber(L,index); lua_newtable(L); int top_lvl2 = lua_gettop(L); lua_pushstring(L,"id"); lua_pushstring(L,games[i].id.c_str()); lua_settable(L, top_lvl2); lua_pushstring(L,"path"); lua_pushstring(L,games[i].path.c_str()); lua_settable(L, top_lvl2); lua_pushstring(L,"gamemods_path"); lua_pushstring(L,games[i].gamemods_path.c_str()); lua_settable(L, top_lvl2); lua_pushstring(L,"name"); lua_pushstring(L,games[i].name.c_str()); lua_settable(L, top_lvl2); lua_pushstring(L,"menuicon_path"); lua_pushstring(L,games[i].menuicon_path.c_str()); lua_settable(L, top_lvl2); lua_pushstring(L,"addon_mods_paths"); lua_newtable(L); int table2 = lua_gettop(L); int internal_index=1; for (std::set<std::string>::iterator iter = games[i].addon_mods_paths.begin(); iter != games[i].addon_mods_paths.end(); iter++) { lua_pushnumber(L,internal_index); lua_pushstring(L,(*iter).c_str()); lua_settable(L, table2); internal_index++; } lua_settable(L, top_lvl2); lua_settable(L, top); index++; } return 1; }
bool GUIMainMenu::OnEvent(const SEvent& event) { if(event.EventType==EET_KEY_INPUT_EVENT) { if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown) { m_gamecallback->exitToOS(); quitMenu(); return true; } if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown) { acceptInput(); quitMenu(); return true; } } if(event.EventType==EET_GUI_EVENT) { if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST && isVisible()) { if(!canTakeFocus(event.GUIEvent.Element)) { dstream<<"GUIMainMenu: Not allowing focus change." <<std::endl; // Returning true disables focus change return true; } } if(event.GUIEvent.EventType==gui::EGET_TAB_CHANGED) { if(!m_is_regenerating) regenerateGui(m_screensize_old); return true; } if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED) { switch(event.GUIEvent.Caller->getID()) { case GUI_ID_JOIN_GAME_BUTTON: { MainMenuData cur; readInput(&cur); if(cur.address == L"" && getTab() == TAB_MULTIPLAYER){ (new GUIMessageMenu(env, parent, -1, menumgr, wgettext("Address required.")) )->drop(); return true; } acceptInput(); quitMenu(); return true; } case GUI_ID_CHANGE_KEYS_BUTTON: { GUIKeyChangeMenu *kmenu = new GUIKeyChangeMenu(env, parent, -1,menumgr); kmenu->drop(); return true; } case GUI_ID_DELETE_WORLD_BUTTON: { MainMenuData cur; readInput(&cur); if(cur.selected_world == -1){ (new GUIMessageMenu(env, parent, -1, menumgr, wgettext("Cannot delete world: Nothing selected")) )->drop(); } else { WorldSpec spec = m_data->worlds[cur.selected_world]; ConfirmDestDeleteWorld *dest = new ConfirmDestDeleteWorld(spec, this); (new GUIConfirmMenu(env, parent, -1, menumgr, dest, (std::wstring(wgettext("Delete world ")) +L"\""+narrow_to_wide(spec.name)+L"\"?").c_str() ))->drop(); } return true; } case GUI_ID_CREATE_WORLD_BUTTON: { std::vector<SubgameSpec> games = getAvailableGames(); if(games.size() == 0){ GUIMessageMenu *menu = new GUIMessageMenu(env, parent, -1, menumgr, wgettext("Cannot create world: No games found")); menu->drop(); } else { CreateWorldDest *dest = new CreateWorldDestMainMenu(this); GUICreateWorld *menu = new GUICreateWorld(env, parent, -1, menumgr, dest, games); menu->drop(); } return true; } case GUI_ID_CONFIGURE_WORLD_BUTTON: { GUIMessageMenu *menu = new GUIMessageMenu(env, parent, -1, menumgr, wgettext("Nothing here")); menu->drop(); return true; } } } if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER) { switch(event.GUIEvent.Caller->getID()) { case GUI_ID_ADDRESS_INPUT: case GUI_ID_PORT_INPUT: case GUI_ID_NAME_INPUT: case 264: acceptInput(); quitMenu(); return true; } } if(event.GUIEvent.EventType==gui::EGET_LISTBOX_SELECTED_AGAIN) { switch(event.GUIEvent.Caller->getID()) { case GUI_ID_WORLD_LISTBOX: acceptInput(); if(getTab() != TAB_SINGLEPLAYER) m_data->address = L""; // Force local game quitMenu(); return true; } } } return Parent ? Parent->OnEvent(event) : false; }