⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 item.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			case GEM_WPNEXP_MID:
				nEffect += 50;
				break;
				
			case GEM_WPNEXP_HGT:
				nEffect += 100;
				break;
			}
		}
	}

	return nEffect;
}

//////////////////////////////////////////////////////////////////////
int	CItem::GetGemMgcExpEffect()
{
	int nEffect = 0;
	int nGem[2] = { this->GetInt(ITEMDATA_GEM1), this->GetInt(ITEMDATA_GEM2) };

	for (int i=0; i<2; i++)
	{
		if (nGem[i] != GEM_NONE && nGem[i] != GEM_HOLE)
		{
			OBJID idGemType = 700000 + nGem[i];
			switch(idGemType)
			{
			case GEM_MGCEXP_LOW:
				nEffect += 15;
				break;
				
			case GEM_MGCEXP_MID:
				nEffect += 30;
				break;
				
			case GEM_MGCEXP_HGT:
				nEffect += 50;
				break;
			}
		}
	}

	return nEffect;
}

//////////////////////////////////////////////////////////////////////
int CItem::GetGemDurEffect(OBJID idGemType)
{
	int nEffect = 0;

	// default...
	if (ID_NONE == idGemType)
	{
		int nGem[2] = { this->GetInt(ITEMDATA_GEM1), this->GetInt(ITEMDATA_GEM2) };

		for (int i=0; i<2; i++)
		{
			if (nGem[i] != GEM_NONE && nGem[i] != GEM_HOLE)
			{
				OBJID idGemType = 700000 + nGem[i];
				switch(idGemType)
				{
				case GEM_DUR_LOW:
					nEffect += 50;
					break;
					
				case GEM_DUR_MID:
					nEffect += 100;
					break;
					
				case GEM_DUR_HGT:
					nEffect += 200;
					break;
				}
			}
		}
	}
	else 
	{
		switch(idGemType)
		{
		case GEM_DUR_LOW:
			nEffect += 50;
			break;
			
		case GEM_DUR_MID:
			nEffect += 100;
			break;
			
		case GEM_DUR_HGT:
			nEffect += 200;
			break;
		}
	}

	return nEffect;
}

//////////////////////////////////////////////////////////////////////
bool CItem::IsNonsuchItem(void)
{
	// treasure
	DWORD dwType = this->GetInt(ITEMDATA_TYPE);
	switch(dwType)
	{
	case TYPE_DRAGONBALL:
	case TYPE_SHOOTINGSTAR:
	case TYPE_DIVOICEITEM:
		return true;
		break;

	default:
		break;
	}

	// precious gem
	if (this->IsGem() && (dwType%10) >= 2)
		return true;

	// game card
	if (this->IsGameCard())
		return true;

	// chest item
	if (this->IsChestItem())
		return true;

	// other type
	if (CItem::GetItemSort(dwType) == ITEMSORT_OTHER || CItem::GetItemSort(dwType) >= ITEMSORT_EXPEND)
		return false;

	// high quality
	if (this->GetQuality() >= 8)
		return true;

	// ....
	int nGem1 = this->GetInt(ITEMDATA_GEM1)%10;
	int nGem2 = this->GetInt(ITEMDATA_GEM2)%10;

	bool bIsNonsuch = false;
	if(IsWeapon())
	{
		if ((nGem1 != GEM_HOLE && nGem1 >= 2)
				|| (nGem2 != GEM_HOLE && nGem2 >= 2))
			bIsNonsuch = true;
	}
	else if(IsFinery() || IsShield())
	{
		if (nGem1 != GEM_NONE || nGem2 != GEM_NONE)
			bIsNonsuch = true;
	}

	return bIsNonsuch;
}

