Пример #1
0
BOOL CDlgEditAbility::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  여기에 추가 초기화 작업을 추가합니다.
	if( m_idName > 0 )
		m_strName = XTEXT( m_idName );
	if( m_idDesc > 0 )
		m_strDesc = XTEXT( m_idDesc );
	UPDATE_D2C();

	return TRUE;  // return TRUE unless you set the focus to a control
	// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
Пример #2
0
VOID CL_ThreadUnix::StartThread(const XCHAR* name)
{
    if (m_isAlive) // make sure do not chock in the CL_AutoSync while called by mutithread.
    {
        return;
    }

    CL_AutoSync cSync(m_cSyncObj);

    if (m_tid) return;

    // thread already started, meanwhile not ended, do not start again
    // thread already ran, but quit, then join the thread to release the resource
    if (m_isAlive)
    {
        return;
    }
    else if (m_tid)
    {
        Join();
    }

    if (name == NULL)
    {
        name = XTEXT("Unknown Thread");
        CL_PERROR("<<<< [%s] thread cannot be started.", name);
        return;
    }

    xcsncpy(m_szThreadName, name, CL_THREAD_NAME_LEN);
    m_szThreadName[CL_THREAD_NAME_LEN - 1] = TEXT('\0');

    m_bQuitFlg = FALSE;
    m_bSignalFlg = CL_FALSE;

    CL_ThreadSystemIF* pThreadSystem = NULL;
    if ((m_pThreadIF != NULL) && ((pThreadSystem = m_pThreadIF->GetThreadSystem()) != NULL))
    {
        BOOL ret = pThreadSystem->GetThreadTableInfo(m_szThreadName, m_aPrioTable, m_dwSanityInterval);
        if (!ret) {
            CL_PERROR("<<<< [%s] Get thread table info failed.", name);
            return;
        }
    }

    INT ret = pthread_create(&m_tid, &m_attr, ThreadProc,  this);

    if (0 == ret)
    {
        m_isAlive = CL_TRUE;
        CL_PRINTF(("<<<< Start thread [%s] TC: %lu.",  name, ::GetTickCount()));
    }
}
Пример #3
0
BOOL XPropHero::ReadProp( CToken& token )
{

	ID idProp = TokenGetNumber( token );
	if( GetpProp( idProp ) )
	{
		XERROR( "%s: duplication Mob ID. %d", GetstrFilename().c_str(), idProp );
		return FALSE;
	}
	if( idProp == TOKEN_EOF )
		return FALSE;		// false를 리턴해야 루프를 빠져나옴
	
	xPROP *pProp = new xPROP;		
	pProp->idProp = idProp;				// ID
	XBREAK( pProp->idProp > 0xffff );		// 이렇게 큰숫자를 쓰는건 권장하지 않음.
	
	pProp->strIdentifier = GetTokenIdentifier( token );					// 식별자
	int idText			= TokenGetNumber( token );						// 텍스트 ID
	pProp->strName		= XTEXT(idText);								// 이름
	pProp->attack		= token.GetNumberF();							// 공격력
	pProp->defense		= token.GetNumberF();							// 방어력
	pProp->hp			= token.GetNumberF();							// 체력
	pProp->attackSpeed	= token.GetNumberF();							// 공격속도
	pProp->moveSpeed		= token.GetNumberF();							// 이동속도
	
	pProp->strSpr = GetTokenString( token );							// spr 파일
	if( pProp->strSpr.empty() == false )
		pProp->strSpr += _T(".spr");
	else
		CONSOLE( "warning: identifier=%s, szSpr is empty", pProp->strIdentifier.c_str() );
	pProp->strIcon = GetTokenString( token );							// 아이콘 파일
	if( pProp->strIcon.empty() == false )
		pProp->strIcon += _T(".png");

	// 추가
	Add( pProp->strIdentifier, pProp );

	return TRUE;
}
Пример #4
0
int XSceneTrader::OnClickTrade(XWnd *pWnd, DWORD p1, DWORD p2)
{
	// 거래할 총 금액 체크
	if (m_totalGold <= 0)
		return 1;
	// 팝업
	auto pAlert = XWND_ALERT_OKCANCEL_T("wnd.trade.confirm", _T("%s"), XTEXT(80135) );
	if( pAlert ) {
		pAlert->SetEvent( XWM_OK, this, &XSceneTrader::OnClickTradeOK );
		pAlert->SetEvent( XWM_CANCEL, this, &XSceneTrader::OnClickTradeCancel );
	}
// 	m_Layout.CreateLayout("commontextpopup", this);
// 	XWnd *pPopup = Find("img.common.popuptext");
// 	if (pPopup) {
// 		pPopup->SetbModal(TRUE);
// 		xSET_TEXT(this, "text.title", XTEXT(80151));			// "자원거래"
// 		xSET_TEXT(this, "text.common.ask", XTEXT(80135));		// "자원을 거래하시겠습니까?"
// 		xSET_BUTT_TEXT(this, "butt.confirm", XTEXT(80028));			// "거래"
// 		xSET_BUTT_HANDLER(this, "butt.confirm", &XSceneTrader::OnClickTradeOK);
// 		xSET_BUTT_HANDLER(this, "butt.cancel", &XSceneTrader::OnClickPopupCancel);
// 	}
	return 1;
}
Пример #5
0
/* PROGRAM: rlaiopn - open the	after-image (transaction-log) file
 *
 *
   Updates:
	    allocates an aictl
	    aictl.aibktbl will be setup.  If the ai is opened for output,
			  then that buffer will contain the current output
			  block of the ai file (the last block containing
			  valid data).	If the ai is opened for input,
			  then that buffer will contain the first blk of
			  the ai file.
	    aictl.aimode  will be set appropriately
	    aictl.aisize - physical EOF
	    aictl.ailoc  - input: start of file, output: logical EOF
	    aictl.aiofst - offset of ailoc within current ai block

   Some of the updates is diffrent for an off-line Transaction-log file
   which doe not use the noral AI mechanism, but is very similar to it.
									
 * NOTE: rlaiopn can be called by normal progress to open the .ai file	*
 *	 for input or output.						*
 *									*
 *	When being called for output, The caller should check		*
 *	pmstrblk->mb_ai.ainew and should not call rlaiopn if it is 0.	*
 *
 * RETURNS: 0 - on success
 *         -1 - on failure
 *          1 - only a partial ai file was detected
 */
