#include "stdafx.h" #include "UI.h" #include "UIScene_MiniGamesMenu.h" #include "..\..\MinecraftServer.h" #include "..\Network\SessionInfo.h" //#include //#include bool LoadPngFile(const wchar_t* path, PBYTE& data, DWORD& size) { HANDLE h = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (h == INVALID_HANDLE_VALUE) return false; size = GetFileSize(h, NULL); data = new BYTE[size]; DWORD read = 0; ReadFile(h, data, size, &read, NULL); CloseHandle(h); return read == size; } #define JOIN_LOAD_ONLINE_TIMER_ID 0 #define JOIN_LOAD_ONLINE_TIMER_TIME 100 UIScene_MiniGamesMenu::UIScene_MiniGamesMenu(int iPad, void* initData, UILayer* parentLayer) : UIScene(iPad, parentLayer) { initialiseMovie(); app.SetLiveLinkRequired(true); m_buttonListSaves.init(eControl_SavesList); m_buttonListGames.init(eControl_GamesList); m_labelSavesListTitle.init(IDS_MINIGAMES); // ← change string ID if you have a better one /*m_labelJoinListTitle.init(IDS_JOIN_GAME); m_labelNoGames.init(IDS_NO_GAMES_FOUND); m_labelNoGames.setVisible(false);*/ m_controlSavesTimer.setVisible(false); // no save loading m_controlJoinTimer.setVisible(true); m_bIgnoreInput = false; m_bInParty = false; m_bShowingPartyGamesOnly = false; m_currentSessions = NULL; m_bMultiplayerAllowed = ProfileManager.IsSignedInLive(m_iPad) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); Initialise(); UpdateGamesList(); g_NetworkManager.SetSessionsUpdatedCallback(&UpdateGamesListCallback, this); m_initData = new JoinMenuInitData(); MinecraftServer::resetFlags(); } UIScene_MiniGamesMenu::~UIScene_MiniGamesMenu() { g_NetworkManager.SetSessionsUpdatedCallback(NULL, NULL); app.SetLiveLinkRequired(false); if (m_currentSessions) { for (auto& it : *m_currentSessions) delete it; delete m_currentSessions; } if (m_initData) delete m_initData; } void UIScene_MiniGamesMenu::updateTooltips() { int iY = -1, iLB = -1; if (DoesGamesListHaveFocus() && m_buttonListGames.getItemCount() > 0) iY = IDS_TOOLTIPS_VIEW_GAMERCARD; if (m_bInParty) iLB = m_bShowingPartyGamesOnly ? IDS_TOOLTIPS_ALL_GAMES : IDS_TOOLTIPS_PARTY_GAMES; ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, iY, -1, -1, iLB, -1); } void UIScene_MiniGamesMenu::updateComponents() { m_parentLayer->showComponent(m_iPad, eUIComponent_Panorama, true); m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, true); } void UIScene_MiniGamesMenu::handleDestroy() { #if defined(__PS3__) || defined(__ORBIS__) || defined(_DURANGO) InputManager.DestroyKeyboard(); #endif } void UIScene_MiniGamesMenu::handleGainFocus(bool navBack) { UIScene::handleGainFocus(navBack); updateTooltips(); addTimer(JOIN_LOAD_ONLINE_TIMER_ID, JOIN_LOAD_ONLINE_TIMER_TIME); if (navBack) { m_bMultiplayerAllowed = ProfileManager.IsSignedInLive(m_iPad) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); m_bIgnoreInput = false; } } void UIScene_MiniGamesMenu::handleLoseFocus() { killTimer(JOIN_LOAD_ONLINE_TIMER_ID); } wstring UIScene_MiniGamesMenu::getMoviePath() { return L"LoadOrJoinMenu"; // ← change to L"LoadOrJoinMenu" if you want to reuse the old Iggy file } void UIScene_MiniGamesMenu::tick() { UIScene::tick(); // only online list logic remains } void UIScene_MiniGamesMenu::Initialise() { m_iDefaultButtonsC = 0; AddDefaultButtons(); m_bIgnoreInput = false; } void UIScene_MiniGamesMenu::AddDefaultButtons() { m_iDefaultButtonsC = 0; m_generators.clear(); //Minecraft* pMinecraft = Minecraft::GetInstance(); //TexturePack* tp = pMinecraft->skins->getTexturePackByIndex(0); //DWORD dwImageBytes; //PBYTE pbImageData = tp->getPackIcon(dwImageBytes); //registerSubstitutionTexture(L"iconGYAT", pbImageData, dwImageBytes); // //// Create New Mini Game (exactly like the old "Create New World") //m_buttonListSaves.addItem(L"Battle", L"iconGYAT"); //m_iDefaultButtonsC++; //m_buttonListSaves.addItem(L"Tumble", L"iconGYAT"); //m_iDefaultButtonsC++; //m_buttonListSaves.addItem(L"Glide", L"iconGYAT"); //m_iDefaultButtonsC++; PBYTE data = nullptr; DWORD size = 0; if (LoadPngFile(L"D:/Assets/Battle.png", data, size)) { registerSubstitutionTexture(L"mini_battle", data, size); m_buttonListSaves.addItem(L"Battle", L"mini_battle"); m_iDefaultButtonsC++; delete[] data; } if (LoadPngFile(L"D:/Assets/Tumble.png", data, size)) { registerSubstitutionTexture(L"mini_tumble", data, size); m_buttonListSaves.addItem(L"Tumble", L"mini_tumble"); m_iDefaultButtonsC++; delete[] data; } if (LoadPngFile(L"D:/Assets/Glide.png", data, size)) { registerSubstitutionTexture(L"mini_glide", data, size); m_buttonListSaves.addItem(L"Glide", L"mini_glide"); m_iDefaultButtonsC++; delete[] data; } // Pre-made mini-game templates (same system Legacy Console used for mash-ups) for (LevelGenerationOptions* levelGen : *app.getLevelGenerators()) { //if (levelGen->isMiniGame()) // you can add this flag or filter however you like //{ // m_buttonListSaves.addItem(levelGen->getWorldName()); // m_generators.push_back(levelGen); // m_iDefaultButtonsC++; //} } } void UIScene_MiniGamesMenu::UpdateGamesList() { /*if (m_currentSessions) { for (auto& it : *m_currentSessions) delete it; delete m_currentSessions; } m_currentSessions = g_NetworkManager.GetCurrentSessions(); m_buttonListGames.clearList(); if (m_currentSessions && !m_currentSessions->empty()) { m_controlJoinTimer.setVisible(false); m_labelNoGames.setVisible(false); for (auto* pInfo : *m_currentSessions) m_buttonListGames.addItem(pInfo->sessionName, L""); } else { m_controlJoinTimer.setVisible(true); m_labelNoGames.setVisible(true); }*/ } void UIScene_MiniGamesMenu::UpdateGamesListCallback(LPVOID pParam) { if (pParam) ((UIScene_MiniGamesMenu*)pParam)->UpdateGamesList(); } void UIScene_MiniGamesMenu::CheckAndJoinGame(int gameIndex) { if (gameIndex < 0 || !m_currentSessions || gameIndex >= (int)m_currentSessions->size()) return; //ui.NavigateToScene(m_iPad, eUIScene_JoiningGame, m_currentSessions->at(gameIndex)); // adjust scene if needed } void UIScene_MiniGamesMenu::LoadLevelGen(LevelGenerationOptions* levelGen) { // same logic you already had in the original class // (just call whatever you used before for mash-ups / templates) } void UIScene_MiniGamesMenu::handlePress(F64 controlId, F64 childId) { if (controlId == eControl_SavesList) { if (childId == CREATE_BUTTON_INDEX) { // Create new mini game world (you can navigate to the create-world scene with mini-game preset) //ui.NavigateToScene(m_iPad, eUIScene_CreateWorld, /* mini-game init data */ nullptr); } else if (childId < m_iDefaultButtonsC) { switch ((int)childId) { case 0: // Battle ui.NavigateToScene(m_iPad, eUIScene_CreateBattleMenu, nullptr); //navigates to the battle minigame creation world break; case 1: // Tumble ui.NavigateToScene(m_iPad, eUIScene_CreateBattleMenu, nullptr); // gonna replace this with tumble but not now break; case 2: // Glide ui.NavigateToScene(m_iPad, eUIScene_CreateBattleMenu, nullptr); //should i even explain? break; } } } else if (controlId == eControl_GamesList) { CheckAndJoinGame((int)childId); } } void UIScene_MiniGamesMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool& handled) { if (m_bIgnoreInput) return; ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); switch (key) { case ACTION_MENU_CANCEL: if (pressed) { navigateBack(); handled = true; } break; case ACTION_MENU_OK: case ACTION_MENU_UP: case ACTION_MENU_DOWN: case ACTION_MENU_PAGEUP: case ACTION_MENU_PAGEDOWN: sendInputToMovie(key, repeat, pressed, released); handled = true; break; case ACTION_MENU_LEFT: case ACTION_MENU_RIGHT: sendInputToMovie(key, repeat, pressed, released); break; case ACTION_MENU_Y: // optional: view invites (kept because it was in legacy) if (pressed && iPad == ProfileManager.GetPrimaryPad()) m_eAction = eAction_ViewInvites; break; } } void UIScene_MiniGamesMenu::handleFocusChange(F64 controlId, F64 childId) { updateTooltips(); } void UIScene_MiniGamesMenu::handleTimerComplete(int id) { // No timers needed for Mini Games menu } void UIScene_MiniGamesMenu::handleInitFocus(F64 controlId, F64 childId) { updateTooltips(); } bool UIScene_MiniGamesMenu::DoesSavesListHaveFocus() { return getControlFocus() == eControl_SavesList; } bool UIScene_MiniGamesMenu::DoesGamesListHaveFocus() { return getControlFocus() == eControl_GamesList; }