Files
Sun1602/Client/GameClient/Interface/uiHelpMonsterInfo/uiHelpMonsterInfo.cpp
T
2022-10-26 12:25:11 +08:00

412 lines
10 KiB
C++

#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<CCtrlVScrollWZ *>(this->getControl(DLGPOS_SCR_VERTICAL));
assert (this->m_pScrollControl);
for (int i=0; i<POS_BTN_SIZE; ++i)
{
this->m_pBtnControls[i] = static_cast<CCtrlButtonWZ *>(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<CCtrlStaticWZ *>(this->getControl(DLGPOS_TXT_TITLE ));
assert (this->m_pTitleControl);
CCtrlStaticWZ *pSubTitle = static_cast<CCtrlStaticWZ *>(GetControlWZ( StrToWzID("T002")));
//2.서브타이틀은 가려준다.
if(pSubTitle)
pSubTitle->ShowWindowWZ(WZ_HIDE);
m_pListInfo = static_cast<CCtrlListWZ *>(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_iCurScrollPos<mmax) // 현재 입력된 라인수 보다 작으면
{
m_iCurScrollPos++; // 한줄 증가 시키고
this->m_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;
}
}