int
rlaiopn(
	dsmContext_t	*pcontext,
	int  aimode,        /* AIINPUT or AIOUTPUT	*/
	TEXT *pname,        /* name of the .ai file	*/
	int  execmode,      /* non-zero => open for input with intent to rf */
	int  tmplog,        /* 1 for off-line TL file.   */
        int  retry)         /* 1 - retry active, 0 - retry inactive */  
{
    dbcontext_t     *pdbcontext = pcontext->pdbcontext;
    MSTRBLK *pmstr = pdbcontext->pmstrblk;
    AICTL	*paictl;
    AIBLK	*paiblk;
    BKTBL	*pbktbl;
struct  bkftbl  *pbkftbl = (struct bkftbl *)NULL;
    COUNT 	 buffmode;
    LONG	 ret;
    TEXT         timeString[TIMESIZE];
    UCOUNT       returnCode = 0;

    if (aimode == AIOUTPUT && pmstr->mb_aisync==UNBUFFERED && !tmplog)
	buffmode = UNBUFFERED;
    else buffmode = BUFFERED;

    /* allocate all buffers and control structures */
    rlaiseto (pcontext);

    /* get local pointer to global structure */
    paictl = pdbcontext->paictl;

    /* get the ai file size in bytes */
    if( pmstr->mb_aibusy_extent > (TEXT)0 )
    {
	/* using an extent, get the length of busy extent */
        paictl->aisize = rlaielen(pcontext, paictl->aiArea);
    }
    else
    {
	/* *** TODO: bkflen returns size in terms of database blocks */
	/* using a named file get the length directly */
        paictl->aisize = bkflen(pcontext, paictl->aiArea) *
            pdbcontext->pmstrblk->mb_aiblksize;
    }

    /* read the first ai block into current buffer */
    pbktbl = &(XAIBUF(pdbcontext, paictl->aiqcurb)->aibk);
    pbktbl->bt_dbkey = 0L;
    bkRead(pcontext, pbktbl);
    paiblk = XAIBLK(pdbcontext, pbktbl->bt_qbuf);

    /* Make sure we have a compatible version                */
    if (rlaiVersion(pcontext, paiblk))
    {
	/* AI file cannot be used with this database */
	MSGN_CALLBACK(pcontext, rlMSG094);
	return -1;
    }

    /* make sure blocksize matches database */
    if (rlaiblksize(pcontext, paiblk, paictl))
    {
	/* AI file cannot be used with this database */
	MSGN_CALLBACK(pcontext, rlMSG094);
	return -1;
    }

    /* Make sure the file is complete, BUG# 20000510-002 */
    if ( rlaiCompare(pcontext, paiblk, paictl) )
    {
        /* File lengths don't compare for whatever reason.
           Prohibit the ai seq num from being incremented so if the user 
           happens to find the correct, full ai file they can retry. */

        returnCode = 1;
    }

    /* setup for reading (rollforward) or writing (logging) to file */
    if (aimode == AIINPUT)
    {
	if ( execmode )
	{
         if ( retry )
            {
                /* Retry is activate - check extent status */
                if( paiblk->aifirst.aiextstate == AIEXTEMPTY )
                {
                    /* That's because this is an empty ai extent */
                    MSGN_CALLBACK(pcontext, rlMSG058);
                    return -1;
                }
                /* Ensure ai in proper sequence. */
                pmstr->mb_aiseq = pmstr->mb_aiseq ? pmstr->mb_aiseq : 1;
                if (paiblk->aifirst.aidates.aigennbr != pmstr->mb_aiseq)
                {
                    /* This ai file is not in the proper sequence for rretry. */
     /* Expected ai file number %l but file sepecified is %l in sequence. */
                    MSGN_CALLBACK(pcontext, rlMSG140, pmstr->mb_aiseq,
                                  paiblk->aifirst.aidates.aigennbr);
                    return -1;
                }
            }
            else if  (paiblk->aifirst.lstmod != pmstr->mb_lstmod )
	    {
		/* the time stamps dont match */
		if( paiblk->aifirst.aiextstate == AIEXTEMPTY )
		{
		    /* That's because this is an empty ai extent */
		    MSGN_CALLBACK(pcontext, rlMSG058);
		}
		else
		{
                    /* Ensure ai in proper sequence. */
                    pmstr->mb_aiseq = pmstr->mb_aiseq ? pmstr->mb_aiseq : 1;
                    if (paiblk->aifirst.aidates.aigennbr != pmstr->mb_aiseq)
                    {
                        /* ai file is not in the proper sequence for rollf. */
    /* "Expected ai file number %l but file sepecified is %l in sequence." */
                        MSGN_CALLBACK(pcontext, rlMSG140, pmstr->mb_aiseq,
                                      paiblk->aifirst.aidates.aigennbr);
                    }
		    MSGN_CALLBACK(pcontext, rlMSG001,
                                uttime((time_t *)&pmstr->mb_lstmod, timeString,
                                       sizeof(timeString)));
		    MSGN_CALLBACK(pcontext, rlMSG002,
		                  uttime((time_t *)&paiblk->aifirst.lstmod,
                                         timeString, sizeof(timeString)));
		    MSGN_CALLBACK(pcontext, rlMSG003);
		}
		return -1;
	    }
	}

	/* Init for reading from beginning of file */
	paictl->aiofst = paiblk->aihdr.aihdrlen;
	paictl->ailoc = pbktbl->bt_dbkey;
	paictl->aimode = AIINPUT;
    }
    else
    {
	/* file is being opened for output (logging) check the dates */
	if (paiblk->aifirst.aidates.aiopen != pmstr->mb_ai.aiopen)
        {
	    /* time stamps dont match */
            if( (pname == NULL) && 
                (pdbcontext->pmstrblk->mb_aibusy_extent > (TEXT)0) )
            {
		/* Means its an ai extent file */
		ret = bkGetAreaFtbl(pcontext, paictl->aiArea,&pbkftbl);
		pbkftbl += pdbcontext->pmstrblk->mb_aibusy_extent - 1;
                pname = XTEXT(pdbcontext, pbkftbl->ft_qname);
	    }
	    MSGN_CALLBACK(pcontext, rlMSG045, pname);
	    return -1;
	}

	/* get the current date/time and put into ai block */
	time(&paiblk->aifirst.aidates.aiopen);

	/* put time into masterblock */
	pmstr->mb_ai.aiopen = paiblk->aifirst.aidates.aiopen;

	/* write out both blocks */
	bkWrite(pcontext, pbktbl, UNBUFFERED);
	bmFlushMasterblock(pcontext);

	/* initialize ai control structure for logging */
        paictl->aiupdctr = paiblk->aifirst.aifirstctr;
        paictl->ailoc = pbktbl->bt_dbkey;
        paictl->aiofst = paiblk->aihdr.aihdrlen;
	paictl->aimode = AIOUTPUT;
    }
    /* done. ready to go */

    if ( returnCode )
    {
        /* detected partial ai file */
        return (1);
    }
    else
    {
        /* success */
        return (returnCode);
    }
}
Пример #6
0
void XSceneTrader::UILoad()
{
	// UI 로드
	m_Layout.CreateLayout("common_bg", this);
//	m_Layout.CreateLayout("common_bg_goldcash", this);

	m_Layout.CreateLayout("trader_bg", this);
	m_Layout.CreateLayout("slidertab", this);
	m_Layout.CreateLayout("resourcetab", this);
	xSET_BUTT_HANDLER(this, "butt.back", &XSceneTrader::OnBack);		// 백버튼

	xSET_BUTT_HANDLER(this, "butt.trader.trade", &XSceneTrader::OnClickTrade);		// 거래 버튼
	xSET_BUTT_HANDLER(this, "butt.trader.cancel", &XSceneTrader::OnClickTradeCancel);	// 취소 버튼

	// 자원 아이콘 Min, Max 버튼
	xSET_BUTT_HANDLER_PARAM(this, "img.trader.wood", this, &XSceneTrader::OnClickResource, XGAME::xRES_WOOD);
	xSET_BUTT_HANDLER_PARAM(this, "img.trader.iron", this, &XSceneTrader::OnClickResource, XGAME::xRES_IRON);
	xSET_BUTT_HANDLER_PARAM(this, "img.trader.jewel", this, &XSceneTrader::OnClickResource, XGAME::xRES_JEWEL);
	xSET_BUTT_HANDLER_PARAM(this, "img.trader.sulfur", this, &XSceneTrader::OnClickResource, XGAME::xRES_SULFUR);
	xSET_BUTT_HANDLER_PARAM(this, "img.trader.mandrake", this, &XSceneTrader::OnClickResource, XGAME::xRES_MANDRAKE);

	// 슬라이더
	XWnd *pWnd;
	pWnd = new XWndSliderOption(270.f, 106.f, 115.f, 15.f, 0, 1.0f, 0);
	pWnd->SetEvent(XWM_SLIDING, this, &XSceneTrader::OnSlidingResource0);
	m_slider[0] = static_cast<XWndSliderOption*>(pWnd);
	Add(pWnd);

	pWnd = new XWndSliderOption(270.f, 160.f, 115.f, 15.f, 0, 1.0f, 0);
	pWnd->SetEvent(XWM_SLIDING, this, &XSceneTrader::OnSlidingResource1);
	m_slider[1] = static_cast<XWndSliderOption*>(pWnd);
	Add(pWnd);

	pWnd = new XWndSliderOption(270.f, 214.f, 115.f, 15.f, 0, 1.0f, 0);
	pWnd->SetEvent(XWM_SLIDING, this, &XSceneTrader::OnSlidingResource2);
	m_slider[2] = static_cast<XWndSliderOption*>(pWnd);
	Add(pWnd);

	pWnd = new XWndSliderOption(270.f, 268.f, 115.f, 15.f, 0, 1.0f, 0);
	pWnd->SetEvent(XWM_SLIDING, this, &XSceneTrader::OnSlidingResource3);
	m_slider[3] = static_cast<XWndSliderOption*>(pWnd);
	Add(pWnd);

	pWnd = new XWndSliderOption(270.f, 322.f, 115.f, 15.f, 0, 1.0f, 0);
	pWnd->SetEvent(XWM_SLIDING, this, &XSceneTrader::OnSlidingResource4);
	m_slider[4] = static_cast<XWndSliderOption*>(pWnd);
	Add(pWnd);

	// 리소스 텍스트
	xSET_TEXT(this, "text.trader.resource0", XE::Format(_T("%d / %d "), 0, ACCOUNT->GetResource(XGAME::xRES_WOOD)));
	xSET_TEXT(this, "text.trader.resource1", XE::Format(_T("%d / %d"), 0, ACCOUNT->GetResource(XGAME::xRES_IRON)));
	xSET_TEXT(this, "text.trader.resource2", XE::Format(_T("%d / %d"), 0, ACCOUNT->GetResource(XGAME::xRES_JEWEL)));
	xSET_TEXT(this, "text.trader.resource3", XE::Format(_T("%d / %d"), 0, ACCOUNT->GetResource(XGAME::xRES_SULFUR)));
	xSET_TEXT(this, "text.trader.resource4", XE::Format(_T("%d / %d"), 0, ACCOUNT->GetResource(XGAME::xRES_MANDRAKE)));

	// 자원 시세 텍스트
	xSET_TEXT(this, "text.trader.rate0", XE::Format(XTEXT(80058), XGC->m_resourceRate[XGAME::xRES_WOOD]));
	xSET_TEXT(this, "text.trader.rate1", XE::Format(XTEXT(80058), XGC->m_resourceRate[XGAME::xRES_IRON]));
	xSET_TEXT(this, "text.trader.rate2", XE::Format(XTEXT(80058), XGC->m_resourceRate[XGAME::xRES_JEWEL]));
	xSET_TEXT(this, "text.trader.rate3", XE::Format(XTEXT(80058), XGC->m_resourceRate[XGAME::xRES_SULFUR]));
	xSET_TEXT(this, "text.trader.rate4", XE::Format(XTEXT(80058), XGC->m_resourceRate[XGAME::xRES_MANDRAKE]));

	// 자원 시세 임시
	/*
	xSET_TEXT(this, "text.trader.rate0", XE::Format(XTEXT(80058), 1));
	xSET_TEXT(this, "text.trader.rate1", XE::Format(XTEXT(80058), 1));
	xSET_TEXT(this, "text.trader.rate2", XE::Format(XTEXT(80058), 1));
	xSET_TEXT(this, "text.trader.rate3", XE::Format(XTEXT(80058), 1));
	xSET_TEXT(this, "text.trader.rate4", XE::Format(XTEXT(80058), 1));
	*/

	// 전체 교환 금액 텍스트
	xSET_TEXT(this, "text.trader.totalgold", XE::Format(_T("%d"), 0));
}
Пример #7
0
int XSceneTrader::OnClickRecall(XWnd *pWnd, DWORD p1, DWORD p2)
{
	int idWhistle = XGC->m_traderRecallItem;		// 휘슬 아이템 ID
//	unsigned int gemNum = XGC->m_traderRecallGem;		// 소모되는 젬량
	int gemNum = ACCOUNT->GetCashForTraderRecall();

	XList4<XBaseItem*> itemList;
	ACCOUNT->GetInvenItem(itemList);		// 인벤토리 얻어오기

	bool bWhistle = false;		// 휘슬 아이템 유무

	// 휘슬 아이템 있는지 체크
	int i = 0;
	for( auto pItem : itemList ) {
		if( pItem->GetidProp() == idWhistle ) {
			bWhistle = true;
			break;
		}
		++i;
	}
	if (bWhistle) {
		// 휘슬 아이템이 있으면
		// 팝업
		auto pPopup = new XWndPopup( _T("trade_confirm.xml"), "popup", this );
		if( pPopup ) {
			pPopup->SetEvent( XWM_OK, 
												this,
												&XSceneTrader::OnClickRecallOK,
												XGAME::xSC_SPENT_ITEM );
			xSET_TEXT( pPopup, "text.title", XTEXT( 80130 ) );
			xSET_TEXT( pPopup, "text.msg", XTEXT( 80148 ) );
			xSET_TEXT( pPopup, "text.label", XTEXT( 80132 ) );
			auto pProp = PROP_ITEM->GetpProp( idWhistle );
			if( pProp )
				xSET_IMG( pPopup, "img.ask.itemimg", XE::MakePath( DIR_IMG, pProp->strIcon ) );
		}
		Add( pPopup );
// 		m_Layout.CreateLayout("commonitemtextpopup", this);
// 
// 		XWnd *pPopup = Find("img.common.popupitemtext");
// 		if (pPopup)
// 		{
// 			pPopup->SetbModal(TRUE);
// 
// 			xSET_TEXT(this, "text.title", XTEXT(80130));			// "즉시호출"
// 			xSET_TEXT(this, "text.common.ask", XTEXT(80148));		// "아이템을 사용하여 무역상을 즉시 호출하시겠습니까?"
// 			xSET_BUTT_TEXT(this, "butt.confirm", XTEXT(80132));			// "호출"
// 
// 			xSET_IMG(this, "img.ask.itemimg", XE::MakePath(DIR_IMG, PROP_ITEM->GetpProp(whistleItemID)->strIcon.c_str()));
// 
// 			xSET_BUTT_HANDLER_PARAM(this, "butt.confirm", this, &XSceneTrader::OnClickRecallOK, XGAME::xSC_SPENT_ITEM);
// 			xSET_BUTT_HANDLER(this, "butt.cancel", &XSceneTrader::OnClickPopupCancel);
// 		}
	}	else	{
	// 휘슬 아이템이 없으면
	if( ACCOUNT->IsEnoughCash( gemNum ) ) {
		// 팝업
		auto pPopup = new XWndPaymentByCash( XTEXT(80149), XTEXT(80130) );
		pPopup->SetItem( (ID)XGC->m_traderRecallItem, gemNum );
		Add( pPopup );
		pPopup->SetEvent( XWM_OK, 
											this, 
											&XSceneTrader::OnClickRecallOK, 
											XGAME::xSC_SPENT_GEM );
		// 		auto pPopup = new XWndPopup( _T( "trade_confirm.xml" ), "popup", this );
// 		if( pPopup ) {
// 			xSET_BUTT_HANDLER_PARAM( pPopup, "butt.ok", 
// 															 this, 
// 															 &XSceneTrader::OnClickRecallOK, 
// 															 XGAME::xSC_SPENT_ITEM );
// 			xSET_TEXT( pPopup, "text.title", XTEXT( 80130 ) );
// 			xSET_TEXT( pPopup, "text.msg", XTEXT( 80149 ), gemNum );
// 			xSET_TEXT( pPopup, "text.label", XTEXT( 80132 ) );
// 			auto pProp = PROP_ITEM->GetpProp( whistleItemID );
// 			if( pProp )
// 				xSET_IMG( pPopup, "img.ask.itemimg", XE::MakePath( DIR_IMG, pProp->strIcon ) );
// 		}
// 		Add( pPopup );
		// 			m_Layout.CreateLayout("commonitemtextpopup", this);
// 			XWnd *pPopup = Find("img.common.popupitemtext");
// 			if (pPopup)			{
// 				pPopup->SetbModal(TRUE);
// 
// 				xSET_TEXT(this, "text.title", XTEXT(80130));			// "즉시호출"
// 				xSET_TEXT(this, "text.common.ask", XE::Format(XTEXT(80149), gemNum));		// "아이템이 부족합니다. 캐쉬 %d개를 이용하여 즉시 호출하시겠습니까?"
// 				xSET_BUTT_TEXT(this, "butt.confirm", XTEXT(80132));			// "호출"
// 
// 				xSET_IMG(this, "img.ask.itemimg", XE::MakePath(DIR_IMG, PROP_ITEM->GetpProp(whistleItemID)->strIcon.c_str()));
// 
// 				xSET_BUTT_HANDLER_PARAM(this, "butt.confirm", this, &XSceneTrader::OnClickRecallOK, XGAME::xSC_SPENT_GEM);
// 				xSET_BUTT_HANDLER(this, "butt.cancel", &XSceneTrader::OnClickPopupCancel);
// 			}
	} else {
		// 휘슬 아이템도 업고 캐쉬도 부족
		// 팝업
		XWND_ALERT_T( _T("%s"), XTEXT(80150) );
// 			auto pPopup = new XWndPopup( _T( "trade_confirm.xml" ), "popup" );
// 			if( pPopup ) {
// 				xSET_BUTT_HANDLER_PARAM( pPopup, "butt.confirm", this, &XSceneTrader::OnClickRecallOK, XGAME::xSC_SPENT_GEM );
// 			}
// 			Add( pPopup );
// 			m_Layout.CreateLayout( "commontextpopup", this );
// 
// 			XWnd *pPopup = Find( "img.common.popuptext" );
// 			if( pPopup ) {
// 				pPopup->SetbModal( TRUE );
// 
// 				xSET_TEXT( this, "text.title", XTEXT( 80130 ) );			// "즉시호출"
// 				xSET_TEXT( this, "text.common.ask", XTEXT( 80150 ) );		// "아이템과 캐쉬가 부족합니다. 구매해주세요"
// 				xSET_BUTT_TEXT( this, "butt.confirm", XTEXT( 2 ) );				// "확인"
// 
// 				xSET_BUTT_HANDLER( this, "butt.confirm", &XSceneTrader::OnClickPopupCancel );
// 				xSET_BUTT_HANDLER( this, "butt.cancel", &XSceneTrader::OnClickPopupCancel );
// 			}
	}
}
	return 1;
}
Пример #8
0
// 스킬파라메터 상수 등록
void XESkillMng::AddConstant( void )
{
	XBREAK( CONSTANT == NULL );
	CONSTANT->Add( XSKTEXT( 48 ), xPASSIVE );
	CONSTANT->Add( XSKTEXT( 49 ), xACTIVE );
	CONSTANT->Add( XSKTEXT( 197 ), xABILITY );
	CONSTANT->Add( XSKTEXT( 19 ), xBST_SELF );			// 자신
	CONSTANT->Add( XSKTEXT( 14 ), xBST_CURR_TARGET );	// 현재타겟
	CONSTANT->Add( XSKTEXT( 66 ), xBST_POSITION );	// 좌표
	CONSTANT->Add( XSKTEXT( 202 ), xBST_CONDITION );	// 조건
	CONSTANT->Add( XSKTEXT( 203 ), xBTC_LEAST_HP_PARTY );	// 가장체력이적은부대
	CONSTANT->Add( XSKTEXT( 204 ), xBTC_HIGHEST_HP_PARTY );	// 가장체력이많은부대
	CONSTANT->Add( XTEXT( 1075 ), xBTC_CURR_TARGET_LEADER );	// 기준타겟리더
	CONSTANT->Add( XSKTEXT( 229 ), xBTC_RANDOM );				// 랜덤파티

	CONSTANT->Add( XSKTEXT( 57 ), xCST_BASE_TARGET );		// 기준타겟
	CONSTANT->Add( XSKTEXT( 147 ), xCST_BASE_TARGET_RADIUS );	// 기준타겟반경
	CONSTANT->Add( XSKTEXT( 58 ), xCST_BASE_TARGET_SURROUND );	// 기준타겟주변
	CONSTANT->Add( XSKTEXT( 59 ), xCST_BASE_TARGET_POS );	// 기준타겟좌표
	CONSTANT->Add( XSKTEXT( 198 ), xCST_BASE_TARGET_PARTY );	// 기준타겟파티
	CONSTANT->Add( XSKTEXT(45 ),  0xffffffff );		// 모두
	CONSTANT->Add( XSKTEXT( 146 ), xIVT_CAST_TARGET );	// 시전대상
	CONSTANT->Add( XSKTEXT( 148 ), xIVT_CAST_TARGET_RADIUS );	// 시전대상반경
	CONSTANT->Add( XSKTEXT( 149 ), xIVT_CAST_TARGET_SURROUND );	// 시전대상주변
	CONSTANT->Add( XSKTEXT( 150 ), xIVT_CAST_TARGET_PARTY );	// 시전대상파티
	CONSTANT->Add( XSKTEXT( 240 ), xIVT_CAST_TARGET_POS );	// 시전대상좌표
	CONSTANT->Add( XSKTEXT( 241 ), xIVT_CAST_POS_RADIUS );	// 시전좌표반경
	CONSTANT->Add( XSKTEXT( 108 ), xIVT_ATTACKER );	// 타격자
	CONSTANT->Add( XSKTEXT( 247 ), xIVT_ATTACKER );	// 공격자
	CONSTANT->Add( XSKTEXT( 109 ), xIVT_ATTACKED_TARGET );	// 피격자
	CONSTANT->Add( XSKTEXT( 222 ), xIVT_ATTACKED_TARGET_RADIUS );
	CONSTANT->Add( XSKTEXT( 223 ), xIVT_ATTACKED_TARGET_SURROUND );
	CONSTANT->Add( XSKTEXT( 224 ), xIVT_ATTACKED_TARGET_PARTY );
	CONSTANT->Add( XSKTEXT( 225 ), xIVT_CURR_TARGET );
	CONSTANT->Add( XSKTEXT( 260 ), xIVT_CURR_TARGET_PARTY );
	CONSTANT->Add( XSKTEXT( 267 ), xIVT_CURR_TARGET_POS );
//	CONSTANT->Add( XSKTEXT( 236 ), xIVT_ALL );	// 모두(위에 50번("모두")의 0xffffffff과 중복되어서 안넣음.
//	CONSTANT->Add( XSKTEXT( 230 ), xIVT_CONDITION );		// 조건발동
	
	CONSTANT->Add( XSKTEXT(50 ), xfALLY );	// 아군
	CONSTANT->Add( XSKTEXT(144 ), xfALLY );	// 우군
	CONSTANT->Add( XSKTEXT(51 ), xfHOSTILE );
	CONSTANT->Add( XSKTEXT(52 ), xfHOSTILE );
	CONSTANT->Add( XSKTEXT(53 ), xfNEUTRALITY );
	CONSTANT->Add( XSKTEXT(54 ), xfNEUTRALITY );
	CONSTANT->Add( XSKTEXT(55 ), xfHUMAN );
	CONSTANT->Add( XSKTEXT(56 ), xfAI );
	CONSTANT->Add( XSKTEXT(185), xTR_ONE );
	CONSTANT->Add( XSKTEXT(186), xTR_CIRCLE );
	CONSTANT->Add( XSKTEXT(62), xTR_LINE );
//	CONSTANT->Add( XSKTEXT(63), xTR_LINE );
	CONSTANT->Add( XSKTEXT(145), xTR_FAN );
	CONSTANT->Add( XSKTEXT(187), xTR_RECT );
	CONSTANT->Add( XSKTEXT(188), xTR_GROUP );
	CONSTANT->Add( XSKTEXT(183), xTC_NEAREST );	// 가장가까운
//	CONSTANT->Add( XSKTEXT(201), xPT_TARGET_POS_CENTER );	// 타겟중심좌표
//	CONSTANT->Add( XSKTEXT(66 ), xATTACK );
	CONSTANT->Add( XSKTEXT(94 ), xAL_LOOP );
	CONSTANT->Add( XSKTEXT(95 ), xAL_ONCE );
	CONSTANT->Add( XSKTEXT(110), xJC_FIRST );
	CONSTANT->Add( XSKTEXT(18), xJC_HIT_POINT );	// 슈팅타겟이펙트타점
	CONSTANT->Add( XSKTEXT(111), xJC_ATTACK );
	CONSTANT->Add( XSKTEXT(113), xJC_DEFENSE );
	CONSTANT->Add( XSKTEXT(114), xJC_EVADE );
	CONSTANT->Add( XSKTEXT(115), xJC_DEAD );
	CONSTANT->Add( XSKTEXT(117), xJC_KILL_ENEMY );
	CONSTANT->Add( XSKTEXT(221), xJC_ALL_HIT );		// 모든피격시
	CONSTANT->Add( XSKTEXT(112), xJC_ALL_HIT );		// 피격시
	CONSTANT->Add( XSKTEXT(123), xJC_CLOSE_HIT );
	CONSTANT->Add( XSKTEXT(124), xJC_RANGE_HIT );
	CONSTANT->Add( XSKTEXT(168), xJC_CLOSE_ATTACK );
	CONSTANT->Add( XSKTEXT(234), xJC_RANGE_ATTACK_START );	// 원거리공격시
	CONSTANT->Add( XSKTEXT(169), xJC_RANGE_ATTACK_ARRIVE );		// 원거리타격시
	CONSTANT->Add( XSKTEXT(263), xJC_RANGE_ATK_NORMAL_REPLACEMENT );	// 원거리평타대체
	CONSTANT->Add( XSKTEXT(170), xJC_LAST );
	CONSTANT->Add( XSKTEXT(231), xJC_ARRIVE_TARGET );
	CONSTANT->Add( XSKTEXT( 238 ), xJC_HP_UNDER );		// 체력이하
	
	CONSTANT->Add( XSKTEXT(138), xPT_TARGET_BOTTOM );
	CONSTANT->Add( XSKTEXT(256), xPT_TARGET_TRACE_BOTTOM );
	CONSTANT->Add( XSKTEXT(139), xPT_TARGET_TOP );
	CONSTANT->Add( XSKTEXT(140), xPT_TARGET_CENTER );
	CONSTANT->Add( XSKTEXT(174), xPT_TARGET_POS );
	CONSTANT->Add( XSKTEXT(253 ), xPT_TARGET_TRACE_CENTER );
	CONSTANT->Add( XSKTEXT( 255 ), xPT_TARGET_TRACE_POS );
	CONSTANT->Add( XSKTEXT( 259 ), xPT_TARGET_TRACE_TOP );
	CONSTANT->Add( XSKTEXT(141), xPT_ACTION_EVENT );
	CONSTANT->Add( XSKTEXT(142), xPT_WINDOW_CENTER );
	CONSTANT->Add( XSKTEXT(143), xPT_WINDOW_CENTER_BOTTOM );
	CONSTANT->Add( XSKTEXT(180), xPT_WINDOW_CENTER_BOTTOM );
	CONSTANT->Add( XSKTEXT(172), 1 );	// 가능
	CONSTANT->Add( XSKTEXT(173), 0);	// 불가능
	CONSTANT->Add( XSKTEXT(176), xTL_LIVE );	// 생존
	CONSTANT->Add( XSKTEXT(178), xTL_LIVE );	// 생존자
	CONSTANT->Add( XSKTEXT(177), xTL_DEAD );	// 사망
	CONSTANT->Add( XSKTEXT(179), xTL_DEAD );	// 사망자
	// 발동대상조건
	CONSTANT->Add( XSKTEXT( 215 ), xCOND_HARD_CODE );	// 하드코딩
	CONSTANT->Add( XSKTEXT( 212 ), xATTACK_TARGET_JOB );	// 공격대상직업
	CONSTANT->Add( XSKTEXT( 213 ), xATTACK_TARGET_TRIBE );	// 공격대상종족
	CONSTANT->Add( XSKTEXT( 214 ), xATTACK_TARGET_SIZE );	// 공격대상크기
	CONSTANT->Add( XSKTEXT( 8 ), xEA_ABILITY );		// 능력치
	CONSTANT->Add( XSKTEXT( 60 ), xEA_CAST_RADIUS );	// 시전범위
	//
	CONSTANT->Add( XSKTEXT( 250 ), xWC_EVENT_IMMEDIATELY ); // 즉시
	CONSTANT->Add( XSKTEXT( 251 ), xWC_BASE_TARGET_NEAR ); // 기준타겟근접
	CONSTANT->Add( XSKTEXT( 252 ), xWC_ATTACK_TARGET_NEAR ); // 공격타겟근접
	//
	CONSTANT->Add( XSKTEXT( 265 ), xMT_STRAIGHT ); // 직선
	CONSTANT->Add( XSKTEXT( 266 ), xMT_ARC ); // 포물선


	// 사용자 정의로 추가할 상수 파라메터값
	OnAddConstant( CONSTANT );	// virtual
}
Пример #9
0
XSceneEquip::XSceneEquip(XGame *pGame, XSPSceneParam& spBaseParam)
	: XSceneBase(pGame, XGAME::xSC_EQUIP)
	, m_Layout(_T("layout_equip.xml"))
	, m_LayoutTooltip( _T( "layout_item.xml" ) )
{ 
	XBREAK(SCENE_EQUIP != NULL);
	SCENE_EQUIP = this;
	Init(); 
	auto spParam = std::static_pointer_cast<xSPM_EQUIP>(spBaseParam);
	m_BaseParam.idxParts = spParam->idxParts;
	m_BaseParam.snHero = spParam->snHero;
	m_pHero = ACCOUNT->GetHero(m_BaseParam.snHero);
	m_Layout.CreateLayout("equip", this);
	xSET_ENABLE(this, "butt.equip", FALSE);

	switch (m_BaseParam.idxParts)	{
	case XGAME::xPARTS_HEAD:	{
		xSET_TEXT(this, "text.title", XTEXT(80085));
	}		break;
	case XGAME::xPARTS_CHEST:	{
		xSET_TEXT(this, "text.title", XTEXT(80087));
	}		break;
	case XGAME::xPARTS_HAND:	{
		xSET_TEXT(this, "text.title", XTEXT(80088));
	}		break;
	case XGAME::xPARTS_FOOT:	{
		xSET_TEXT(this, "text.title", XTEXT(80089));
	}	break;
	case XGAME::xPARTS_ACCESSORY: {
		xSET_TEXT(this, "text.title", XTEXT(80090));
	}	break;
	}

	XWndList *pWndList = SafeCast<XWndList*, XWnd*>(Find("list.equip"));
	XList4<XBaseItem*> listItem;
	ACCOUNT->GetInvenItem(listItem);
	ID snEquipItem = 0;
	if (pWndList)	{
		auto pImg = new XWndImage(TRUE, XE::MakePath(DIR_UI, _T("legion_equip_ban.png")), 0.f, 0.f);
		pWndList->AddItem(100, pImg);
		const auto size = pImg->GetSizeLocal();
		auto pText = new XWndTextString( XE::VEC2(0,45), size, XTEXT(2287) );
		pText->SetAlignHCenter();
		pText->SetStyleStroke();
		pText->SetColorText( XCOLOR_YELLOW );
		pImg->Add( pText );
		BOOL bFirst = TRUE;
		int i = 0;
		for( auto pItem : listItem )		{
			if (pItem->GetType() == XGAME::xIT_EQUIP && pItem->GetpProp()->parts == m_BaseParam.idxParts)			{
				auto pElem = new XWndStoragyItemElem(pItem);
				pWndList->AddItem(pItem->GetsnItem(), pElem);
				//if (pItem->GetbEquip()) {
				if( pElem->GetbEquip() ) {
					//XBaseItem *pHeroItem = m_pHero->GetsnEquipItem(m_BaseParam.idxParts);
					ID snItem = m_pHero->GetsnEquipItem( m_BaseParam.idxParts );
					auto pHeroItem = ACCOUNT->GetpItemBySN( snItem );
					if (pHeroItem && pHeroItem->GetsnItem() == pItem->GetsnItem())
						snEquipItem = pItem->GetsnItem();
					pImg = new XWndImage(TRUE, XE::MakePath(DIR_UI, _T("armory_bg_item_black.png")), 0.f, 0.f);
					pElem->Add(pImg);
				}

				if (bFirst) {
					m_pSelectItem = pElem;
					m_pSelectItem->SetbSelected( true );
					m_pSelectItem->SetbGlowAnimation( true );
					bFirst = FALSE;
				}
			}
			++i;
		}
		pWndList->SetEvent(XWM_SELECT_ELEM, this, &XSceneEquip::OnSelectItem, snEquipItem);
	}

// 	UpdateItemInfo();
	XWnd *pRoot = Find( "wnd.item.tooltip" );
	if( pRoot )
	{
		// 아이템 툴팁 레이아웃모듈을 읽는다.
		m_LayoutTooltip.CreateLayout( "item_tooltip", pRoot );
	}

	xSET_BUTT_HANDLER(this, "butt.equip", &XSceneEquip::OnEquip);
	xSET_BUTT_HANDLER(this, "butt.back", &XSceneEquip::OnBack);

	//m_Layout.CreateLayout("sample", this);
	/*XWndButtonString *pButt =
		new XWndButtonString(0.f, 0.f, XTEXT(2033), XCOLOR_WHITE, FONT_NANUM_BOLD, 40.f, BUTT_BIG );
	pWnd->Add( pButt );
	pWnd->SetEvent( XWM_CLICKED, this, &XSceneSample::OnClick );*/
	SetbUpdate( true );
}
Пример #10
0
	void* XText( ID idText )
	{
        TCHAR *p = (TCHAR*)XTEXT( idText );
		return (void*)p;
    }