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

📄 skillinfo.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SkillInfo.cpp: implementation of the CSkillInfo class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SkillInfo.h"


#include "SkillObjectFactory.h"

#ifdef _MAPSERVER_
#include "SkillObject_server.h"

#include "CharMove.h"

#else

#include "SkillObject_Client.h"

#include "ActionTarget.h"

#include "GameIn.h" 
#include "Hero.h"

#include "MoveManager.h"
#include "ObjectStateManager.h"
#include "ChatManager.h"
#include "BattleSystem_client.h"
#include "ObjectManager.h"
#include "SkillManager_client.h"
#endif


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSkillInfo::CSkillInfo()
{
	m_SkillOperateAnimationTime[GENDER_MALE] = 10000;
	m_SkillOperateAnimationTime[GENDER_FEMALE] = 10000;
	
	m_BeforeSkill = 0;
	m_AfterSkill = 0;
	memset(m_SkillTree,0,sizeof(WORD)*5);
}

CSkillInfo::~CSkillInfo()
{
	PTRLISTSEARCHSTART(m_SkillObjectPool,CSkillObject*,pSObj)
		delete pSObj;
	PTRLISTSEARCHEND;
	m_SkillObjectPool.RemoveAll();
}

BOOL CSkillInfo::InitSkillInfo(CMHFile* pFile)
{
	ASSERT(pFile->IsInited());
	ASSERT(pFile->IsEOF() == FALSE);

	memset(&m_SkillInfo,0,sizeof(m_SkillInfo));

	m_SkillInfo.SkillIdx = pFile->GetWord();
	pFile->GetString(m_SkillInfo.SkillName);
	m_SkillInfo.SkillTooltipIdx = pFile->GetWord();
	m_SkillInfo.RestrictLevel = pFile->GetWord();
	m_SkillInfo.LowImage = pFile->GetInt();
	m_SkillInfo.HighImage = pFile->GetInt();
	m_SkillInfo.SkillKind = pFile->GetWord();
	m_SkillInfo.WeaponKind = pFile->GetWord();
	m_SkillInfo.SkillRange = pFile->GetWord();
	m_SkillInfo.TargetKind = pFile->GetWord();
	m_SkillInfo.TargetRange = pFile->GetWord();
	m_SkillInfo.TargetAreaIdx = pFile->GetWord();
	m_SkillInfo.TargetAreaPivot = pFile->GetWord();
	m_SkillInfo.TargetAreaFix = pFile->GetWord();
	m_SkillInfo.MoveTargetArea = pFile->GetWord();
	m_SkillInfo.MoveTargetAreaDirection = pFile->GetWord();
	m_SkillInfo.MoveTargetAreaVelocity = pFile->GetFloat();
	m_SkillInfo.Duration = pFile->GetDword();
	m_SkillInfo.Interval = pFile->GetWord();
	m_SkillInfo.DelaySingleEffect = pFile->GetWord();	
	m_SkillInfo.ComboNum = pFile->GetWord();
	m_SkillInfo.Life = pFile->GetWord();
	m_SkillInfo.BindOperator = pFile->GetWord();
	m_SkillInfo.EffectStartTime = pFile->GetWord();
	m_SkillInfo.EffectStart = FindEffectNum(pFile->GetString());
	m_SkillInfo.EffectUse = FindEffectNum(pFile->GetString());
	m_SkillInfo.EffectSelf = FindEffectNum(pFile->GetString());
	m_SkillInfo.EffectMapObjectCreate = FindEffectNum(pFile->GetString());
	m_SkillInfo.EffectMineOperate = FindEffectNum(pFile->GetString());
	m_SkillInfo.DelayTime = pFile->GetWord();
	m_SkillInfo.FatalDamage = pFile->GetWord();
	for(int n=0;n<12;++n)
		m_SkillInfo.NeedExp[n] = pFile->GetExpPoint();
	pFile->GetWord(m_SkillInfo.NeedNaeRyuk,12);
	m_SkillInfo.Attrib = pFile->GetWord();
	m_SkillInfo.NegativeResultTargetType = pFile->GetWord();
	m_SkillInfo.TieUpType = pFile->GetWord();
	m_SkillInfo.ChangeSpeedType = pFile->GetWord();
	m_SkillInfo.ChangeSpeedRate = pFile->GetWord();
	m_SkillInfo.Dispel = pFile->GetWord();
	m_SkillInfo.PositiveResultTargetType = pFile->GetWord();
	m_SkillInfo.Immune = pFile->GetWord();
	m_SkillInfo.AIObject = pFile->GetWord();
	m_SkillInfo.MineCheckRange = pFile->GetWord();
	m_SkillInfo.MineCheckStartTime = pFile->GetWord();
	
	m_SkillInfo.CounterDodgeKind = pFile->GetWord();
	m_SkillInfo.CounterEffect = FindEffectNum(pFile->GetString());

//041213 KES decrease skill power
	m_SkillInfo.DamageDecreaseForDist = pFile->GetWord();
	
	WORD AdditiveAttr;
	WORD temp[12];
	
//	if(m_SkillInfo.SkillIdx == 903)
//	{
//		int a=0;
//	}
	for(n=0;n<6;++n)
	{
		AdditiveAttr = pFile->GetWord();
		ySWITCH(AdditiveAttr)
			yCASE(0)	pFile->GetWord(temp,12);
			yCASE(11)	pFile->GetFloat(m_SkillInfo.FirstPhyAttack,12);
			yCASE(12)	pFile->GetFloat(m_SkillInfo.UpPhyAttack,12);
			yCASE(13)	pFile->GetWord(m_SkillInfo.FirstAttAttackMin,12);
			yCASE(14)	pFile->GetWord(m_SkillInfo.FirstAttAttackMax,12);
			yCASE(15)	pFile->GetWord(m_SkillInfo.ContinueAttAttack,12);

			yCASE(20)	pFile->GetFloat(m_SkillInfo.CounterPhyAttack,12);
			yCASE(21)	pFile->GetFloat(m_SkillInfo.CounterAttAttack,12);
			yCASE(22)	pFile->GetFloat(m_SkillInfo.UpPhyDefence,12);
			yCASE(23)	pFile->GetFloat(m_SkillInfo.UpAttDefence,12);
			yCASE(24)	pFile->GetWord(m_SkillInfo.UpMaxNaeRyuk,12);
			yCASE(25)	pFile->GetWord(m_SkillInfo.UpMaxLife,12);
			yCASE(26)	pFile->GetWord(m_SkillInfo.ContinueRecoverNaeRyuk,12);
			yCASE(27)	pFile->GetWord(m_SkillInfo.FirstRecoverNaeRyuk,12);
			yCASE(28)	pFile->GetWord(m_SkillInfo.ContinueRecoverLife,12);
			yCASE(29)	pFile->GetWord(m_SkillInfo.FirstRecoverLife,12);
			yCASE(30)	pFile->GetFloat(m_SkillInfo.CounterDodgeRate,12);

			yCASE(31)	pFile->GetFloat(m_SkillInfo.CriticalRate,12);
			yCASE(32)	pFile->GetFloat(m_SkillInfo.StunRate,12);
			yCASE(33)	pFile->GetWord(m_SkillInfo.StunTime,12);
			
			
			yCASE(34)	pFile->GetWord(m_SkillInfo.UpMaxShield,12);			
			yCASE(35)	pFile->GetWord(m_SkillInfo.AmplifiedPowerPhy,12);			
			yCASE(36)	pFile->GetFloat(m_SkillInfo.VampiricLife,12);
			yCASE(37)	pFile->GetFloat(m_SkillInfo.VampiricNaeryuk,12);			
			yCASE(38)	pFile->GetFloat(m_SkillInfo.RecoverStateAbnormal,12);
					
			yCASE(39)	pFile->GetFloat(m_SkillInfo.DispelAttackFeelRate,12);

			
			yCASE(41)	pFile->GetWord(m_SkillInfo.DownMaxLife,12);			
			yCASE(42)	pFile->GetWord(m_SkillInfo.DownMaxNaeRyuk,12);			
			yCASE(43)	pFile->GetWord(m_SkillInfo.DownMaxShield,12);
			yCASE(44)	pFile->GetFloat(m_SkillInfo.DownPhyDefence,12);			
			yCASE(45)	pFile->GetFloat(m_SkillInfo.DownAttDefence,12);	
			yCASE(46)	pFile->GetFloat(m_SkillInfo.DownPhyAttack,12);
	
			yCASE(47)	pFile->GetDword(m_SkillInfo.SkillAdditionalTime,12);
			yCASE(48)	pFile->GetWord(m_SkillInfo.AmplifiedPowerAtt,12);
			yCASE(49)	pFile->GetFloat(m_SkillInfo.AmplifiedPowerAttRate,12);

			yCASE(50)	pFile->GetFloat(m_SkillInfo.FirstAttAttack,12);
			yCASE(51)	pFile->GetFloat(m_SkillInfo.ContinueAttAttackRate,12);
		yENDSWITCH
	}	

	//////////////////////////////////////////////////////////////////////////
	// 烙矫 背沥
	
	// 磊扁吝缴裹困公傍牢单 荤沥芭府焊促 裹困啊 累篮版快
	if( m_SkillInfo.TargetAreaPivot == 1 && 
		m_SkillInfo.TargetRange != 0 &&
		m_SkillInfo.SkillRange > m_SkillInfo.TargetRange )
		m_SkillInfo.TargetRange = m_SkillInfo.SkillRange;

	//////////////////////////////////////////////////////////////////////////
	

	return TRUE;
}

