예제 #1
0
const Quality* streamMultiItem(ostream& stream, int id, int count) {
	const Quality* q = NULL;
	if(id != 0) {
		stream << "<a href=\"item="<<id<<"\" style=\"white-space:nowrap\">";
		const Item* item = gItems.find(id);
		if(item) {
			q = &ITEM_QUALITY(item->quality);
			stream << "<span style=\"color:#"<<q->color<<";\">";
			const ItemDisplayInfo* di = gItemDisplayInfos.find(item->displayId);
			if(di) {
				stream << "<img src=\"";
				ESCAPE_URL(getIcon(di->icon));
				stream << "\" alt=\""<<item->name<<"\" title=\""<<item->name<<"\">";
			} else {
				stream << "displayId ("<<item->displayId<<")";
			}
		} else {
			stream << "item ("<<id<<")";
		}
		stream << count;
		if(item)
			stream << "</span>";
		stream << "</a>\n";
	}
	return q;
}
예제 #2
0
static void streamItemSource(ostream& stream, const Item& item) {
	stream << "<a href=\"item="<<item.entry<<"\">";
	stream << "<span style=\"color:#"<<ITEM_QUALITY(item.quality).color<<";\">";
	streamName(stream, item);
	stream << "</span>";
	stream << "</a>\n";
	// todo: determine if the thing is sold or dropped, and if so, by how many.
}
예제 #3
0
//-------------------------------------------------------------------------------------------------
int CEconomy::Get_ItemBuyPRICE (short nItemTYPE, short nItemNO, short nBuySkillVALUE)
{
	int iPrice = 0;
	int iItemRate, iPriceRate;

	switch( nItemTYPE ) {
		case ITEM_TYPE_FACE_ITEM:  
		case ITEM_TYPE_HELMET	:  
		case ITEM_TYPE_ARMOR	:  
		case ITEM_TYPE_GAUNTLET :  
		case ITEM_TYPE_BOOTS	:  
		case ITEM_TYPE_KNAPSACK :  
		case ITEM_TYPE_WEAPON	:
		case ITEM_TYPE_SUBWPN	:
		case ITEM_TYPE_RIDE_PART:
			// 2004. 1. 2 구입 가격 = 
			iPrice = (int)(	ITEM_BASE_PRICE( nItemTYPE, nItemNO ) * ( ITEM_QUALITY( nItemTYPE, nItemNO )+50.f ) * ( 1.f - nBuySkillVALUE * 0.01 ) / 100.f + 0.5f );
			break;

		case ITEM_TYPE_USE		:
		case ITEM_TYPE_NATURAL	:
			if ( IsEssentialGoods( ITEM_TYPE( nItemTYPE, nItemNO ) ) ) {
				// 생필품.
				// 구입 가격 = ITEM_BASE * { 1 + (ITEM_RATE - 50) * ITEM_FLUC / 1000 } * (1 - 구입스킬레벨 * 0.02)
				iItemRate  = this->Get_ItemRATE( ITEM_RATE_TYPE( nItemTYPE, nItemNO ) );
				iPriceRate = ITEM_PRICE_RATE( nItemTYPE, nItemNO );

				iPrice = (int) (
							ITEM_BASE_PRICE( nItemTYPE, nItemNO ) * 
							( 1.f + ( iItemRate - 50.f ) * iPriceRate / 1000.f ) * ( 1.f - nBuySkillVALUE * 0.01f ) + 0.5f );
				break;
			}

		case ITEM_TYPE_JEWEL	:
		case ITEM_TYPE_GEM		:
		case ITEM_TYPE_QUEST	:
			// 2003. 08. 18 구입 가격 = ITEM_BASE * { 1 + (TOWN_RATE - 50) * ITEM_FLUC / 1000 } * (1 - 구입스킬레벨 * 0.02)
			iPriceRate = ITEM_PRICE_RATE( nItemTYPE, nItemNO );
			iPrice = (int) ( 
							ITEM_BASE_PRICE( nItemTYPE, nItemNO ) * 
							( 1.f + ( this->Get_TownRATE() - 50.f ) * iPriceRate / 1000.f ) * ( 1 - nBuySkillVALUE * 0.01f ) + 0.5f
							);
			break;
	}

	return iPrice;
}
예제 #4
0
void CSeparate::SetItem( CItem* pItem )
{
	assert( pItem );
	tagITEM& Item = pItem->GetItem();
/*
	int a = CSeparateDlg::GetInstance()->m_OutputItemSlots.size();
	// 초기화를 안해줬더니;; 쓰레기값이 4개가 더 들어있어서 나중에 빈 슬롯 계산할때 삑 난다;;
//	CSeparateDlg::GetInstance()->OutputItemSlotClear(); 
	int c = CSeparateDlg::GetInstance()->m_OutputItemSlots.size();	
*/
	m_iType = TYPE_NONE;

	if( !Item.IsEnableSeparate() )
	{
		g_itMGR.OpenMsgBox(STR_ITEM_CANT_SEPARATED);
		return;
	}

	if( Item.HasSocket() && Item.GetGemNO() > 300 )
		return;

#ifdef _NEWBREAK
	else if( ITEM_DECOMPOSITION_NUMBER( Item.GetTYPE(), Item.GetItemNO() ) )
#else
	else if( ITEM_PRODUCT_IDX( Item.GetTYPE(), Item.GetItemNO() ) )
#endif
		m_iType = TYPE_DECOMPOSITION;
	else
	{
		assert( 0 && "Invalid Separate Type" );
		return;
	}

	if( m_pMaterialItem )
		RemoveItem();

	m_pMaterialItem = new CItemFragment( pItem );	
	
	if( Item.IsEnableDupCNT() )
		m_pMaterialItem->SetQuantity( 1 );

	m_Event.SetID( CTEventSeparate::EID_SET_MATERIAL_ITEM );
	m_Event.SetItem( m_pMaterialItem );
	SetChanged();
	NotifyObservers( &m_Event );

	m_iRequireMoney = Item.GetSeparateCost();

	switch( m_iType )
	{
	case TYPE_SEPARATE:
		{
			tagITEM MainMaterialItem;		

			MainMaterialItem.Init(  setItemFullNo( pItem->GetType(), pItem->GetItemNo() ) );

			CItem* pMainMaterialItem = new CItem;
			pMainMaterialItem->SetItem( MainMaterialItem );
			m_pItems.push_back( pMainMaterialItem );

			m_Event.SetID( CTEventSeparate::EID_SET_OUTPUT_ITEM );
			m_Event.SetIndex( 0 );
			m_Event.SetItem( pMainMaterialItem );
			SetChanged(); 
			NotifyObservers( &m_Event );


			tagITEM GemItem;
			GemItem.Init( setItemFullNo( ITEM_TYPE_GEM, Item.GetGemNO() ) );
			CItem* pGemItem	 = new CItem;
			pGemItem->SetItem( GemItem );
			m_pItems.push_back( pGemItem );

			m_Event.SetID( CTEventSeparate::EID_SET_OUTPUT_ITEM );
			m_Event.SetIndex( 1 );
			m_Event.SetItem( pGemItem );
			SetChanged();
			NotifyObservers( &m_Event);

			m_iRequireMp = ITEM_QUALITY( MainMaterialItem.GetTYPE(), MainMaterialItem.GetItemNO() ) / 2 +
				ITEM_QUALITY( GemItem.GetTYPE(), GemItem.GetItemNO() );

			break;
		}
	case TYPE_DECOMPOSITION:
		{
	//05.11.03 - 김주현 : 분해 관련 새로운 시스템.
	#if defined ( _NEWBREAK )

			m_iNumMat = 1;
			tagITEM MaterialItem;
			CItem*  pMaterialItem = NULL;

			int iCompositionIdx = ITEM_DECOMPOSITION_NUMBER( Item.GetTYPE(), Item.GetItemNO() );
			//PY temporary fix for items that point off the end of the break list
			if(iCompositionIdx > 2028) iCompositionIdx = 2028; //There are currently only 2028 entries in LIST_BREAK.STB and some items point to 2300 +
			if( int iRawMaterial = ITEM_BREAK_POTISION( iCompositionIdx ) )
			{

				int iOriQual = ITEM_QUALITY( Item.GetTYPE(), Item.GetItemNO() );

				if( getItemType( iRawMaterial ) )
				{
					MaterialItem.Init( iRawMaterial );
				}
				else
				{
					int iTemp    = ( iOriQual - 20 ) / 12;

					if( iTemp < 1 ) 	iTemp = 1;
					if( iTemp > 10 )	iTemp = 10;

					int iItemNo = ( iRawMaterial - 421 ) * 10 + iTemp;

					assert( iItemNo >= 1 && iItemNo <= g_TblNATUAL.m_nDataCnt );
					if( iItemNo < 0 || iItemNo > g_TblNATUAL.m_nDataCnt )
						return;

					MaterialItem.Init( setItemFullNo( ITEM_TYPE_NATURAL, iItemNo ) );
				}

				if( MaterialItem.IsEnableDupCNT() )
					MaterialItem.m_uiQuantity = ITEM_BREAK_NEED_CNT( iCompositionIdx, 0 );


				pMaterialItem = new CItem;
				pMaterialItem->SetItem( MaterialItem );
	


				m_pItems.push_back( pMaterialItem );
				m_Event.SetID( CTEventSeparate::EID_SET_OUTPUT_ITEM );
				m_Event.SetIndex( 0 );
				m_Event.SetItem( pMaterialItem );
				SetChanged(); 
				NotifyObservers( &m_Event );

				int iMaterialIdx  = 0 ;
				int iClass = 0;
				int iIndex = 0;

				for( int i = 1 ; i < 4; ++i )
				{
					if( iMaterialIdx = ITEM_BREAK_COUNT( iCompositionIdx, i ) )
					{
						MaterialItem.Init( iMaterialIdx );
						if( MaterialItem.IsEnableDupCNT() )
							MaterialItem.m_uiQuantity = ITEM_BREAK_NEED_CNT( iCompositionIdx, i);

						pMaterialItem = new CItem;
						pMaterialItem->SetItem( MaterialItem );
						m_pItems.push_back( pMaterialItem );						
						++iIndex;
						
						m_Event.SetID( CTEventSeparate::EID_SET_OUTPUT_ITEM );
						m_Event.SetIndex( iIndex );
						m_Event.SetItem( pMaterialItem );
						SetChanged(); 
						NotifyObservers( &m_Event );
						++m_iNumMat;

					}
				}

				m_iRequireMp = iOriQual + 30;


#else
		
			tagITEM MaterialItem;
			CItem*  pMaterialItem = NULL;
			int iProductIdx = ITEM_PRODUCT_IDX( Item.GetTYPE(), Item.GetItemNO() );
			if( int iRawMaterial = PRODUCT_RAW_MATERIAL( iProductIdx ) )
			{
				int iOriQual = ITEM_QUALITY( Item.GetTYPE(), Item.GetItemNO() );
	
				if( getItemType( iRawMaterial ) )
				{
					MaterialItem.Init( iRawMaterial );
				}
				else
				{
					int iTemp    = ( iOriQual - 20 ) / 12;

					if( iTemp < 1 ) 	iTemp = 1;
					if( iTemp > 10 )	iTemp = 10;

					int iItemNo = ( iRawMaterial - 421 ) * 10 + iTemp;

					assert( iItemNo >= 1 && iItemNo <= g_TblNATUAL.m_nDataCnt );
					if( iItemNo < 0 || iItemNo > g_TblNATUAL.m_nDataCnt )
						return;

					MaterialItem.Init( setItemFullNo( ITEM_TYPE_NATURAL, iItemNo ) );
				}

				if( MaterialItem.IsEnableDupCNT() )
					MaterialItem.m_uiQuantity = GetQuantity( Item, PRODUCT_NEED_ITEM_CNT( iProductIdx, 0 ) );


				pMaterialItem = new CItem;
				pMaterialItem->SetItem( MaterialItem );	

				m_pItems.push_back( pMaterialItem );
				m_Event.SetID( CTEventSeparate::EID_SET_OUTPUT_ITEM );
				m_Event.SetIndex( 0 );
				m_Event.SetItem( pMaterialItem );
				SetChanged(); 
				NotifyObservers( &m_Event );

				int iMaterialIdx  = 0 ;
				int iClass = 0;
				int iIndex = 0;
				for( int i = 1 ; i < 4; ++i )
				{
					if( iMaterialIdx = PRODUCT_NEED_ITEM_NO( iProductIdx, i ) )
					{
						MaterialItem.Init( iMaterialIdx );
						if( MaterialItem.IsEnableDupCNT() )
							MaterialItem.m_uiQuantity = GetQuantity( Item, PRODUCT_NEED_ITEM_CNT( iProductIdx, i) );

						pMaterialItem = new CItem;
						pMaterialItem->SetItem( MaterialItem );
						m_pItems.push_back( pMaterialItem );						
						++iIndex;
						
						m_Event.SetID( CTEventSeparate::EID_SET_OUTPUT_ITEM );
						m_Event.SetIndex( iIndex );
						m_Event.SetItem( pMaterialItem );
						SetChanged(); 
						NotifyObservers( &m_Event );
					}
				}

				m_iRequireMp = iOriQual + 30;
			///		

#endif
			}
		break;
	}
	default:
		break;
	}
}

void CSeparate::Update( CObservable* pObservable, CTObject* pObj )
{
	assert( pObservable );
	assert( pObj );

	if( m_pMaterialItem && pObj && strcmp( pObj->toString(), "CTEventItem") == 0  )
	{
		CTEventItem* pEvent = (CTEventItem*)pObj;
		int iIndex = pEvent->GetIndex();
		if( pEvent->GetID() == CTEventItem::EID_DEL_ITEM || 
			pEvent->GetID() == CTEventItem::EID_CHANGE_ITEM )
		{

			if( iIndex == m_pMaterialItem->GetIndex() )
			{
				m_bWaitServerReply = false;

				m_Event.SetID( CTEventSeparate::EID_REMOVE_MATERIAL_ITEM );
				SetChanged();
				NotifyObservers( &m_Event );
				delete m_pMaterialItem;
				m_pMaterialItem = NULL;

				std::vector< CItem* >::iterator iter;
				int iIndex = 0;
				for( iter = m_pItems.begin(); iter != m_pItems.end(); ++iIndex )
				{
					m_Event.SetID( CTEventSeparate::EID_REMOVE_OUTPUT_ITEM );
					m_Event.SetIndex( iIndex );
					SetChanged();
					NotifyObservers( &m_Event );

					delete *iter;
					iter = m_pItems.erase( iter );
				}
			}
		}
	}
}