diff --git a/src/config.cpp b/src/config.cpp index 560a262..3586eb7 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -4,15 +4,21 @@ #include "config.h" +#include "wut_extra.h" #include "utils/logger.h" #include #include +#include #include +#include #include +#include bool Config::connect_to_network = true; bool Config::need_relaunch = false; +bool Config::unregister_task_item_pressed = false; +bool Config::is_wiiu_menu = false; void Config::Init() { WUPSStorageError storageRes = WUPS_OpenStorage(); @@ -41,6 +47,8 @@ void Config::Init() { DEBUG_FUNCTION_LINE("Failed to close storage"); } } + + Config::is_wiiu_menu = (OSGetTitleID() == _SYSGetSystemApplicationTitleId(SYSTEM_APP_ID_WII_U_MENU)); } static void connect_to_network_changed(ConfigItemBoolean* item, bool new_value) { @@ -52,6 +60,50 @@ static void connect_to_network_changed(ConfigItemBoolean* item, bool new_value) WUPS_StoreInt(nullptr, "connect_to_network", Config::connect_to_network); } +static int32_t unregister_task_item_get_display_value(void *context, char *out_buf, int32_t out_size) { + if(!Config::is_wiiu_menu) + strncpy(out_buf, "From WiiU menu only", out_size); + else + strncpy(out_buf, Config::unregister_task_item_pressed ? "Restart to apply" : "Press A", out_size); + return 0; +} + +static void unregister_task_item_pressed_cb(void *context, WUPSConfigButtons button) { + if (!Config::unregister_task_item_pressed && Config::is_wiiu_menu && button == WUPS_CONFIG_BUTTON_A) { + + nn::act::Initialize(); + Initialize__Q2_2nn4bossFv(); + + for (uint8_t i = 1; i <= nn::act::GetNumOfAccounts(); i++) + { + if (nn::act::IsSlotOccupied(i) == true) + { + if (nn::act::IsNetworkAccountEx(i) == true) + { + nn::boss::Task task; + nn::act::PersistentId persistentId = nn::act::GetPersistentIdEx(i); + + __ct__Q3_2nn4boss4TaskFv(&task); + Initialize__Q3_2nn4boss4TaskFPCcUi(&task, "oltopic", persistentId); + + uint32_t res = Unregister__Q3_2nn4boss4TaskFv(&task); + WHBLogPrintf("Unregistered oltopic for: SlotNo %d | Persistent ID %08x -> 0x%08x", i, persistentId, res); + } + } + } + + Finalize__Q2_2nn4bossFv(); + nn::act::Finalize(); + + Config::unregister_task_item_pressed = !Config::unregister_task_item_pressed; + Config::need_relaunch = true; + } +} + +static bool unregister_task_item_is_movement_allowed(void *context) { + return true; +} + WUPS_GET_CONFIG() { // We open the storage so we can persist the configuration the user did. if (WUPS_OpenStorage() != WUPS_STORAGE_ERROR_SUCCESS) { @@ -62,10 +114,28 @@ WUPS_GET_CONFIG() { WUPSConfigHandle config; WUPSConfig_CreateHandled(&config, "Inkay"); - WUPSConfigCategoryHandle cat; - WUPSConfig_AddCategoryByNameHandled(config, "Patching", &cat); + WUPSConfigCategoryHandle patching_cat; + WUPSConfig_AddCategoryByNameHandled(config, "Patching", &patching_cat); - WUPSConfigItemBoolean_AddToCategoryHandled(config, cat, "connect_to_network", "Connect to the Pretendo network", Config::connect_to_network, &connect_to_network_changed); + WUPSConfigItemBoolean_AddToCategoryHandled(config, patching_cat, "connect_to_network", "Connect to the Pretendo network", Config::connect_to_network, &connect_to_network_changed); + + WUPSConfigCategoryHandle boss_cat; + WUPSConfig_AddCategoryByNameHandled(config, "BOSS settings", &boss_cat); + + WUPSConfigCallbacks_t unregisterTasksItemCallbacks = { + .getCurrentValueDisplay = unregister_task_item_get_display_value, + .getCurrentValueSelectedDisplay = unregister_task_item_get_display_value, + .onSelected = nullptr, + .restoreDefault = nullptr, + .isMovementAllowed = unregister_task_item_is_movement_allowed, + .callCallback = nullptr, + .onButtonPressed = unregister_task_item_pressed_cb, + .onDelete = nullptr + }; + + WUPSConfigItemHandle unregisterTasksItem; + WUPSConfigItem_Create(&unregisterTasksItem, "unregister_task_item", "Unregister Wara Wara Plaza BOSS tasks", unregisterTasksItemCallbacks, &Config::unregister_task_item_pressed); + WUPSConfigCategory_AddItem(boss_cat, unregisterTasksItem); return config; } diff --git a/src/config.h b/src/config.h index 1d97de1..61c3dd7 100644 --- a/src/config.h +++ b/src/config.h @@ -14,6 +14,11 @@ public: // private stuff static bool need_relaunch; + + // private stuff + static bool is_wiiu_menu; + + static bool unregister_task_item_pressed; }; #endif //INKAY_CONFIG_H diff --git a/src/wut_extra.h b/src/wut_extra.h index 1cffa35..f517d03 100644 --- a/src/wut_extra.h +++ b/src/wut_extra.h @@ -1,20 +1,40 @@ #pragma once #include +#include + +#include #ifdef __cplusplus extern "C" { #endif -//remove all this if wut adds it and it causes errors -typedef struct { - uint32_t major; - uint32_t minor; - uint32_t patch; - char region; -} MCP_SystemVersion; -static_assert(sizeof(MCP_SystemVersion) == 0x10); -int MCP_GetSystemVersion(int handle, MCP_SystemVersion* version); +namespace nn::boss { + class Task { + public: + nn::act::PersistentId persistentId; + uint32_t unk1; + char task_name[8]; + uint64_t title_id; + uint32_t unk2; + uint32_t unk3; + }; + + static_assert(sizeof(Task) == 32, "nn::boss::Task must be 32 bytes."); +} + +extern "C" uint32_t Initialize__Q2_2nn4bossFv(); +extern "C" uint32_t Finalize__Q2_2nn4bossFv(); + +extern "C" void __ct__Q3_2nn4boss4TaskFv(nn::boss::Task* task); +extern "C" uint32_t Initialize__Q3_2nn4boss4TaskFPCcUi(nn::boss::Task* task, char const *, unsigned int); +extern "C" uint32_t Unregister__Q3_2nn4boss4TaskFv(nn::boss::Task* task); +extern "C" void __dt__Q3_2nn4boss4TaskFv(nn::boss::Task* task); +extern "C" uint32_t StartScheduling__Q3_2nn4boss4TaskFb(nn::boss::Task* task, bool queueTaskOnCall); +extern "C" uint32_t GetState__Q3_2nn4boss4TaskCFPUi(nn::boss::Task* task, uint32_t *outExecCount); +extern "C" uint32_t Run__Q3_2nn4boss4TaskFb(nn::boss::Task* task, bool unk); +extern "C" uint32_t UpdateIntervalSec__Q3_2nn4boss4TaskFUi(nn::boss::Task* task, uint32_t seconds); +extern "C" bool IsRegistered__Q3_2nn4boss4TaskCFv(nn::boss::Task* task); #ifdef __cplusplus }