rodecomp/Source/UI/StylingShop/UIStylingShopWnd.cpp
ragnarok-clanker ffdc910949 Decompile 4 functions in Source/UI/StylingShop/UIStylingShopWnd.cpp, Source/UI/StylingShop/UIStylingShopWnd.h, ...
Batch #4541 by eAthena: 0 byte-identical, 4 confirmed by peer review.

- fn_10298 UIDisplayCharacter::CopyStyle: logic confirmed by peer review
- fn_10315 UIStylingShopWnd::RefreshFavoriteButton: logic confirmed by peer review
- fn_10316 UIStylingshopTabParentWnd::UpdateFavoriteButton: logic confirmed by peer review
- fn_10317 UIStylingShopWnd::AddToMyStyle: logic confirmed by peer review

Peer-reviewed-by: alisonrag, KWDev, Snow, willerthal
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-10-30 03:49:22 +00:00

467 lines
15 KiB
C++

#include "UI/StylingShop/UIStylingShopWnd.h"
#include "Client/Mode/ModeEvents.h"
#include "Client/Session.h"
#include "Resource/Bitmap/BitmapResource.h"
#include "Resource/ResourceMgr.h"
#include "Resource/TextureNames.h"
#include "UI/Window/UIWindowMgr.h"
#include "UI/Window/WindowPolicy.h"
// OFFSET: 0x00829B50
// FUNCTION: fn_10341
void UIStylingshopTabParentWnd::Slot15(int, int) {
}
// OFFSET: 0x00829B60
// FUNCTION: fn_10342
void UI2ndCostumeWnd::Paint() {
this->ClearSurface(0xFFFFFFFF);
for (int y = 230; y < 280; y += 25) {
CBitmapRes* checkbox = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\styleshop\\checkbox.bmp")));
if (checkbox) {
this->DrawBitmap(13, y, &checkbox->image, false);
}
}
CBitmapRes* line = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\styleshop\\line_dotted_2px.bmp")));
if (line) {
this->DrawBitmap(249, 0, &line->image, false);
}
}
// OFFSET: 0x00829BE0
// FUNCTION: fn_10343
void UIAccessoryCusWnd::Paint() {
this->ClearSurface(0xFFFFFFFF);
CBitmapRes* line = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\styleshop\\line_dotted_2px.bmp")));
if (line) {
this->DrawBitmap(249, 5, &line->image, false);
}
}
// OFFSET: 0x00829C20
// FUNCTION: fn_10344
void UIAccessoryShowCase::Paint() {
this->ClearSurface(0xFFFFFFFF);
}
// OFFSET: 0x00829C30
// FUNCTION: fn_10345
void UIBasicStylingWnd::Paint() {
this->ClearSurface(0xFFFFFFFF);
CBitmapRes* line = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\styleshop\\line_dotted_2px.bmp")));
if (line) {
this->DrawBitmap(249, 5, &line->image, false);
}
CBitmapRes* background = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\styleshop\\bg_styling_color.bmp")));
if (background) {
this->DrawBitmap(71, 233, &background->image, false);
}
}
// OFFSET: 0x00829CA0
// FUNCTION: fn_10346
void UICostumeChangeWnd::Paint() {
this->ClearSurface(0xFFFFFFFF);
CBitmapRes* line = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\styleshop\\line_dotted_2px.bmp")));
if (line) {
this->DrawBitmap(249, 0, &line->image, false);
}
this->DrawCenteredText(43, 248, g_session.GetJobName(this->m_display->job, -1), 161, 0, 11, 0, 0);
}
// OFFSET: 0x00829F30
// FUNCTION: fn_10348
void UIMyStyleWnd::Paint() {
this->ClearSurface(0xFFFFFFFF);
CBitmapRes* line = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\styleshop\\line_dotted_2px.bmp")));
if (line) {
this->DrawBitmap(-line->image.width - static_cast<int>(static_cast<float>(this->geometry.width) * -0.5f), 0, &line->image, false);
}
}
// OFFSET: 0x0082A020
// FUNCTION: fn_10350
void UISlotOfMyStyleWnd::Paint() {
}
// OFFSET: 0x0082A090
// FUNCTION: fn_10352
void UIStylingshopTabParentWnd::Paint() {
}
// OFFSET: 0x0082A0A0
// FUNCTION: fn_10353
void UISlotForSelectWnd::Slot26(int, int) {
if (this->parent) {
this->parent->SendMsg(nullptr, 121, 0, 0, 0, 0);
}
}
// OFFSET: 0x0082A0C0
// FUNCTION: fn_10354
void UI2ndCostumeCheckBox::Slot25(int x, int y) {
if (this->m_disabled == 0 && this->geometry.unknown_0030 != 1) {
UICheckBox::Slot25(x, y);
}
}
// OFFSET: 0x0082A0E0
// FUNCTION: fn_10355
void UISlotForSelectWnd::Slot25(int x, int y) {
if (this->parent) {
this->parent->SendMsg(nullptr, 6, this->geometry.id, x, y, 0);
}
}
// OFFSET: 0x0082A110
// OFFSET: 0x03DE9BE0
// FUNCTION: fn_10356
void UIStylingShopButton::Slot31(int, int) {
if (this->m_disabled != 0 || g_windowMgr.Capture() != this) {
return;
}
this->geometry.unknown_0030 = 2;
UIWindow* parent = this->parent;
if (parent) {
if (WindowPolicy(this->m_buttonContext->policy, this->m_buttonContext->restricted, 3, parent->geometry.id) != 0) {
int id = this->geometry.id;
if (id == 185 && this->m_context->mode && *this->m_buttonContext->activeModeType == 2) {
const char* text = this->m_buttonContext->services.MessageText(17);
if (this->m_buttonContext->services.Confirm(text, 2, 1, 0, "Message", 280, 120) == 187) {
this->m_context->mode->SendModeMessage(2, 0, 0, 0, 0);
}
} else {
if (id == 184 || id == 321) {
this->m_buttonContext->services.Submit(parent);
id = this->geometry.id;
parent = this->parent;
}
parent->SendMsg(this, 6, id, this->m_argument, 0, 0);
}
}
} else {
this->m_context->mode->SendModeMessage(0, this->geometry.id, this->m_argument, 0, 0);
}
this->Invalidate();
g_windowMgr.ReleaseCapture();
}
// OFFSET: 0x0082A1C0
// FUNCTION: fn_10357
void UIStylingShopButton::Slot28(int, int) {
if (!this->m_names[1].empty()) {
return;
}
int screenX = 0;
int screenY = -20;
for (const UIWindow* window = this; window; window = window->parent) {
screenX += window->geometry.x;
screenY += window->geometry.y;
}
this->m_buttonContext->services.Tooltip("No Color", screenX, screenY, -1, false, true);
}
// OFFSET: 0x0082A210
// FUNCTION: fn_10358
void UIStylingShopButton::Slot27(int x, int y) {
if (this->m_disabled == 0 && g_windowMgr.Capture() == this && x >= 0 && x < this->geometry.width && y >= 0 && y < this->geometry.height &&
this->geometry.unknown_0030 != 2) {
this->geometry.unknown_0030 = 2;
this->Invalidate();
}
}
// OFFSET: 0x0082A270
// FUNCTION: fn_10359
void UIStylingShopWnd::Slot19() {
for (std::map<UIWindow*, UIStylingshopTabParentWnd*>::iterator it = this->m_tabs.begin(); it != this->m_tabs.end(); ++it) {
int id = it->first->geometry.id;
if (id == 200) {
it->second->unknown_0084 = it->second->geometry.visible == 1;
} else if (id == 498 || id == 583) {
it->second->unknown_0086 = it->second->geometry.visible == 1;
}
if (it->second->geometry.visible != 0) {
if (it->first->geometry.id == 496) {
return;
}
it->second->m_display->Invalidate();
}
}
}
// OFFSET: 0x0082A330
// FUNCTION: fn_10360
void UIAccBitmapButton::Slot33(int, int) {
this->parent->SendMsg(this, 101, this->geometry.id, this->m_argument, 0, 0);
}
// OFFSET: 0x0082CCB0
// FUNCTION: fn_10366
int UI2ndCostumeWnd::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) {
if (message != 6) {
return UIWindow::SendMsg(sender, message, argument1, argument2, argument3, argument4);
}
if (argument1 == 213) {
if (sender == this->m_showCheckBox) {
if (this->m_display && this->m_hideCheckBox && this->m_showCheckBox->geometry.unknown_0030 != 0) {
this->m_display->job = 1;
this->m_hideCheckBox->SetChecked(0);
this->m_showInfo->Invalidate();
}
} else if (sender == this->m_hideCheckBox) {
if (this->m_display && this->m_showCheckBox && this->m_hideCheckBox->geometry.unknown_0030 != 0) {
this->m_display->job = 0;
this->m_showCheckBox->SetChecked(0);
this->m_showInfo->Invalidate();
}
} else {
this->m_showInfo->Invalidate();
}
}
this->Invalidate();
return 0;
}
// OFFSET: 0x0082CD70
// FUNCTION: fn_10367
int UIAccessoryCusWnd::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) {
if (message != 6) {
return UIWindow::SendMsg(sender, message, argument1, argument2, argument3, argument4);
}
this->Invalidate();
return 0;
}
// OFFSET: 0x0082D3A0
// FUNCTION: fn_10370
int UICostumeChangeWnd::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) {
UIWindow* preview = g_windowMgr.LookupWindow(281);
if (message != 6) {
return UIWindow::SendMsg(sender, message, argument1, argument2, argument3, argument4);
}
switch (argument1) {
case 584: {
UIDisplayCharacter* display = this->m_display;
if (display->m_jobs.size() >= 2) {
std::set<int>::iterator it = display->m_jobs.find(display->job);
if (it == display->m_jobs.end()) {
--it;
}
if (it == display->m_jobs.begin()) {
it = display->m_jobs.end();
}
--it;
display->job = *it;
}
break;
}
case 585: {
UIDisplayCharacter* display = this->m_display;
if (display->m_jobs.size() >= 2) {
std::set<int>::iterator it = display->m_jobs.find(display->job);
if (it != display->m_jobs.end()) {
++it;
}
if (it == display->m_jobs.end()) {
it = display->m_jobs.begin();
}
display->job = *it;
}
break;
}
}
this->Invalidate();
if (preview) {
preview->InvalidateChildren();
}
return 0;
}
// OFFSET: 0x0082DC60
// FUNCTION: fn_10373
int UIShowInfoWnd::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) {
if (message != 6) {
return UIWindow::SendMsg(sender, message, argument1, argument2, argument3, argument4);
}
if (argument1 == 189) {
this->Invalidate();
}
return 0;
}
// OFFSET: 0x0082DC90
// FUNCTION: fn_10374
int UISlotOfMyStyleWnd::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) {
if (message != 6) {
return UIWindow::SendMsg(sender, message, argument1, argument2, argument3, argument4);
}
this->Invalidate();
return 0;
}
// OFFSET: 0x0082E010
// FUNCTION: fn_10376
int UIStylingshopTabParentWnd::SendMsg(UIWindow*, int, std::intptr_t, std::intptr_t, std::intptr_t, std::intptr_t) {
return 0;
}
// OFFSET: 0x00823CE0
// FUNCTION: fn_10298
void UIDisplayCharacter::CopyStyle(const UIDisplayCharacter* other) {
this->unknown_0080 = other->unknown_0080;
this->unknown_0084 = other->unknown_0084;
this->unknown_0088 = other->unknown_0088;
this->unknown_008C = other->unknown_008C;
this->job = other->job;
this->unknown_0094 = other->unknown_0094;
this->unknown_0098 = other->unknown_0098;
this->unknown_009C = other->unknown_009C;
this->unknown_00A0 = other->unknown_00A0;
this->unknown_00A4 = other->unknown_00A4;
this->unknown_00BC = other->unknown_00BC;
this->unknown_00C0 = other->unknown_00C0;
this->unknown_00C4 = other->unknown_00C4;
this->Invalidate();
}
// OFFSET: 0x00824760
// FUNCTION: fn_10315
void UIStylingShopWnd::RefreshFavoriteButton() {
UIStylingshopTabParentWnd* visibleTab = nullptr;
for (std::map<UIWindow*, UIStylingshopTabParentWnd*>::iterator it = this->m_tabs.begin(); it != this->m_tabs.end(); ++it) {
if (it->second->geometry.visible == 1) {
if (it->first->geometry.id == 496) {
return;
}
visibleTab = it->second;
}
}
for (std::map<UIWindow*, UIStylingshopTabParentWnd*>::iterator it = this->m_tabs.begin(); it != this->m_tabs.end(); ++it) {
if (it->first->geometry.id == 496) {
UIMyStyleWnd* myStyle = static_cast<UIMyStyleWnd*>(it->second);
UIDisplayCharacter* display = visibleTab->m_display;
bool favorite = false;
for (int i = 0; i < 2; ++i) {
UISlotOfMyStyleWnd* slot = myStyle->m_slots[i];
if (slot) {
UIDisplayCharacter* saved = slot->m_display;
if (saved->unknown_008C == display->unknown_008C && saved->unknown_0094 == display->unknown_0094 && saved->unknown_0098 == display->unknown_0098 &&
saved->unknown_009C == display->unknown_009C && saved->unknown_00A0 == display->unknown_00A0 && saved->unknown_00A4 == display->unknown_00A4 &&
saved->job == display->job) {
favorite = true;
break;
}
}
}
visibleTab->UpdateFavoriteButton(favorite);
}
}
}
// OFFSET: 0x00824900
// FUNCTION: fn_10316
void UIStylingshopTabParentWnd::UpdateFavoriteButton(const bool& favorite) {
UIDisplayCharacter* display = this->m_display;
if (!display) {
return;
}
UIStylingShopWnd* shop = static_cast<UIStylingShopWnd*>(g_windowMgr.LookupWindow(281));
if (!shop) {
return;
}
bool full = false;
for (std::map<UIWindow*, UIStylingshopTabParentWnd*>::iterator it = shop->m_tabs.begin(); it != shop->m_tabs.end(); ++it) {
if (it->first->geometry.id == 496) {
UIMyStyleWnd* myStyle = static_cast<UIMyStyleWnd*>(it->second);
full = true;
for (int i = 0; i < 2; ++i) {
if (!myStyle->m_slots[i]) {
full = false;
break;
}
}
break;
}
}
if (!full) {
display->m_favoriteButton->SetTooltip("");
}
display->m_favoriteButton->m_argument = 0;
display->m_favoriteButton->SetBitmap("유저인터페이스\\styleshop\\btn_favorite_off.bmp", 0, 0);
display->m_favoriteButton->SetBitmap("유저인터페이스\\styleshop\\btn_favorite_off.bmp", 1, 0);
display->m_favoriteButton->SetBitmap("유저인터페이스\\styleshop\\btn_favorite_off.bmp", 2, 0);
if (favorite == true) {
display->m_favoriteButton->m_argument = 1;
display->m_favoriteButton->SetBitmap("유저인터페이스\\styleshop\\btn_favorite_on.bmp", 0, 0);
display->m_favoriteButton->SetBitmap("유저인터페이스\\styleshop\\btn_favorite_on.bmp", 1, 0);
display->m_favoriteButton->SetBitmap("유저인터페이스\\styleshop\\btn_favorite_on.bmp", 2, 0);
}
display->m_favoriteButton->Invalidate();
}
// OFFSET: 0x00824BF0
// FUNCTION: fn_10317
bool UIStylingShopWnd::AddToMyStyle() {
UIDisplayCharacter* display = nullptr;
for (std::map<UIWindow*, UIStylingshopTabParentWnd*>::iterator it = this->m_tabs.begin(); it != this->m_tabs.end(); ++it) {
if (it->second->geometry.visible == 1) {
display = it->second->m_display;
}
}
for (std::map<UIWindow*, UIStylingshopTabParentWnd*>::iterator it = this->m_tabs.begin(); it != this->m_tabs.end(); ++it) {
if (it->first->geometry.id == 496) {
UIMyStyleWnd* myStyle = static_cast<UIMyStyleWnd*>(it->second);
int index = 0;
while (myStyle->m_slots[index]) {
++index;
if (index >= 2) {
return false;
}
}
UISlotOfMyStyleWnd* slot = new UISlotOfMyStyleWnd(*this->m_context);
slot->SetSize(static_cast<int>(myStyle->geometry.width * 0.5 - 3.0), myStyle->geometry.height + 25);
slot->Move(static_cast<int>(myStyle->geometry.width * 0.5 * index), 0);
display->unknown_0080 = index;
slot->m_display->CopyStyle(display);
myStyle->AddChildFront(slot);
myStyle->m_slots[index] = slot;
myStyle->unknown_0094[index]->Enable(1);
myStyle->unknown_009C[index]->Enable(1);
myStyle->unknown_00A4[index]->Enable(1);
return true;
}
}
return false;
}