//////////////////////////////////////////////////////////////////////
bool CItem::ChangeColor(int nColor)
{
	if (!(nColor >=3 && nColor <= 9))
		return false;

	if(IsHelmet() || IsArmor() || IsShield())
	{
		DWORD idType = this->GetInt(ITEMDATA_TYPE);
		DWORD idNewType = idType-((idType/100)%10)*100+nColor*100;
		return this->ChangeType(idNewType);
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
bool CItem::RecoverDur	(void)
{
	int nMaxDur = this->GetInt(ITEMDATA_AMOUNTLIMIT_ORIGINAL);
	nMaxDur += nMaxDur*this->GetGemDurEffect()/100;

	this->SetInt(ITEMDATA_AMOUNTLIMIT, nMaxDur, true);
	return true;
}

//////////////////////////////////////////////////////////////////////
int CItem::GetRecoverDurCost	(void)
{
	int nRealMaxDur = this->GetInt(ITEMDATA_AMOUNTLIMIT)*100/(100+this->GetGemDurEffect());
	if (nRealMaxDur >= this->GetInt(ITEMDATA_AMOUNTLIMIT_ORIGINAL))
		return 0;

	int nRepairDur = this->GetInt(ITEMDATA_AMOUNTLIMIT_ORIGINAL)-nRealMaxDur;
	int nCost = 0;
	CHECKF(this->GetInt(ITEMDATA_AMOUNTLIMIT_ORIGINAL));
	switch(this->GetQuality())
	{
	case 9:
		nCost = ::MulDiv(5000000, nRepairDur, this->GetInt(ITEMDATA_AMOUNTLIMIT_ORIGINAL));
		nCost = __max(nCost, 500000);
		break;

	case 8:
		nCost = ::MulDiv(3500000, nRepairDur, this->GetInt(ITEMDATA_AMOUNTLIMIT_ORIGINAL));
		nCost = __max(nCost, 350000);
		break;

	default:
		nCost = ::MulDiv(1500000, nRepairDur, this->GetInt(ITEMDATA_AMOUNTLIMIT_ORIGINAL));
		nCost = __max(nCost, 150000);
		break;
	}

	return __max(1, nCost);
}
//////////////////////////////////////////////////////////////////////
int CItem::GetWeight(OBJID idType, int nAmount/*=0*/)		// nAmount: amount 字段值
{
	CItemTypeData* pType = ItemType()->QueryItemType(idType);
	IF_NOT(pType)
		return ERROR_WEIGHT;

	if(!nAmount)
		nAmount	= pType->GetInt(ITEMTYPEDATA_AMOUNT);

	if(IsArrowSort(idType))
		return (pType->GetInt(ITEMTYPEDATA_AMOUNT)-1)*pType->GetInt(ITEMTYPEDATA_WEIGHT)/ARROW_PILE_WEIGHT + 1;

	if(CItem::IsExpend(idType))
		return pType->GetInt(ITEMTYPEDATA_WEIGHT) * nAmount;
	else
		return pType->GetInt(ITEMTYPEDATA_WEIGHT);
}
//////////////////////////////////////////////////////////////////////

int	CItem::AwardExp(int nExp, int nLuck /* = 0*/)
{
	if (nExp <= 0)
		return nExp;

	if (this->IsSprite())
	{
		int nLevupExp = this->GetInt(ITEMDATA_LEVEXP);
		if (nLevupExp <= 0)
			return 0;

		int nOrgProgress = ::MulDiv(this->GetExp(), 1000, nLevupExp);

		int nNewExp = nExp + this->GetExp();	// 先取原来经验
		if (nNewExp >= nLevupExp)
		{
			int nTypeId = this->GetInt(ITEMDATA_TYPE);
			// 升级:由于不同的等级是由不同的itemtype来区分的,因此每次升级实际上需要更新itemtype
			if (!this->ChangeType(nTypeId + 1))
				return 0;

			this->SetInt(ITEMDATA_EXP, 0);			// 经验清0
			this->GrowUp(nLuck);					// 增长属性
			this->SaveInfo();
		} else {
			this->SetInt(ITEMDATA_EXP, nNewExp);	// 增加经验
			int nCurProgress = ::MulDiv(this->GetExp(), 1000, nLevupExp);
			if (nOrgProgress/200 != nCurProgress/200)	//每隔1/5升级经验存一次
				this->SaveInfo();
		}
		return nNewExp;
	}
	return nExp;
}
//////////////////////////////////////////////////////////////////////

void CItem::GrowUp(int nLuck /* = 0*/)
{
	// 根据Luck调整实际成长率
	int nGrowth = __max(0, this->GetGrowth100() + nLuck);
	if (this->GetSpriteType() == _SPRITE_ADDITION_SOUL)
		nGrowth = __min(nGrowth, MAX_SOUL_SPRITE_GROWTH);
	else
		nGrowth = __min(nGrowth, MAX_SPRITE_GROWTH);

	int nAttrib = this->GetInt(ITEMDATA_ATTRIB);

	this->SetInt(ITEMDATA_ATTRIB, nAttrib + nGrowth);
}

//////////////////////////////////////////////////////////////////////
int CItem::AddGrowth(int nGrowth)
{
	int nNewGrowth = __max(0, this->GetGrowth100() + nGrowth);

	if (this->GetSpriteType() == _SPRITE_ADDITION_SOUL)
		nNewGrowth = __min(nNewGrowth, MAX_SOUL_SPRITE_GROWTH);
	else
		nNewGrowth = __min(nNewGrowth, MAX_SPRITE_GROWTH);

	this->SetInt(ITEMDATA_GROWTH, nNewGrowth, true);

	return nNewGrowth;
}

//////////////////////////////////////////////////////////////////////
int CItem::AdjustOriginalGrowth()
{
	int nGrowth = 0;
	int nRate = ::RandGet(100);
	if (this->GetSpriteType() == _SPRITE_ADDITION_SOUL)
	{
		if (nRate < 15)
			nGrowth = ::RandGet(20);
		else if (nRate < 35)
			nGrowth = ::RandGet(20) + 20;
		else if (nRate < 75)
			nGrowth = 40;
		else if (nRate < 95)
			nGrowth = ::RandGet(19) + 41;
		else
			nGrowth = ::RandGet(20) + 60;
	}
	else
	{
		if (nRate < 15)
			nGrowth = ::RandGet(50);
		else if (nRate < 35)
			nGrowth = ::RandGet(50) + 50;
		else if (nRate < 75)
			nGrowth = 100;
		else if (nRate < 95)
			nGrowth = ::RandGet(49) + 101;
		else
			nGrowth = ::RandGet(50) + 150;
	}

	this->SetInt(ITEMDATA_GROWTH, nGrowth, true);

	return nGrowth;
}

//////////////////////////////////////////////////////////////////////
int CItem::GetAddition(ITEMADDITIONDATA idx)
{
	if (!m_pAddition)
		return 0;

	return m_pAddition->GetInt(idx);
}

//////////////////////////////////////////////////////////////////////
bool CItem::IsEvolveEnable()
{
	return ((GetInt(ITEMDATA_TYPE)%10 == 0) 
			&& (GetEudemonLevel() >= EUDEMON_EVOLVE_LEVEL1)
			&& this->IsAliveEudemon());
}

//////////////////////////////////////////////////////////////////////
bool CItem::IsEvolve2Enable()
{
	// 还未经进行过一次进化
	if (GetInt(ITEMDATA_TYPE)%10 == 0)
		return false;
	
	return (((GetInt(ITEMDATA_TYPE)/10)%10 == 0)  
			&& (GetEudemonLevel() >= EUDEMON_EVOLVE_LEVEL2)
			&& this->IsAliveEudemon());
}

//////////////////////////////////////////////////////////////////////
UCHAR CItem::GetRelationShip(OBJID idDivine)
{
	CHECKF (idDivine>=MIN_DIVINE_ID && idDivine <= MAX_DIVINE_ID);
	CHECKF (m_pEudemonData);

	DWORD dwRelationShip = m_pEudemonData->GetInt(EUDEMONDATA_RELATIONSHIP);

	// dwRelationShip中从十进制个位到千万位分别表示与神识编号1~8的8种幻兽的关系
	// 只要取其中指定的十进制位返回
	return (dwRelationShip / (DWORD)pow(10, idDivine-1) % 10);
}

//////////////////////////////////////////////////////////////////////
bool CItem::AddRelationShip(OBJID idDivine, int nValue)
{
	CHECKF (idDivine>=MIN_DIVINE_ID && idDivine <= MAX_DIVINE_ID);
	CHECKF (m_pEudemonData);
	
	DWORD dwRelationShip = m_pEudemonData->GetInt(EUDEMONDATA_RELATIONSHIP);
	DWORD dwPow = (DWORD)pow(10, idDivine-1);

	int nRelationShip = dwRelationShip / dwPow % 10;
	nRelationShip = __min(9, __max(0, nRelationShip+nValue));	// 关系取值范围为0 ~ 9
	dwRelationShip = (dwRelationShip/(dwPow*10)*dwPow*10) + nRelationShip*dwPow + dwRelationShip%dwPow;

	m_pEudemonData->SetInt(EUDEMONDATA_RELATIONSHIP, dwRelationShip);
	m_pEudemonData->Update();

	return true;
}

//////////////////////////////////////////////////////////////////////
/*
bool CItem::SendEudemonAttrib(CUser* pUser)
{
	CHECKF(pUser);
	CHECKF(this->IsEudemon());

	int nLevel	= this->GetEudemonLevel();
	int nGrowth	= this->GetInt(ITEMDATA_GROWTH);

	ST_EUDEMON_ATTRIB	setEudemonAttrib[8];
	setEudemonAttrib[0].dwAttributeType		= _EUDEMONATTRIB_ATK_MAX;
	setEudemonAttrib[0].dwAttributeData		= this->GetInt(ITEMDATA_ATTACK_MAX_) * nLevel * nGrowth / 100;

	setEudemonAttrib[1].dwAttributeType		= _EUDEMONATTRIB_ATK_MIN;
	setEudemonAttrib[1].dwAttributeData		= this->GetInt(ITEMDATA_ATTACK_MIN_) * nLevel * nGrowth / 100;

	setEudemonAttrib[2].dwAttributeType		= _EUDEMONATTRIB_MAGICATK_MAX;
	setEudemonAttrib[2].dwAttributeData		= this->GetInt(ITEMDATA_MAGICATK_MAX_) * nLevel * nGrowth / 100;

	setEudemonAttrib[3].dwAttributeType		= _EUDEMONATTRIB_MAGICATK_MIN;
	setEudemonAttrib[3].dwAttributeData		= this->GetInt(ITEMDATA_MAGICATK_MIN_) * nLevel * nGrowth / 100;

	setEudemonAttrib[4].dwAttributeType		= _EUDEMONATTRIB_DEF;
	setEudemonAttrib[4].dwAttributeData		= this->GetInt(ITEMDATA_DEFENSE_) * nLevel * nGrowth / 100;

	setEudemonAttrib[5].dwAttributeType		= _EUDEMONATTRIB_MAGICDEF;
	setEudemonAttrib[5].dwAttributeData		= this->GetInt(ITEMDATA_MAGICDEF_) * nLevel * nGrowth / 100;

	setEudemonAttrib[6].dwAttributeType		= _EUDEMONATTRIB_ATKSPEED;
	setEudemonAttrib[6].dwAttributeData		= this->GetInt(ITEMDATA_ATKSPEED) * nLevel * nGrowth / 100;

	setEudemonAttrib[7].dwAttributeType		= _EUDEMONATTRIB_LIFE;
	setEudemonAttrib[7].dwAttributeData		= this->GetInt(ITEMDATA_LIFE) * nLevel * nGrowth / 100;

	CMsgEudemonAttrib	msg;
	if (msg.Create(_EA_ACTION_ATTRIB, this->GetID(), 8, setEudemonAttrib))
		pUser->SendMsg(&msg);

	return true;
}
*/
//////////////////////////////////////////////////////////////////////
bool CItem::WarGhostLevelReset()
{
	if(!IsEquipment())
		return false;

	if(GetInt(ITEMDATA_WARGHOSTEXP) < WARGHOSTVALUE_LIMIT)
		return false;

	SetInt(ITEMDATA_WARGHOSTEXP, WARGHOSTVALUE_LIMIT, true);

	return true;
}
//////////////////////////////////////////////////////////////////////

//升级战魂等级-------jinggy------2004-11-12
void CItem::WarGhostLevelUpgrade(CUserPtr pUser)
{
	if(!IsEquipment())
		return ;	
	if(this->GetWarGhostLevel()>=MAX_LEVEL_WARLEVEL)
		return;
	//得到,设置该装备的 战魂经验值
	DWORD dwExp = GetInt(ITEMDATA_WARGHOSTEXP) ;			
	SetInt(ITEMDATA_WARGHOSTEXP, ++dwExp, true);
	//通知客户端 设备属性更新
	CMsgItemInfo msg;			
	IF_OK (msg.Create(this))
		pUser->SendMsg(&msg);

}
//判断是否是状态攻击类宝石
bool CItem::IsGemActiveAtk()
{
	DWORD dwType = GetInt(ITEMDATA_TYPE)%100000/1000*1000;

	return (this->IsGhostGem() && (dwType == ITEMTYPE_GHOSTGEM_ACTIVE_ATK));
}

//是否是用来升级等级的宝石
bool CItem::IsGemForUpLevel()
{
	return GetInt(ITEMDATA_TYPE) == ITEMTYPE_GHOSTGEM_UPGRADE_EQUIPLEVEL;
}
//品质宝石
bool CItem::IsGemForUpQuality()
{
	return GetInt(ITEMDATA_TYPE) == ITEMTYPE_GHOSTGEM_FORQUALITY;

}
//追加宝石
bool CItem::IsGemForUpSuperAddition()
{
	return GetInt(ITEMDATA_TYPE) == ITEMTYPE_GHOSTGEM_FORGHOSTLEVEL;

}
//嵌入装备的宝石
bool CItem::IsGemForEmbedEquip()
{
	DWORD dwType = GetInt(ITEMDATA_TYPE)%100000/1000*1000;
	return (this->IsGhostGem() && (dwType == ITEMTYPE_GHOSTGEM_EMBEDEQUIP));
}
//升级装备或武器的等级
bool CItem::UpLevel()
{	
	if (this->IsShield() || this->IsArmor() || this->IsHelmet())
	{	
		if(GetLevel()>MAX_LEVEL_EQUIP1)
			return false;

		if(!ChangeType(GetInt(ITEMDATA_TYPE)+10))
			return false;		
	}
	else
	{
		if(GetLevel()>MAX_LEVEL_EQUIP2)
			return false;
		if(!ChangeType(GetInt(ITEMDATA_TYPE)+10))
			return false;
	}

	return true;

}
//升级品质
bool CItem::UpQuality()
{
	if(this->IsEquipment()||this->IsWeapon())
	{
		int nQuality = this->GetQuality() ;

		if(++nQuality>MAX_LEVEL_QUALITYANDADDITION)
			return false;

		int nType = GetInt(ITEMDATA_TYPE);
		IF_NOT( ChangeType(  ++ nType ) )
		{		
			return false ;
		}
		SaveInfo();		
		return true;
	}
	return false;
}
//升级追加
bool CItem::UpSuperAddition()
{
	if(this->IsEquipment()||this->IsWeapon())
	{		
		int nEquipAddition = GetInt(ITEMDATA_ADDITION) ;	
		int nEquipAdditionNew = nEquipAddition + 1 ;
		if(nEquipAdditionNew>MAX_LEVEL_QUALITYANDADDITION)
			return false;		
		IF_NOT(ChangeAddition(nEquipAdditionNew) )
			return false ;		
		SaveInfo();				
		return true;
	}
	return false;
}
//降低 装备追加属性
bool CItem::DecSuperAddition()
{
	if(this->IsEquipment()||this->IsWeapon())
	{
		
		int nEquipAddition = GetInt(ITEMDATA_ADDITION) ;	
		int nEquipAdditionNew = nEquipAddition - 1 ;
		if(nEquipAdditionNew<0)
			return false;
		
		IF_NOT(ChangeAddition(nEquipAdditionNew) )
			return false ;
		
		SaveInfo();		
		
		return true;
	}

	return false;
}
//得到战魂等级
int CItem::GetWarGhostLevel()
{
	DWORD dwExp = GetInt(ITEMDATA_WARGHOSTEXP) ;
	float fLevel =  powf((float)dwExp/(float)2,(float)1/(float)3);
	
	return (int)fLevel;
}
//得到追加属性
int CItem::GetSuperAddition()
{
	return  GetInt(ITEMDATA_ADDITION) ;
}

void CItem::WarGhostLevelDec(int nDec)
{
	if(!IsEquipment())
		return ;
	
	//得到,设置该装备的 战魂经验值
	LONG  lExp = GetInt(ITEMDATA_WARGHOSTEXP) ;		
	
	if(lExp <= WARGHOSTVALUE_LIMIT)
		return ;

	lExp-=nDec;

	if(lExp < WARGHOSTVALUE_LIMIT)
		lExp = WARGHOSTVALUE_LIMIT;	

	SetInt(ITEMDATA_WARGHOSTEXP, lExp, true);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -