diff --git a/Source/Client/Mode/CLoginMode.h b/Source/Client/Mode/CLoginMode.h index 14293a88f..572c4ec0b 100644 --- a/Source/Client/Mode/CLoginMode.h +++ b/Source/Client/Mode/CLoginMode.h @@ -183,6 +183,7 @@ extern CharacterInfo g_charInfo; extern bool g_replayMode; extern int g_restoreSurfaces; extern int g_isAppActive; +extern std::int32_t g_passwordWndAccountId; int GetClientType(); std::string GetMacAddress(); diff --git a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp index 07fff6b11..4fdaeba00 100644 --- a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp +++ b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp @@ -1,4 +1,5 @@ #include "Client/Mode/CMode.h" +#include "Client/Mode/CLoginMode.h" #include "Contents/UserData/NormalItemSlots.h" #include "Client/Application/ApplicationWindow.h" #include "Client/Application/Launcher.h" @@ -195,6 +196,9 @@ static const std::string s_partyItemLinkOpen = ""; // GLOBAL: gl_25460 static const std::string s_partyItemLinkClose = ""; +// GLOBAL: gl_25473 +int g_equipAbilityButtonPosition[2] = {167, 167}; + // OFFSET: 0x0087B500 // FUNCTION: fn_11241 void UIChatHisBox::Configure(int x, int y, int width, int height, unsigned char) { @@ -3226,6 +3230,8 @@ int UIEquipWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::int } } +// OFFSET: 0x008DEC50 + // OFFSET: 0x008F6750 // FUNCTION: fn_12322 void UISayDialogWnd::Resize(int width, int height) { @@ -4485,22 +4491,11 @@ void UIWhisperWnd::SaveChatLog() { } } -struct WhisperWndEx { - unsigned char unknown_0000[0x110]; - unsigned char unknown_0110[10]; - unsigned char unknown_011A[10]; - UIWindow* unknown_0124[11]; - UIWindow* unknown_0150[5]; - - int sub_90C350(unsigned int target); - void sub_90C380(); -}; - // OFFSET: 0x0090C350 // FUNCTION: fn_12443 -int WhisperWndEx::sub_90C350(unsigned int target) { +int UISecondPasswordInputWnd::sub_90C350(unsigned int target) { for (int i = 0; i < 10; ++i) { - if (this->unknown_0110[i] == target) { + if (this->m_digits[i] == target) { return i; } } @@ -4509,16 +4504,16 @@ int WhisperWndEx::sub_90C350(unsigned int target) { // OFFSET: 0x0090C380 // FUNCTION: fn_12444 -void WhisperWndEx::sub_90C380() { +void UISecondPasswordInputWnd::sub_90C380() { for (int i = 0; i < 11; ++i) { - UIWindow* window = this->unknown_0124[i]; - *reinterpret_cast(reinterpret_cast(window) + 0xac) = 1; - window->Invalidate(); + UIButton* button = this->unknown_0124[i]; + button->SetDisabled(1); + button->Invalidate(); } for (int i = 0; i < 5; ++i) { - UIWindow* window = this->unknown_0150[i]; - *reinterpret_cast(reinterpret_cast(window) + 0xac) = 1; - window->Invalidate(); + UIButton* button = this->unknown_0150[i]; + button->SetDisabled(1); + button->Invalidate(); } } @@ -5526,6 +5521,95 @@ void UIChatRoomMakeWnd::Slot15(int width, int height) { // OFFSET: 0x008F80B0 // OFFSET: 0x008F7B10 +// FUNCTION: fn_12329 +int UIChatRoomChangeWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) { + if (message == 6) { + switch (a) { + case 184: { + int error; + if (this->m_titleEdit->Length() == 0) { + error = 13; + } else if (g_forbiddenWords.Contains(this->m_titleEdit->Text())) { + error = 14; + } else if (g_serviceType == 1 && !ValidateCharacterName(this->m_titleEdit->Text())) { + error = 190; + } else if (this->m_passwordEdit->Length() < 4 && this->m_public == 1) { + error = this->m_passwordEdit->Length() != 0 ? 16 : 15; + } else { + ChatRoomSetting setting; + setting.limit = this->m_limit; + setting.unknown_0034 = 0; + setting.isPublic = this->m_public != 1; + setting.roomId = -1; + setting.title = this->m_titleEdit->Text(); + setting.password = this->m_passwordEdit->Text(); + g_modeMgr.gameMode->SendMsg(44, reinterpret_cast(&setting), 0, 0, 0); + g_windowMgr.CloseWindow(30); + return 0; + } + g_windowMgr.Confirm(LookupMessage(error), 0, true, false, 0, "Message", 280, 120, 0); + return 0; + } + case 185: + case 201: + g_windowMgr.CloseWindow(30); + return 0; + case 228: + case 229: { + if (g_windowMgr.unknown_0214) { + g_windowMgr.CloseWindow(26); + } + UIWindow* list = g_windowMgr.sub_A978D0(26); + int count = 1; + if (a == 228) { + this->m_listKind = 0; + count = static_cast(this->m_limitLabels.size()); + for (unsigned int i = 0; i < this->m_limitLabels.size(); ++i) { + list->SendMsg(nullptr, 31, reinterpret_cast(this->m_limitLabels[i].c_str()), 0, 0, 0); + } + } else if (a == 229) { + this->m_listKind = 1; + count = static_cast(this->m_typeLabels.size()); + for (unsigned int i = 0; i < this->m_typeLabels.size(); ++i) { + list->SendMsg(nullptr, 31, reinterpret_cast(this->m_typeLabels[i].c_str()), 0, 0, 0); + } + } + + const int height = count * 16; + list->SendMsg(nullptr, 40, 0, 0, 0, 0); + list->Resize(74, height > 48 ? 48 : height); + list->SendMsg(nullptr, 83, 30, 0, 0, 0); + int x = this->m_listKind * 137 + 44; + int y = 64; + this->ToScreen(x, y); + list->Move(x + 1, y); + return 0; + } + } + return UIChatRoomMakeWnd::SendMsg(sender, 6, a, b, c, d); + } + + if (message != 34) { + return UIChatRoomMakeWnd::SendMsg(sender, message, a, b, c, d); + } + + const ChatRoomSetting* setting = reinterpret_cast(a); + this->m_limit = setting->limit; + this->m_limitText->SetText(this->m_limitLabels[this->m_limitLabels.size() - 1].c_str(), 0); + this->m_limitText->Invalidate(); + this->m_passwordEdit->SetText(setting->password.c_str()); + this->m_titleEdit->SetText(setting->title.c_str()); + g_windowMgr.SetFocus(this->m_titleEdit); + this->m_titleEdit->SelectAll(); + this->m_public = setting->isPublic == 0; + for (int i = 0; i < 2; ++i) { + this->m_publicButtons[i]->Invalidate(); + this->m_publicButtons[i]->SendMsg(this, 13, i == this->m_public ? 1 : 0, 0, 0, 0); + } + this->m_closeButton->SetTooltip(""); + this->Invalidate(); + return 0; +} // OFFSET: 0x008F64B0 // FUNCTION: fn_12317 @@ -10047,6 +10131,32 @@ void UISecondPasswordInputWnd::ShuffleKeypad() Invalidate(); } +namespace { +#pragma pack(push, 1) +struct SecondPasswordPacket { + /* 0000 */ std::uint16_t packetType; + /* 0002 */ std::int32_t accountId; + /* 0006 */ char password[4]; +}; + +struct SecondPasswordChangePacket { + /* 0000 */ std::uint16_t packetType; + /* 0002 */ std::int32_t accountId; + /* 0006 */ char password[4]; + /* 000A */ char newPassword[4]; +}; +#pragma pack(pop) +} + +class UISecondPasswordEditWnd : public UISecondPasswordInputWnd { +public: + int SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) override; +}; + +// OFFSET: 0x00903230 + +// OFFSET: 0x00901D40 + // OFFSET: 0x009099E0 // FUNCTION: fn_12395 void UIEquipWnd::RefreshLook() diff --git a/Source/UI/Dialogs/UIPasswordWnd.h b/Source/UI/Dialogs/UIPasswordWnd.h index 104ae1f1e..0767bffb5 100644 --- a/Source/UI/Dialogs/UIPasswordWnd.h +++ b/Source/UI/Dialogs/UIPasswordWnd.h @@ -60,7 +60,10 @@ class UISecondPasswordInputWnd : public UIStorePasswordInputWnd { public: UISecondPasswordInputWnd(); void Paint() override; + int SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) override; void ShuffleKeypad(); + int sub_90C350(unsigned int target); + void sub_90C380(); void sub_90C970(int value); void CreateKeypad(unsigned int seed); void sub_90DE10(); diff --git a/Source/UI/Items/UIEquipWnd.h b/Source/UI/Items/UIEquipWnd.h index b59bc5fc1..bb7b23625 100644 --- a/Source/UI/Items/UIEquipWnd.h +++ b/Source/UI/Items/UIEquipWnd.h @@ -18,6 +18,7 @@ public: void Slot10(int x, int y, std::intptr_t value) override; void Slot11() override; void Paint() override; + void Slot15(int width, int height) override; /* 00B4 */ int m_viewOther; /* 00B8 */ int m_highlight[3]; /* 00C4 */ int m_show;