📄 skillinfo.cpp
字号:
// 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 + -