#define SKILLDUMMYCHECK 0x74
BOOL CSkillInfo::InitDummySkillInfo(CSkillInfo* pOriginalSkillInfo)
{
	memcpy(&m_SkillInfo,&pOriginalSkillInfo->m_SkillInfo,sizeof(SKILLINFO));
	char* p = (char*)&m_SkillInfo;
	for(int n=0;n<sizeof(SKILLINFO);++n)
	{
		p[n] ^= SKILLDUMMYCHECK;
	}

	return TRUE;
}

BOOL CSkillInfo::CheckOriginal(CSkillInfo* pSkillInfo)
{
	char* pOriginal = (char*)&pSkillInfo->m_SkillInfo;
	char* pDummy = (char*)&m_SkillInfo;

	for(int n=0;n<sizeof(SKILLINFO);++n)
	{
		if(pOriginal[n] != ( pDummy[n] ^ SKILLDUMMYCHECK ))
			return FALSE;
	}
	return TRUE;
}


#ifdef _MAPSERVER_
#include "Battle.h"
#include "Player.h"
BOOL CSkillInfo::IsExcutableSkillState(CObject* pObject,int SkillLevel)
{	
	if(pObject->GetLevel() < m_SkillInfo.RestrictLevel)
	{
		// 饭骇捞 何练窍咯 公傍阑 矫傈窍角 荐 绝嚼聪促.
		return FALSE;
	}

	if(pObject->IsInSpecialState(eSpecialState_Stun) == TRUE)
		return FALSE;

	if(pObject->GetState() != eObjectState_None &&
		pObject->GetState() != eObjectState_Move &&
		pObject->GetState() != eObjectState_TiedUp_CanSkill )
		return FALSE;
	
	if(pObject->GetObjectKind() == eObjectKind_Player)
	{
		if( ((CPlayer*)pObject)->GetDelayGroup()->CheckDelay(CDelayGroup::eDK_Skill,GetSkillIndex()) != 0)
			return FALSE;
	}

	WORD MogongNaeRyuk = GetNeedNaeRyuk(SkillLevel);
	
	// RaMa - 04.11.24  ->郴仿家葛厚啦
	WORD NeedNaeRyuk = MogongNaeRyuk*gNaeRuykRate;

	if(NeedNaeRyuk)
	{
		if(pObject->GetNaeRyuk() < NeedNaeRyuk)
		{
			return FALSE;
		}
		
		pObject->ReduceNaeRyuk(NeedNaeRyuk);
		if( pObject->GetObjectKind() == eObjectKind_Player && 
			g_pServerSystem->GetMap()->IsVillage() == FALSE &&
			pObject->GetBattle()->GetBattleKind() != eBATTLE_KIND_VIMUSTREET)
		{
			CPlayer* pPlayer = (CPlayer*)pObject;

			DWORD MugongExp = MogongNaeRyuk;
			
			// RaMa - 04.11.24   ->公傍版氰摹绰 郴仿家葛厚啦苞 惑包绝捞

			// 吝惫率 厩疙菩澄萍
			if(g_pServerSystem->GetNation() == eNATION_CHINA)
			{
				if(pPlayer->GetBadFame() >= 60)
					MugongExp = MogongNaeRyuk/4;
				else if(pPlayer->GetBadFame() >= 30)
					MugongExp = MogongNaeRyuk/2;
				else
					MugongExp = MogongNaeRyuk;
			}
				
			pPlayer->AddExpPointToMugong(GetSkillIndex(),MugongExp);
		}
	}
/*
	if( pObject->GetLevel() < m_SkillInfo.RestrictLevel &&
		m_SkillInfo.ComboNum != SKILL_COMBO_NUM )		// 老窜公傍篮 饭骇力茄 猾促.

⌨️ 快捷键说明

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