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; }
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. }
//------------------------------------------------------------------------------------------------- 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; }
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 ); } } } } }