diff --git a/src/Menu.hh b/src/Menu.hh index 58ab46c3..33dd518b 100644 --- a/src/Menu.hh +++ b/src/Menu.hh @@ -14,6 +14,7 @@ namespace MenuID { constexpr uint32_t MAIN = 0x11000011; +constexpr uint32_t CLEAR_LICENSE_CONFIRMATION = 0x11111111; constexpr uint32_t INFORMATION = 0x22000022; constexpr uint32_t LOBBY = 0x33000033; constexpr uint32_t GAME = 0x44000044; @@ -40,6 +41,11 @@ constexpr uint32_t DISCONNECT = 0x11888811; constexpr uint32_t CLEAR_LICENSE = 0x11999911; } // namespace MainMenuItemID +namespace ClearLicenseConfirmationMenuItemID { +constexpr uint32_t CANCEL = 0x01010101; +constexpr uint32_t CLEAR_LICENSE = 0x02020202; +} // namespace ClearLicenseConfirmationMenuItemID + namespace InformationMenuItemID { constexpr uint32_t GO_BACK = 0x22FFFF22; } diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index f18bc436..30ced422 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -2312,10 +2312,20 @@ static void on_10(shared_ptr c, uint16_t, uint32_t, string& data) { c->should_disconnect = true; break; - case MainMenuItemID::CLEAR_LICENSE: - send_command(c, 0x9A, 0x04); - c->should_disconnect = true; + case MainMenuItemID::CLEAR_LICENSE: { + auto s = c->require_server_state(); + + auto conf_menu = make_shared(MenuID::CLEAR_LICENSE_CONFIRMATION, s->name); + conf_menu->items.emplace_back(ClearLicenseConfirmationMenuItemID::CANCEL, "Go back", + "Go back to the\nmain menu", 0); + conf_menu->items.emplace_back(ClearLicenseConfirmationMenuItemID::CLEAR_LICENSE, "Clear license", + "Disconnect with an\ninvalid license error\nso you can enter a\ndifferent serial\nnumber, access key,\nor password", + MenuItem::Flag::INVISIBLE_ON_DC_PROTOS | MenuItem::Flag::INVISIBLE_ON_PC_NTE | MenuItem::Flag::INVISIBLE_ON_XB | MenuItem::Flag::INVISIBLE_ON_BB); + + send_menu(c, conf_menu); + send_ship_info(c, "Are you sure?"); break; + } default: send_message_box(c, "Incorrect menu item ID."); @@ -2324,6 +2334,18 @@ static void on_10(shared_ptr c, uint16_t, uint32_t, string& data) { break; } + case MenuID::CLEAR_LICENSE_CONFIRMATION: { + switch (item_id) { + case ClearLicenseConfirmationMenuItemID::CANCEL: + send_main_menu(c); + break; + case ClearLicenseConfirmationMenuItemID::CLEAR_LICENSE: + send_command(c, 0x9A, 0x04); + c->should_disconnect = true; + } + break; + } + case MenuID::INFORMATION: { if (item_id == InformationMenuItemID::GO_BACK) { c->config.clear_flag(Client::Flag::IN_INFORMATION_MENU);