Files
2022-10-26 12:25:11 +08:00

443 lines
14 KiB
C++

#include "SunClientPrecompiledHeader.h"
#ifdef _NA_003027_20111013_HONOR_SYSTEM
#include "uiCharacterStatusHonorInfo.h"
#include "uiCharacterStatusMan/uiCharacterStatusMan.h"
#include "uiCharacterStatus/uiCharacterStatusHonorDescription.h"
#include "HonorSystem/HonorSystem.h"
#include "FameListParser.h"
#include "ReputeListParser.h"
#include "TextureListInfoParser.h"
#include "TextureListInfoHandleManager.h"
const DWORD uiCharacterStatusHonorInfo::kDialog_ID = g_IDGenerator.GenerateID();
const int kListSellHeight = 32;
const BYTE kFameMenuIndex = 255; // 0xff
uiCharacterStatusHonorInfo::uiCharacterStatusHonorInfo(InterfaceManager* interface_manager)
:uiBase(interface_manager)
{
}
uiCharacterStatusHonorInfo::~uiCharacterStatusHonorInfo()
{
}
void uiCharacterStatusHonorInfo::Init(CDrawBase* draw_base)
{
uiBase::Init(draw_base);
RegisterControlPosition(StrToWzID("C000"), kControl_CheckBT_C000);
#ifdef _NA_008472_20150903_IMPROVED_BALANCE
RegisterControlPosition(StrToWzID("C004"), kControl_CheckBT_C004);
#endif // _NA_008472_20150903_IMPROVED_BALANCE
RegisterControlPosition(StrToWzID("C001"), kControl_CheckBT_C001);
RegisterControlPosition(StrToWzID("C002"), kControl_CheckBT_C002);
RegisterControlPosition(StrToWzID("C003"), kControl_CheckBT_C003);
RegisterControlPosition(StrToWzID("L000"), kControl_List_L000);
RegisterControlPosition(StrToWzID("V000"), kControl_VScroll_V000);
honor_info_menu().Release();
}
void uiCharacterStatusHonorInfo::Release()
{
honor_info_menu().Release();
}
void uiCharacterStatusHonorInfo::OnShowWindow(BOOL is_show)
{
if (is_show == TRUE)
{
RefreshTab();
}
else
{
uiCharacterStatusHonorDescription* honor_description_ui = GET_CAST_DIALOG(uiCharacterStatusHonorDescription, uiCharacterStatusHonorDescription::kDialog_ID);
if (honor_description_ui != NULL)
{
honor_description_ui->ShowInterface(FALSE);
}
}
}
void uiCharacterStatusHonorInfo::OnUpdateSolarDialog()
{
honor_info_menu().UpdateMouseWheel();
uiCharacterStatusHonorDescription* honor_description_ui = GET_CAST_DIALOG(uiCharacterStatusHonorDescription, uiCharacterStatusHonorDescription::kDialog_ID);
if (honor_description_ui != NULL)
{
RECT control_rect;
GetDialogWZ()->GetClientRect(&control_rect);
honor_description_ui->MoveWindowWZ(control_rect.right, control_rect.top);
}
}
void uiCharacterStatusHonorInfo::MessageProc(SI_MESSAGE* message)
{
if (IsLock())
{
return;
}
if (GetMan() == NULL)
{
return;
}
TreeMenuGroup::TreeObject* tree_object = NULL;
if (honor_info_menu().MessageProc(message, OUT tree_object) == true)
{
if (tree_object != NULL)
{
switch (message->eResultMsg)
{
case RT_MSG_LBUTTONCLICK:
{
OnClickHonorInfo(tree_object->info);
}
break;
default:
{
}
}
}
}
switch (message->eResultMsg)
{
case RT_MSG_LBUTTONCLICK:
OnLButtonClick(message);
break;
default:
SolarDialog::MessageProc(message);
break;
}
}
bool uiCharacterStatusHonorInfo::OnLButtonClick(SI_MESSAGE* message)
{
bool result = true;
DWORD control_position = GetControlPosition_byID(message->dwCtrlID);
switch (control_position)
{
case kControl_CheckBT_C000:
#ifdef _NA_008472_20150903_IMPROVED_BALANCE
case kControl_CheckBT_C004:
#endif // _NA_008472_20150903_IMPROVED_BALANCE
case kControl_CheckBT_C001:
case kControl_CheckBT_C002:
case kControl_CheckBT_C003:
{
uiCharacterStatusMan* ui_status_manager = GET_DIALOG_MANAGER(uiCharacterStatusMan, UIMAN_CHARACTERSTATUS);
if (ui_status_manager != NULL)
{
TabCheckButtonControllManager& tab_manager = ui_status_manager->status_dialog_tab_manager();
tab_manager.OnClickTab(control_position - kControl_CheckBT_C000);
}
RefreshTab();
}
break;
default:
{
}
break;
}
return result;
}
void uiCharacterStatusHonorInfo::OnClickHonorInfo(BASE_TreeMenuInfo* tree_menu_info)
{
if (tree_menu_info == NULL)
{
return;
}
if (tree_menu_info->is_folder() == true)
{
return;
}
uiCharacterStatusHonorDescription* honor_description_ui = GET_CAST_DIALOG(uiCharacterStatusHonorDescription, uiCharacterStatusHonorDescription::kDialog_ID);
if (honor_description_ui == NULL)
{
return;
}
BYTE honor_type = 0;
WORD honor_code = 0;
if (tree_menu_info->menu_depth[3] == kFameMenuIndex)
{
// 명성
honor_type = HONOR_POINT_INFO::FAME;
honor_code = tree_menu_info->menu_depth[2];
}
else
{
honor_type = HONOR_POINT_INFO::REPUTE;
honor_code = tree_menu_info->menu_depth[2];
}
honor_description_ui->SetHonorDescription(honor_type, honor_code);
return;
}
void uiCharacterStatusHonorInfo::RefreshTab()
{
CCtrlButtonCheckWZ* check_button = NULL;
for (int position = kControl_CheckBT_C000; position < (kControl_CheckBT_C003 + 1); ++position)
{
check_button =
static_cast<CCtrlButtonCheckWZ*>(GetControlWZ(GetControlID_byPosition(position)));
if (check_button == NULL)
{
continue;
}
check_button->SetCheckState((position == kControl_CheckBT_C002) ? (true) : (false));
}
}
void uiCharacterStatusHonorInfo::InitHonorListInfo()
{
honor_info_menu().Release();
// 명성/평판 메뉴 정보 갱싱
HonorSystem::HonorSystemFunction::RefreshHonorPointListMenu();
// 명성/평판 리스트 메뉴 초기화
honor_info_menu().Init(BASE_TreeMenuInfo::kGroupType_Honor_Info,
static_cast<CCtrlListWZ*>(GetControlWZ_byPosition(kControl_List_L000)),
static_cast<CCtrlVScrollWZ*>(GetControlWZ_byPosition(kControl_VScroll_V000)),
false,
uiCharacterStatusHonorInfo::Callback_HonorInfoMenuRender);
honor_info_menu().set_menu_height_gab(kListSellHeight);
// 리스트컨트롤에 명성/평판 리스트 채우기
honor_info_menu().Fill();
TreeMenuGroup::TreeObject* default_select = honor_info_menu().Find(kFameMenuIndex, 1, 0, 0);
if (default_select != NULL)
{
honor_info_menu().Select(default_select);
}
}
void uiCharacterStatusHonorInfo::OnChangeHonorInfo(DWORD changed_data)
{
}
void uiCharacterStatusHonorInfo::Callback_HonorInfoMenuRender( CCtrlListWZ* list_control, CCtrlListWZ::CListSellData* sell_data, int sell_index, RECT& render_area )
{
if (list_control == NULL || sell_data == NULL || sell_data->user_data == NULL)
{
return;
}
TreeMenuGroup::TreeObject* tree_object = static_cast<TreeMenuGroup::TreeObject*>(sell_data->user_data);
if (tree_object == NULL)
{
return;
}
int select_sell = list_control->GetCurSel();
int over_sell = list_control->GetOverSel();
bool is_folder = tree_object->info->is_folder();
BASE_TreeMenuInfo::Icon_Type image_type = BASE_TreeMenuInfo::kIconType_Enable;
BASE_TextureListInfo* tex_info = NULL;
HANDLE tex_handle = INVALID_HANDLE_VALUE;
BYTE menu_index = tree_object->info->menu_depth[3];
DWORD rating = 0;
DWORD current_value = 0;
DWORD max_value = 1;
if (is_folder == false)
{
if (menu_index == kFameMenuIndex)
{
HonorSystem::FamePointInfo* fame_point_info = (HonorSystem::FamePointInfo*)(tree_object->info->user_data);
current_value = fame_point_info->fame_point_value;
rating = FameListParser::GetFameRating(fame_point_info->fame_info, current_value);
max_value = fame_point_info->fame_info->fame_rating_point[(min(rating, FameListParser::kMaxFameRating -1))];
if (rating == FameListParser::kMaxFameRating)
{
current_value = min(current_value, max_value);
}
else if (rating != 0)
{
current_value -= fame_point_info->fame_info->fame_rating_accumulate_point[rating - 1];
}
}
else
{
HonorSystem::ReputePointInfo* repute_point_info = (HonorSystem::ReputePointInfo*)(tree_object->info->user_data);
current_value = repute_point_info->repute_point_value;
rating = ReputeListParser::GetReputeRating(repute_point_info->repute_info, current_value);
max_value = repute_point_info->repute_info->repute_rating_point[(min(rating, ReputeListParser::kMaxReputeRating -1))];
if (rating == ReputeListParser::kMaxReputeRating)
{
current_value = min(current_value, max_value);
}
else if (rating != 0)
{
current_value -= repute_point_info->repute_info->repute_rating_accumulate_point[rating - 1];
}
}
}
// 이미지 출력
if (is_folder == true)
{
// 폴더 정보이면
// 폴더 이미지 출력
image_type = tree_object->is_unfold ? BASE_TreeMenuInfo::kIconType_Unfold : BASE_TreeMenuInfo::kIconType_Collpase;
tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(tree_object->info->image_code[image_type],
tex_info);
if ((tex_handle != INVALID_HANDLE_VALUE) && (tex_info != NULL))
{
RECT dest_area = render_area;
int offset = (kListSellHeight - tex_info->tex_size.bottom) / 2;
dest_area.left += offset;
dest_area.top += offset;
dest_area.right = tex_info->tex_size.right;
dest_area.bottom = tex_info->tex_size.bottom;
g_pSunRenderer->RenderTexture(tex_handle,
(float)dest_area.left,
(float)dest_area.top,
(float)dest_area.right,
(float)dest_area.bottom,
(float)tex_info->tex_size.left,
(float)tex_info->tex_size.top,
(float)tex_info->tex_size.right,
(float)tex_info->tex_size.bottom);
}
}
else
{
// 수치 정보이면
if (over_sell == sell_index)
{
// 오버 이미지 출력
image_type = BASE_TreeMenuInfo::kIconType_CheckOn;
}
else if (select_sell == sell_index)
{
// 선택 이미지 출력
image_type = BASE_TreeMenuInfo::kIconType_Cursor;
}
// 배경
tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(tree_object->info->image_code[image_type],
tex_info);
if ((tex_handle != INVALID_HANDLE_VALUE) && (tex_info != NULL))
{
RECT dest_area = render_area;
dest_area.right = tex_info->tex_size.right;
dest_area.bottom = tex_info->tex_size.bottom;
g_pSunRenderer->RenderTexture(tex_handle,
(float)dest_area.left,
(float)dest_area.top,
(float)dest_area.right,
(float)dest_area.bottom,
(float)tex_info->tex_size.left,
(float)tex_info->tex_size.top,
(float)tex_info->tex_size.right,
(float)tex_info->tex_size.bottom);
}
// 게이지
tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(10024,
tex_info);
if ((tex_handle != INVALID_HANDLE_VALUE) && (tex_info != NULL) && (current_value > 0))
{
RECT dest_area = render_area;
dest_area.right = (LONG)((float)(tex_info->tex_size.right) * current_value / max_value);
dest_area.bottom = tex_info->tex_size.bottom;
dest_area.left += 288;
dest_area.top += 8;
g_pSunRenderer->RenderTexture(tex_handle,
(float)dest_area.left,
(float)dest_area.top,
(float)dest_area.right,
(float)dest_area.bottom,
(float)tex_info->tex_size.left,
(float)tex_info->tex_size.top,
(float)dest_area.right,
(float)tex_info->tex_size.bottom);
}
}
DWORD font_ID = StrToWzID("mn12");
COLORREF font_color = sell_data->SelFontColor;
if (over_sell == sell_index)
{
font_ID = tree_object->info->font_id[BASE_TreeMenuInfo::kFontType_Select];
font_color = tree_object->info->font_color[BASE_TreeMenuInfo::kFontType_Select];
}
else
{
font_ID = tree_object->info->font_id[BASE_TreeMenuInfo::kFontType_Enable];
font_color = tree_object->info->font_color[BASE_TreeMenuInfo::kFontType_Enable];
}
g_pSunRenderer->x_pManagerTextOut->StartToUseFont(font_ID);
{
RECT dest_area = render_area;
dest_area.left += kListSellHeight;
g_pSunRenderer->x_pManagerTextOut->DrawText(sell_data->stdStrText.c_str(),
&dest_area,
font_color,
WzColor_RGBA(0, 0, 0, 0),
TP_HLEFT | TP_VCENTER);
if (is_folder == false)
{
dest_area = render_area;
dest_area.left += 288;
TCHAR message[INTERFACE_STRING_LENGTH] = {'\0', };
if (over_sell == sell_index)
{
Snprintf(message, INTERFACE_STRING_LENGTH - 1, "%d/%d", current_value, max_value);
}
else
{
int rating_name_code = 0;
if (tree_object->info->menu_depth[3] == kFameMenuIndex)
{
rating_name_code = 6501 + rating;
}
else
{
rating_name_code = 6508 + rating;
}
g_InterfaceManager.GetInterfaceString(rating_name_code, message);
}
g_pSunRenderer->x_pManagerTextOut->DrawText(message,
&dest_area,
font_color,
WzColor_RGBA(0, 0, 0, 0),
TP_HCENTER | TP_VCENTER);
}
}
g_pSunRenderer->x_pManagerTextOut->EndUseFont();
}
#endif //_NA_003027_20111013_HONOR_SYSTEM