#include "SunClientPrecompiledHeader.h" #ifdef _NA_008405_20150716_MINIGAME_BINGO #include "uiBingoGameDialog.h" #include "GlobalFunc.h" #include "GameFramework.h" #include "uiMenuMan/uiMenuMan.h" #include "MainDialog2.h" #include "TextureListInfoParser.h" #include "TextureListInfoHandleManager.h" const BYTE FREE_NUMBER = 255; const int MAX_NUMBER_COORDINATE =72; //------------------------------------------------------------------------------ /** */ static const float NumberCoordinate[MAX_NUMBER_COORDINATE] = { #ifdef _CHINA //left //top //right //bottom 0.0f, 0.0f, 18.0f, 22.0f, // 0 19.0f, 0.0f, 31.0f, 22.0f, // 1 32.0f, 0.0f, 48.0f, 22.0f, // 2 49.0f, 0.0f, 65.0f, 22.0f, // 3 66.0f, 0.0f, 84.0f, 22.0f, // 4 85.0f, 0.0f, 101.0f, 22.0f, // 5 102.0f, 0.0f, 118.0f, 22.0f, // 6 119.0f, 0.0f, 134.0f, 22.0f, // 7 135.0f, 0.0f, 152.0f, 22.0f, // 8 153.0f, 0.0f, 169.0f, 22.0f, // 9 170.0f, 0.0f, 179.0f, 22.0f, // ! 180.0f, 0.0f, 249.0f, 22.0f, // XP 0.0f, 23.0f, 91.0f, 45.0f, // Critical 105.0f, 23.0f, 153.0f, 45.0f, // Block 0.0f, 48.0f, 45.0f, 69.0f, // Miss 57.0f, 48.0f, 103.0f, 69.0f, // Reload 0.0f, 74.0f, 45.0f, 95.0f, // Double 57.0f, 74.0f, 103.0f, 95.0f, // Double #else //left //top //right //bottom 0.0f, 0.0f, 18.0f, 22.0f, // 0 19.0f, 0.0f, 31.0f, 22.0f, // 1 32.0f, 0.0f, 48.0f, 22.0f, // 2 49.0f, 0.0f, 65.0f, 22.0f, // 3 66.0f, 0.0f, 84.0f, 22.0f, // 4 85.0f, 0.0f, 101.0f, 22.0f, // 5 102.0f, 0.0f, 118.0f, 22.0f, // 6 119.0f, 0.0f, 134.0f, 22.0f, // 7 135.0f, 0.0f, 152.0f, 22.0f, // 8 153.0f, 0.0f, 169.0f, 22.0f, // 9 170.0f, 0.0f, 179.0f, 22.0f, // ! 180.0f, 0.0f, 221.0f, 27.0f, // XP 0.0f, 28.0f, 112.0f, 48.0f, // Critical 114.0f, 28.0f, 195.0f, 48.0f, // Block 0.0f, 51.0f, 64.0f, 73.0f, // Miss 65.0f, 51.0f, 161.0f, 74.0f, // Reload 0.0f, 76.0f, 89.0f, 95.0f, // Double 93.0f, 75.0f, 137.0f, 95.0f, // Double #endif // _CHINA }; //------------------------------------------------------------------------------ /** */ WzID uiBingoGameDialog::wz_id_[kControl_Size] = { StrToWzID("P003"), StrToWzID("P004"), StrToWzID("P007"), StrToWzID("P010"), StrToWzID("P011"), StrToWzID("P016"), StrToWzID("P015"), StrToWzID("P014"), StrToWzID("P013"), StrToWzID("P012"), StrToWzID("P021"), StrToWzID("P020"), StrToWzID("P019"), StrToWzID("P018"), StrToWzID("P017"), StrToWzID("P026"), StrToWzID("P025"), StrToWzID("P024"), StrToWzID("P023"), StrToWzID("P022"), StrToWzID("P031"), StrToWzID("P030"), StrToWzID("P029"), StrToWzID("P028"), StrToWzID("P027"), StrToWzID("S000"), StrToWzID("BT01"), StrToWzID("C000"), StrToWzID("B999"), }; //------------------------------------------------------------------------------ /** */ uiBingoGameDialog::uiBingoGameDialog(InterfaceManager* ui_manager) : mini_game_manager_(NULL), number_texture_handle_(INVALID_HANDLE_VALUE), is_enable_(false) { } //------------------------------------------------------------------------------ /** */ uiBingoGameDialog::~uiBingoGameDialog(void) { } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::Release() { if ( number_texture_handle_ != INVALID_HANDLE_VALUE) { if(g_pSunRenderer && g_pSunRenderer->x_pManagerTexture) { g_pSunRenderer->x_pManagerTexture->DestroyTexture( number_texture_handle_ ); number_texture_handle_ = INVALID_HANDLE_VALUE; } } } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::Init( CDrawBase* draw_base ) { uiBase::Init(draw_base); RegisterControlPosition(StrToWzID("P003"), kPicture_0); RegisterControlPosition(StrToWzID("P004"), kPicture_1); RegisterControlPosition(StrToWzID("P007"), kPicture_2); RegisterControlPosition(StrToWzID("P010"), kPicture_3); RegisterControlPosition(StrToWzID("P011"), kPicture_4); RegisterControlPosition(StrToWzID("P016"), kPicture_5); RegisterControlPosition(StrToWzID("P015"), kPicture_6); RegisterControlPosition(StrToWzID("P014"), kPicture_7); RegisterControlPosition(StrToWzID("P013"), kPicture_8); RegisterControlPosition(StrToWzID("P012"), kPicture_9); RegisterControlPosition(StrToWzID("P021"), kPicture_10); RegisterControlPosition(StrToWzID("P020"), kPicture_11); RegisterControlPosition(StrToWzID("P019"), kPicture_12); RegisterControlPosition(StrToWzID("P018"), kPicture_13); RegisterControlPosition(StrToWzID("P017"), kPicture_14); RegisterControlPosition(StrToWzID("P026"), kPicture_15); RegisterControlPosition(StrToWzID("P025"), kPicture_16); RegisterControlPosition(StrToWzID("P024"), kPicture_17); RegisterControlPosition(StrToWzID("P023"), kPicture_18); RegisterControlPosition(StrToWzID("P022"), kPicture_19); RegisterControlPosition(StrToWzID("P031"), kPicture_20); RegisterControlPosition(StrToWzID("P030"), kPicture_21); RegisterControlPosition(StrToWzID("P029"), kPicture_22); RegisterControlPosition(StrToWzID("P028"), kPicture_23); RegisterControlPosition(StrToWzID("P027"), kPicture_24); RegisterControlPosition(StrToWzID("S000"), kControl_Text_S000); RegisterControlPosition(StrToWzID("BT01"), kControl_Button_BT01); RegisterControlPosition(StrToWzID("C000"), kControl_CheckButton_C000); RegisterControlPosition(StrToWzID("B999"), kControl_Button_B999); mini_game_manager_ = GET_DIALOG_MANAGER(uiMiniGameMan, UIMAN_MINIGAME); for ( int i = 6575; i <= 6604; ++i ) { TextureListInfoHandleManager::Instance()->LoadIcon(i); } if ( number_texture_handle_ == INVALID_HANDLE_VALUE ) { number_texture_handle_ = g_pSunRenderer->x_pManagerTexture->LoadTexture("Data\\Interface\\etc\\number.tga",TLS_ORIGINAL_SIZE | TLS_NO_MULTITHREAD); } review_check_button_ = static_cast(GetControlWZ_byPosition(kControl_CheckButton_C000)); assert(review_check_button_); if ( review_check_button_ ) { review_check_button_->SetCheckState(false); } ResetBingoCheck(); } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::OnShowWindow( BOOL is_show ) { if ( is_show ) { keyMsg msg; ZeroMemory(&msg, sizeof(msg)); msg.dwType = eDoType_Bingo_Dialog; msg.wParam = IM_MINIGAME_MANAGER::BINGOGAME_DIALOG; msg.DoSomething = GlobalFunc::DoShowWindowEx; g_KeyQueueManager.PushBack(msg); } else { g_KeyQueueManager.DeleteMsg(eDoType_Bingo_Dialog); } } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::MessageProc( SI_MESSAGE* message ) { if ( IsLock() ) return; if ( GetMan() == NULL ) return; switch ( message->eResultMsg ) { case RT_MSG_LBUTTONCLICK: { OnLButtonClick(message); } break; default: SolarDialog::MessageProc(message); break; } } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::OnUpdateSolarDialog() { } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::OnRenderSolarDialog() { if ( bingo_map_.empty() == true ) { return; } for ( POSTYPE i = kPicture_0; i <= kPicture_24; ++i ) { std::map::iterator iter; for ( iter = bingo_map_.begin(); iter != bingo_map_.end(); ++iter ) { if ( (iter->second).pos == i ) { CCtrlPictureWZ* control = static_cast(GetControlWZ_byPosition(i)); if ( control ) { RECT control_rect = control->GetSizeRect(); if ( (iter->second).check == true ) { BASE_TextureListInfo* tex_info = NULL; // 6575 if ( (iter->second).value == FREE_NUMBER ) { HANDLE tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(6600, tex_info); g_pSunRenderer->RenderTexture(tex_handle, (float)control_rect.left, (float)control_rect.top, (float)control_rect.right - control_rect.left, (float)control_rect.bottom - control_rect.top, (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 { HANDLE tex_handle = TextureListInfoHandleManager::Instance()->GetTexture((iter->second).value - 1 + 6575, tex_info); g_pSunRenderer->RenderTexture(tex_handle, (float)control_rect.left, (float)control_rect.top, (float)control_rect.right - control_rect.left, (float)control_rect.bottom - control_rect.top, (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 { WzColor color[4]; color[0] = WzColor_RGBA(255, 255, 255, 255); color[1] = WzColor_RGBA(255, 255, 255, 255); color[2] = WzColor_RGBA(255, 255, 255, 255); color[3] = WzColor_RGBA(255, 255, 255, 255); BYTE digitarray[30]; int number_count = 0; number_count = MakeDigitArray((iter->second).value, digitarray); for (int i = 0; i < number_count; ++i) { if ( number_count >= 30 ) { break; } // À¯È¿¼º üũ if ( (digitarray[i] * 4 >= MAX_NUMBER_COORDINATE) || (digitarray[i] * 4 + 1 >= MAX_NUMBER_COORDINATE) || (digitarray[i] * 4 + 2 >= MAX_NUMBER_COORDINATE) || (digitarray[i] * 4 + 3 >= MAX_NUMBER_COORDINATE) ) { continue; } static int gap = 10; RECT result_rect = control_rect; result_rect.left = result_rect.left + gap; result_rect.top = result_rect.top + gap; result_rect.right = control_rect.right - control_rect.left; result_rect.bottom = control_rect.bottom - control_rect.top; result_rect.right = result_rect.right - gap; result_rect.bottom = result_rect.bottom - gap; static int offset = 4; result_rect.left -= offset; result_rect.top -= offset; if ( number_count == 1 ) { g_pSunRenderer->RenderTexture(number_texture_handle_, (float)result_rect.left + (result_rect.right / 2) + 4 - (result_rect.right / 4) - 2, (float)result_rect.top, (float)result_rect.right / 2 - 4, (float)result_rect.bottom, NumberCoordinate[digitarray[i] * 4], NumberCoordinate[digitarray[i] * 4 +1], NumberCoordinate[digitarray[i] * 4 +2] - NumberCoordinate[digitarray[i] * 4], NumberCoordinate[digitarray[i] * 4 +3] - NumberCoordinate[digitarray[i] * 4 +1], color ); } else { g_pSunRenderer->RenderTexture(number_texture_handle_, (float)result_rect.left + ((result_rect.right / number_count) * i), (float)result_rect.top, (float)result_rect.right / number_count, (float)result_rect.bottom, NumberCoordinate[digitarray[i] * 4], NumberCoordinate[digitarray[i] * 4 +1], NumberCoordinate[digitarray[i] * 4 +2] - NumberCoordinate[digitarray[i] * 4], NumberCoordinate[digitarray[i] * 4 +3] - NumberCoordinate[digitarray[i] * 4 +1], color ); } } } break; } } } } DrawBingoLine(); } //------------------------------------------------------------------------------ /** */ bool uiBingoGameDialog::OnLButtonClick( SI_MESSAGE* message ) { DWORD control_position = GetControlPosition_byID( message->dwCtrlID ); switch ( control_position ) { case kControl_Button_BT01: // º¸»ó ¹Þ±â { MSG_CG_CHARINFO_GET_MINIGAME_BINGO_REWARD_PACKET msg; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &msg, sizeof(msg)); } break; case kControl_Button_B999: { ShowInterface( FALSE ); } break; } return true; } //------------------------------------------------------------------------------ /** */ int uiBingoGameDialog::MakeDigitArray( int value, BYTE* digitarray ) { int iDigitcount = 0; // 0À̾ ÇѹøÀº ¾²µµ·ÏÇØÁÖÀÚ while (value >= 0) { BYTE number = (BYTE)(value % 10); digitarray[iDigitcount] = number; value /= 10; iDigitcount++; if (value == 0) break; assert(iDigitcount < 30); } // µÚÁýÀÚ~ int startindex = 0; int backindex = iDigitcount - 1; while(startindex < backindex) { digitarray[startindex] ^= digitarray[backindex]; digitarray[backindex] ^= digitarray[startindex]; digitarray[startindex] ^= digitarray[backindex]; startindex++; backindex--; } return iDigitcount; } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::ResetBingoCheck() { for ( BYTE i = 0; i < 12; ++i ) { bingo_check_[i] = false; } bingo_map_.clear(); TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, }; TCHAR result_string[INTERFACE_STRING_LENGTH] = {0, }; TCHAR number_string[INTERFACE_STRING_LENGTH] = {0, }; // 41853 : ºù°í %sÁÙ ¿Ï¼º g_InterfaceManager.GetInterfaceString(41853, format_string); _itoa(0, number_string, 10); Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string, number_string); CCtrlStaticWZ* control = static_cast(GetControlWZ_byPosition(kControl_Text_S000)); if ( control ) { control->SetTextWZ(result_string); } CCtrlButtonWZ* button_control = static_cast(GetControlWZ_byPosition(kControl_Button_BT01)); if ( button_control ) { button_control->ShowWindowWZ(WZ_HIDE); } } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::BingoCheck() { int line = 0; for ( BYTE i = 0; i < 25; i += 5 ) { if ( bingo_map_[i].check == true && bingo_map_[i+1].check == true && bingo_map_[i+2].check == true && bingo_map_[i+3].check == true && bingo_map_[i+4].check == true ) { bingo_check_[line] = true; } ++line; } for ( BYTE i = 0; i < 5; ++i ) { if ( bingo_map_[i].check == true && bingo_map_[i + 5].check == true && bingo_map_[i + 10].check == true && bingo_map_[i + 15].check == true && bingo_map_[i + 20].check == true ) { bingo_check_[line] = true; } ++line; } if ( bingo_map_[0].check == true && bingo_map_[6].check == true && bingo_map_[12].check == true && bingo_map_[18].check == true && bingo_map_[24].check == true ) { bingo_check_[line] = true; } ++line; if ( bingo_map_[4].check == true && bingo_map_[8].check == true && bingo_map_[12].check == true && bingo_map_[16].check == true && bingo_map_[20].check == true ) { bingo_check_[line] = true; } int total_line = 0; for ( BYTE i = 0; i < 12; ++i ) { if ( bingo_check_[i] == true ) { ++total_line; } } TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, }; TCHAR result_string[INTERFACE_STRING_LENGTH] = {0, }; TCHAR number_string[INTERFACE_STRING_LENGTH] = {0, }; // 41853 : ºù°í %sÁÙ ¿Ï¼º g_InterfaceManager.GetInterfaceString(41853, format_string); _itoa(total_line, number_string, 10); Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string, number_string); CCtrlStaticWZ* control = static_cast(GetControlWZ_byPosition(kControl_Text_S000)); if ( control ) { control->SetTextWZ(result_string); } if ( total_line > 0 ) { CCtrlButtonWZ* button_control = static_cast(GetControlWZ_byPosition(kControl_Button_BT01)); if ( button_control ) { button_control->ShowWindowWZ(WZ_SHOW); } } } //------------------------------------------------------------------------------ /** */ void uiBingoGameDialog::DrawBingoLine() { // °¡·Î for ( BYTE i = 0; i < 5; ++i ) { if ( bingo_check_[i] == true ) { CCtrlPictureWZ* control = static_cast(GetControlWZ_byPosition(i * 5)); CCtrlPictureWZ* second_control = static_cast(GetControlWZ_byPosition(i * 5 + 4)); if ( control && second_control ) { RECT control_rect = control->GetSizeRect(); RECT second_control_rect = second_control->GetSizeRect(); RECT result_rect; result_rect.left = control_rect.left; result_rect.top = control_rect.top; result_rect.right = second_control_rect.right - control_rect.left; result_rect.bottom = second_control_rect.bottom - control_rect.top; BASE_TextureListInfo* tex_info = NULL; HANDLE tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(6601, tex_info); result_rect.top = (control_rect.top + (result_rect.bottom / 2)) - (tex_info->tex_size.bottom / 2); g_pSunRenderer->RenderTexture(tex_handle, (float)result_rect.left, (float)result_rect.top, (float)result_rect.right, (float)tex_info->tex_size.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 ); } } } // ¼¼·Î for ( BYTE i = 5; i < 10; ++i ) { if ( bingo_check_[i] == true ) { CCtrlPictureWZ* control = static_cast(GetControlWZ_byPosition(i - 5)); CCtrlPictureWZ* second_control = static_cast(GetControlWZ_byPosition(i - 5 + 20)); if ( control && second_control ) { RECT control_rect = control->GetSizeRect(); RECT second_control_rect = second_control->GetSizeRect(); RECT result_rect; result_rect.left = control_rect.left; result_rect.top = control_rect.top; result_rect.right = control_rect.right - control_rect.left; result_rect.bottom = second_control_rect.bottom - control_rect.top; BASE_TextureListInfo* tex_info = NULL; HANDLE tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(6604, tex_info); result_rect.left = control_rect.left + ((control_rect.right - control_rect.left) / 2) - (tex_info->tex_size.right / 2); g_pSunRenderer->RenderTexture(tex_handle, (float)result_rect.left, (float)result_rect.top, (float)tex_info->tex_size.right, (float)result_rect.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 ); } } } // ÁÂÃøºÎÅÍ ¿ìÃø ´ë°¢¼± if ( bingo_check_[10] == true ) { CCtrlPictureWZ* control = static_cast(GetControlWZ_byPosition(0)); CCtrlPictureWZ* second_control = static_cast(GetControlWZ_byPosition(24)); if ( control && second_control ) { RECT control_rect = control->GetSizeRect(); RECT second_control_rect = second_control->GetSizeRect(); RECT result_rect; result_rect.left = control_rect.left; result_rect.top = control_rect.top; result_rect.right = second_control_rect.right - control_rect.left; result_rect.bottom = second_control_rect.bottom - control_rect.top; BASE_TextureListInfo* tex_info = NULL; HANDLE tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(6603, tex_info); g_pSunRenderer->RenderTexture(tex_handle, (float)result_rect.left, (float)result_rect.top, (float)result_rect.right, (float)result_rect.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 ); } } // ¿ìÃøºÎÅÍ ÁÂÃø ´ë°¢¼± if ( bingo_check_[11] == true ) { CCtrlPictureWZ* control = static_cast(GetControlWZ_byPosition(0)); CCtrlPictureWZ* second_control = static_cast(GetControlWZ_byPosition(24)); if ( control && second_control ) { RECT control_rect = control->GetSizeRect(); RECT second_control_rect = second_control->GetSizeRect(); RECT result_rect; result_rect.left = control_rect.left; result_rect.top = control_rect.top; result_rect.right = second_control_rect.right - control_rect.left; result_rect.bottom = second_control_rect.bottom - control_rect.top; BASE_TextureListInfo* tex_info = NULL; HANDLE tex_handle = TextureListInfoHandleManager::Instance()->GetTexture(6602, tex_info); g_pSunRenderer->RenderTexture(tex_handle, (float)result_rect.left, (float)result_rect.top, (float)result_rect.right, (float)result_rect.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 ); } } } void uiBingoGameDialog::BingoGameInfoSetting( MiniGameBingoInfos& minigame_bingo_infos ) { ResetBingoCheck(); for ( int i = 0; i < MINIGAME_BINGO_LENGTH; ++i ) { BingoData bingo_data; bingo_data.pos = i; if ( minigame_bingo_infos.m_bingo_infos[i].bingo_state == eMINIGAME_BINGO_STATE_FREE ) { bingo_data.value = FREE_NUMBER; } else { bingo_data.value = minigame_bingo_infos.m_bingo_infos[i].bingo_number; } if ( minigame_bingo_infos.m_bingo_infos[i].bingo_state == eMINIGAME_BINGO_STATE_FILLED || minigame_bingo_infos.m_bingo_infos[i].bingo_state == eMINIGAME_BINGO_STATE_FREE ) { bingo_data.check = true; } bingo_map_.insert(make_pair(i, bingo_data)); } BingoCheck(); if ( IsVisible() == FALSE && review_check_button_->GetCheckState() == false ) { ShowInterface(TRUE); } MainDialog2* main_dialog = GET_CAST_DIALOG(MainDialog2, IM_MENU_MANAGER::MAIN_DLG_2); if (main_dialog) { main_dialog->MiniGameToDisAbleButton(true); } set_is_enable(true); } #endif // _NA_008405_20150716_MINIGAME_BINGO