#include "SunClientPrecompiledHeader.h" #include "uiHelpMan/uiHelpMan.h" #include "uiHelpMonsterInfo.h" #include "Hero.h" #include "interfacemanager.h" #include "globalfunc.h" #include "ObjectManager.h" #include "HeroActionInput.h" #include "Monster.h" #include "SkillInfoParser.h" #include "DlgPosInfoParser.h" const int c_Help_iPageLine = 10; const int c_Help_TextLen = 512; const int c_Help_ListLine = 11; //------------------------------------------------------------------------------ WzID uiHelpMonsterInfo::m_wzId[DIALOG_MAX] = { StrToWzID("B999"), //DLGPOS_BTN_EXIT, StrToWzID("B001"), //DLGPOS_BTN_OK, StrToWzID("T001"), //DLGPOS_TXT_TITLE, StrToWzID("LS00"), //DLGPOS_LST_DESC, StrToWzID("S001"), //DLGPOS_SCR_VERTICAL, }; //------------------------------------------------------------------------------ /** »ý¼ºÀÚ */ uiHelpMonsterInfo::uiHelpMonsterInfo(InterfaceManager *pUIMan): uiBase(pUIMan), m_dwOldSelectId(0), m_pTitleControl(NULL), m_pListInfo(NULL), m_pScrollControl(NULL), m_iCurScrollPos(0), m_bTargeting(FALSE), m_eState(ST_INIT_NONE) { //¹öưÃʱâÈ­ memset ((CCtrlButtonWZ *)this->m_pBtnControls, NULL, sizeof (this->m_pBtnControls)); } uiHelpMonsterInfo::~uiHelpMonsterInfo(void) { this->Release(); } //------------------------------------------------------------------------------ /** */ void uiHelpMonsterInfo::Init(CDrawBase* pDrawBase) { uiBase::Init(pDrawBase); this->InitControls(); } //------------------------------------------------------------------------------ /** ÄÁÆ®·Ñ·¯ ÃʱâÈ­ */ void uiHelpMonsterInfo::InitControls() { this->m_pScrollControl = static_cast(this->getControl(DLGPOS_SCR_VERTICAL)); assert (this->m_pScrollControl); for (int i=0; im_pBtnControls[i] = static_cast(this->getControl(DLGPOS_BTN_EXIT + i)); assert (this->m_pBtnControls[i]); this->m_pBtnControls[i]->ShowWindowWZ(WZ_SHOW); } //1.ĸ¼Ç¸íÀ» ¹Ù²Û´Ù. if(m_pBtnControls[1]) GlobalFunc::SetCaption(m_pBtnControls[1], _T("¾øÀ½")); this->m_pTitleControl = static_cast(this->getControl(DLGPOS_TXT_TITLE )); assert (this->m_pTitleControl); CCtrlStaticWZ *pSubTitle = static_cast(GetControlWZ( StrToWzID("T002"))); //2.¼­ºêŸÀÌÆ²Àº °¡·ÁÁØ´Ù. if(pSubTitle) pSubTitle->ShowWindowWZ(WZ_HIDE); m_pListInfo = static_cast(this->getControl(DLGPOS_LST_DESC)); assert (m_pListInfo); //3.¸®½ºÆ®¸¦ ±âº»¼ÂÆÃ if(m_pListInfo) { m_pListInfo->SetUseReport(FALSE); m_pListInfo->SetSellHeight(22); } } //------------------------------------------------------------------------------ /** */ void uiHelpMonsterInfo::InsertSkillList(WORD wSkillCode,BOOL bSpecial) { BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)wSkillCode); if(!pInfo) return; m_vSkillCode.push_back(wSkillCode); TCHAR szString[c_Help_TextLen] = {0,}; if(bSpecial) Snprintf(szString, c_Help_TextLen-1, _T("Ư¼ö(%d):%s"),pInfo->m_SkillClassCode,pInfo->m_szSkillName); else Snprintf(szString, c_Help_TextLen-1, _T("½ºÅ³(%d):%s"),pInfo->m_SkillClassCode,pInfo->m_szSkillName); //¸®½ºÆ®¿¡ »ðÀÔÇÑ´Ù. if(_tcslen(szString) != 0) { int index = m_pListInfo->InsertItemBack(); COLORREF BaseColor = RGBA(120, 120, 120, 255); if(bSpecial) BaseColor = RGBA(255, 255, 0, 255); GlobalFunc::SetItem(m_pListInfo,index,0,szString,StrToWzID("mn12"), DT_LEFT | DT_VCENTER, RGBA(0,0,0,0), BaseColor, RGBA (0, 255, 0, 255)); } } //------------------------------------------------------------------------------ /** ¸ó½ºÅͽºÅ³Á¤º¸¸¦ ¼ÂÆÃÇÑ´Ù. */ void uiHelpMonsterInfo::SetMonsterInfo() { Monster *pMon = (Monster *)g_ObjectManager.GetObject(m_dwOldSelectId); if(!pMon) return; //STEP1:»ó´Ü ¸ó½ºÅÍ ·¹º§¹× À̸§Ãâ·Â TCHAR szString[c_Help_TextLen] = {0,}; GlobalFunc::SetCaption(m_pTitleControl, pMon->GetName()); //STEP2:ºÎȰ,Èú,¼Òȯ½ºÅ³ m_pListInfo->DeleteItemAll(); m_vSkillCode.clear(); WORD wSpecialSkill[3] = {pMon->GetMonsterInfo()->m_wReviveCode,pMon->GetMonsterInfo()->m_wHealCode,pMon->GetMonsterInfo()->m_wSummonCode}; int index = 0; //Ư¼ö½ºÅ³»ðÀÔ(3°³) for(int i=0;i<3;++i) { InsertSkillList(wSpecialSkill[i],TRUE); } //ÀϹݽºÅ³»ðÀԺκÐ(9°³) for(int i=0;i<9;++i) { InsertSkillList(pMon->GetMonsterInfo()->m_wSkillCode[i],FALSE); } //½ºÅ³Á¤º¸°¡ ÀüÇô¾ø´Ù if(m_vSkillCode.empty()) { index = m_pListInfo->InsertItemBack(); GlobalFunc::SetItem(m_pListInfo,index,0,_T("½ºÅ³¾ø´Â¸ó½ºÅÍ"),StrToWzID("mn12"), DT_LEFT | DT_VCENTER, RGBA(0,0,0,0), RGBA(255, 0, 0, 255), RGBA (255, 255, 255, 255)); } m_iCurScrollPos = 0; int iPage=(m_vSkillCode.size()-c_Help_ListLine); if(iPage<=0) iPage=0; m_pScrollControl->SetScrollRangeWZ(0,iPage); m_pScrollControl->SetScrollPosWZ(m_iCurScrollPos); m_pListInfo->SetBeginDrawIndex(m_iCurScrollPos); m_pListInfo->SetCurSel(-1); } //------------------------------------------------------------------------------ /** */ void uiHelpMonsterInfo::OnUpdateSolarDialog() { if(!m_pListInfo) return; DWORD dwTargetKey = g_HeroInput.GetCurrentTarget(); Character *pChr = (Character *)g_ObjectManager.GetObject(dwTargetKey); m_bTargeting =FALSE; //ŸÄÏÁ¸ÀçÀ¯¹« if(pChr) { if(pChr->IsKindOfObject(MONSTER_OBJECT)) { //ŸÄÏÆÃ¹Ù²î¾ú´ÂÁö:»óŰ¡ ¹Ù²î¾úÀ»¶§¸¸ °»½Å m_eState = (m_dwOldSelectId==dwTargetKey) ? (ST_NOT_CHANGED):(ST_TARGET_CHANGE); m_bTargeting = TRUE; } else { //¸ó½ºÅ;ƴÔ:»óŰ¡ ¹Ù²î¾úÀ»¶§¸¸ °»½Å m_eState = (m_eState==ST_NOT_MONSTER) ? (ST_NOT_CHANGED):(ST_NOT_MONSTER); } } else { //ŸÄϾøÀ½:»óŰ¡ ¹Ù²î¾úÀ»¶§¸¸ °»½Å m_eState = (m_eState==ST_TARGET_NONE || m_eState==ST_INIT_NONE ) ? (ST_NOT_CHANGED):(ST_TARGET_NONE); } //ŸÄÏÆÃÀÖÀ»°æ¿ì if(m_bTargeting) { Monster *pMon = (Monster *)pChr; SetMoveCaption(!pMon->GetSingMoveState()); } else { GlobalFunc::SetCaption(m_pBtnControls[1], _T("¾øÀ½")); } //¹Ù²îÁö¾Ê¾Ò´Ù¸é ¸®ÅÏ! if(m_eState==ST_NOT_CHANGED) return; //µðÆúÆ®¼ÂÆÃ m_dwOldSelectId =0; //½ºÅ×ÀÌÆ®¿¡ µû¶ó ¾÷µ¥ÀÌÆ®ÇÑ´Ù. switch(m_eState) { case ST_TARGET_NONE: //ŸÄÏÆÃ¾øÀ½ { GlobalFunc::SetCaption(m_pTitleControl, _T("ŸÄÏÆÃ¾øÀ½")); m_pListInfo->ShowWindowWZ(WZ_HIDE); } break; case ST_NOT_MONSTER: //¸ó½ºÅÍ¾Æ´Ô { GlobalFunc::SetCaption(m_pTitleControl, _T("¸ó½ºÅ;ƴÔ")); m_pListInfo->ShowWindowWZ(WZ_HIDE); } break; case ST_TARGET_CHANGE: //ŸÄϹٲñ { m_dwOldSelectId = dwTargetKey; SetMonsterInfo(); m_pListInfo->ShowWindowWZ(WZ_SHOW); } break; } } //------------------------------------------------------------------------------ /** À̵¿Ä¸¼Ç¼ÂÆÃ */ void uiHelpMonsterInfo::SetMoveCaption(BOOL bMove) { if(!m_pBtnControls[1]) return; if(bMove) GlobalFunc::SetCaption(m_pBtnControls[1], _T("À̵¿")); else GlobalFunc::SetCaption(m_pBtnControls[1], _T("Á¤Áö")); } //------------------------------------------------------------------------------ /** À̵¿Çϱâ */ void uiHelpMonsterInfo::ActionMove() { if(!m_bTargeting || !m_pListInfo) return; Monster *pMon=(Monster *)g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget()); if(!pMon) return; BOOL bSingleMove = pMon->GetSingMoveState(); pMon->SetSingMoveState(!bSingleMove); SetMoveCaption(bSingleMove); if(bSingleMove) { pMon->StopMove(); } } //------------------------------------------------------------------------------ /** ½ºÅ³¹ßµ¿ */ void uiHelpMonsterInfo::ActionSkill() { if(!m_pListInfo || m_pListInfo->GetCurSel()==-1 ) return; Monster *pMon=(Monster *)g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget()); if(!pMon) return; PLAYER_ACTION action; ZeroMemory(&action,sizeof(action)); action.SKILL.dwSkillID = m_vSkillCode[m_pListInfo->GetCurSel()]; action.ActionID = ACTION_SKILL; action.SKILL.dwTargetID = g_pHero->GetObjectKey(); action.SKILL.dwAttackSerial = 0; action.SKILL.vCurPos.wvPos =pMon->GetPosition(); action.SKILL.vCurPos.wTile = -1; action.SKILL.vDestPos.wvPos =pMon->GetPosition(); action.SKILL.vDestPos.wTile = -1; action.SKILL.vTargePos=g_pHero->GetVisiblePos(); if (GENERALPARAM->IsServerDebug()) { pMon->DoAction(&action); pMon->CommitChangeState(g_CurTime); } else { pMon->PutAction(&action); } } //------------------------------------------------------------------------------ /** ÇÁ·Î½ÃÁ® */ void uiHelpMonsterInfo::MessageProc( SI_MESSAGE * pMessage ) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; switch( pMessage->eResultMsg ) { case RT_MSG_LBUTTONDCLICK: { if( getCtrlIDToPos( pMessage->dwCtrlID )==DLGPOS_LST_DESC ) { ActionSkill(); } } break; case RT_MSG_LBUTTONCLICK: { switch( getCtrlIDToPos( pMessage->dwCtrlID ) ) { case DLGPOS_BTN_EXIT:ShowInterface(FALSE);break; case DLGPOS_BTN_OK:ActionMove();break; } } break; case RT_MSG_SB_PAGETOP: case RT_MSG_SB_LINETOP: { //.À­ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù. m_iCurScrollPos = this->m_pScrollControl->GetScrollPosWZ(); // ÇöÀç ½ºÅ©·Ñ °ªÀ» ¹Þ¾Æ ¿Â´Ù. int mmin = 0 , mmax = 0; this->m_pScrollControl->GetScrollRangeWZ( &mmin, &mmax ); // ½ºÅ©·Ñ °ªÀÇ ÃÖ´ë ÃÖ¼Ò¸¦ ¾ò¾î ¿Â´Ù. if(m_iCurScrollPos>mmin) // ÇöÀç ÀÔ·ÂµÈ ¶óÀμö º¸´Ù ÀÛÀ¸¸é { m_iCurScrollPos--; // ÇÑÁÙ °¨¼Ò ½Ã۰í this->m_pScrollControl->SetScrollPosWZ(m_iCurScrollPos); } } break; case RT_MSG_SB_PAGEBOTTOM: case RT_MSG_SB_LINEBOTTOM: { //.¾Æ·§ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù m_iCurScrollPos = this->m_pScrollControl->GetScrollPosWZ(); // ÇöÀç ½ºÅ©·Ñ °ªÀ» ¹Þ¾Æ ¿Â´Ù. int mmin = 0 , mmax = 0; this->m_pScrollControl->GetScrollRangeWZ( &mmin, &mmax ); // ½ºÅ©·Ñ °ªÀÇ ÃÖ´ë ÃÖ¼Ò¸¦ ¾ò¾î ¿Â´Ù. if(m_iCurScrollPosm_pScrollControl->SetScrollPosWZ(m_iCurScrollPos); } } break; case RT_MSG_SB_THUMBTRACK: case RT_MSG_SB_THUMBPOSITION: case RT_MSG_SB_ENDSCROLL: { m_iCurScrollPos = this->m_pScrollControl->GetScrollPosWZ(); // ÇöÀç ½ºÅ©·Ñ °ªÀ» ¹Þ¾Æ ¿Â´Ù. m_pScrollControl->SetScrollPosWZ(m_iCurScrollPos); } break; default: { SolarDialog::MessageProc( pMessage ); } break; } }