📄 monster.cpp
字号:
#include "stdafx.h"
#include "Monster.h"
#include "Field.h"
#include "IdleState.h"
#include "WanderState.h"
#include "TrackState.h"
#include "AttackState.h"
#include "HelpState.h"
#include "DeadState.h"
#include "ThrustState.h"
#include "JumpState.h"
#include "FallApartState.h"
#include "ReturnState.h"
#include "RetreatState.h"
#include "FlyingState.h"
#include "KnockDownState.h"
#include "RunAwayState.h"
#include "ChaosState.h"
#include "Map.h"
#include "GameZone.h"
#include "GameRoom.h"
#include "Party.h"
#include "PartyManager.h"
#include "StatusManager.h"
#include "CharacterFormula.h"
#include "RegenLocation.h"
#include "AIParamParser.h"
#include "DropManager.h"
#include "TriggerMsg.h"
#include "TriggerManager.h"
#include "NPCStateManager.h"
#include "PatrolState.h"
Monster::Monster() : m_pRegenLocation(NULL)
{
SetObjectType( MONSTER_OBJECT );
}
Monster::~Monster()
{
}
BOOL Monster::Init()
{
m_iPlayerReferenceCount = 0;
WzVector wzVec = { 0, 0, 0 };
SetRegenPos( wzVec );
return NPC::Init();
}
VOID Monster::Release()
{
NPC::Release();
m_pRegenLocation = NULL;
}
VOID Monster::Update( DWORD dwDeltaTick )
{
// 钮俊 阶牢 AI 皋技瘤 贸府
AIMsgProgress();
if( m_iPlayerReferenceCount )
{
// 老沥 矫埃付促 傍拜 措惑 犁瘤沥(绢弊肺 贸府)
if( m_pAggroTimer->IsExpired() )
{
// 林函俊 货肺款 鸥百捞 乐栏搁 硅撇饭内靛俊 殿废阑 茄促.
AllRegisterBattleRecord();
if( GetTargetChar() != NULL )
{
SelectBestTarget();
}
}
m_pNPCStatusManager->Update( dwDeltaTick );
m_pBattleRecord->Update( GetTickCount() );
}
NPC::Update( dwDeltaTick );
}
VOID Monster::OnEnterField( Field* pField, WzVector* pwzVec )
{
Init();
if( !pField ) return;
Map* pMap = pField->GetMap();
if( !pMap ) return;
GameZone * pZone = pMap->GetGameZone();
if( !pZone ) return;
SetRegenPos( *pwzVec );
if( pZone->GetZoneType() == eZONETYPE_HUNTING ||
pZone->GetZoneType() == eZONETYPE_MISSION )
{
GameRoom * pRoom = (GameRoom *)pZone;
// Room狼 颇萍盔 荐甫 曼炼窍咯 HP甫 促矫 悸泼茄促.
Party *pParty = pRoom->GetParty( 0 );
if( pParty )
{
SetHPAttackPowerAsParty( pParty->GetMemberNum() );
}
}
// HP, MP 磊悼雀汗
if( IsHPMPRegenNPC() )
{
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
m_pStatusManager->AllocStatus( eCHAR_STATE_ETC_AUTO_RECOVER_HPMP, BASE_EXPIRE_TIME_INFINITY, stAIParamInfo.m_wNPC_HPMP_REGEN_PERIOD );
}
Character::OnEnterField(pField, pwzVec);
SASSERT( GetField() != NULL, "GetField() == NULL" );
BOOL bAdded = pField->AddNPC( this );
SASSERT( bAdded, "bAdded" );
}
VOID Monster::OnLeaveField()
{
// 权 康开俊辑 力芭
if( m_pRegenLocation )
{
m_pRegenLocation->DecreaseNPC( m_pBaseInfo->m_MonsterCode );
}
NPC::OnLeaveField();
}
VOID Monster::SetHPAttackPowerAsParty( DWORD dwCurMemberNum )
{
if( !dwCurMemberNum ) return;
// MaxHP, CurHP甫 棵赴促.
float fIncreaseRatio = CalcHPIncreaseRatioAsParty( dwCurMemberNum );
DWORD dwMaxHP = (DWORD)( m_pBaseInfo->m_dwMaxHP * fIncreaseRatio );
DWORD dwCurHP = dwMaxHP;
// if( GetMaxHP() > 0 ) dwCurHP = max( (DWORD)( dwMaxHP * GetHP() / GetMaxHP() ), 1 );
m_Attr[eATTR_MAX_HP][eATTR_KIND_BASE] = dwMaxHP;
m_Attr.Update();
SetHP( dwCurHP );
// 弥家, 弥措 傍拜仿阑 棵赴促.
int iCount = 0;
int iMinAttackPower, iMaxAttackPower, iBonusMinAttackPower, iBonusMaxAttackPower;
eATTR_TYPE eMinAttrType, eMaxAttrType;
// 扁夯 拱府(辟芭府, 盔芭府) 傍拜仿 惑铰
iMinAttackPower = GetAttr().GetBaseMeleeMinAttPower();
iMaxAttackPower = GetAttr().GetBaseMeleeMaxAttPower();
iBonusMinAttackPower = CalcAttackPowerIncreaseAsParty( dwCurMemberNum, iMinAttackPower );
iBonusMaxAttackPower = CalcAttackPowerIncreaseAsParty( dwCurMemberNum, iMaxAttackPower );
m_Attr[eATTR_ADD_MELEE_MIN_ATTACK_POWER][eATTR_KIND_BASE] = iBonusMinAttackPower;
m_Attr[eATTR_ADD_MELEE_MAX_ATTACK_POWER][eATTR_KIND_BASE] = iBonusMaxAttackPower;
iMinAttackPower = GetAttr().GetBaseRangeMinAttPower();
iMaxAttackPower = GetAttr().GetBaseRangeMaxAttPower();
iBonusMinAttackPower = CalcAttackPowerIncreaseAsParty( dwCurMemberNum, iMinAttackPower );
iBonusMaxAttackPower = CalcAttackPowerIncreaseAsParty( dwCurMemberNum, iMaxAttackPower );
m_Attr[eATTR_ADD_RANGE_MIN_ATTACK_POWER][eATTR_KIND_BASE] = iBonusMinAttackPower;
m_Attr[eATTR_ADD_RANGE_MAX_ATTACK_POWER][eATTR_KIND_BASE] = iBonusMaxAttackPower;
// 扁夯付过 + 加己付过 傍拜仿 惑铰
for( BYTE byAttackType = eATTACK_TYPE_WATER; byAttackType < eATTACK_TYPE_DIVINE; ++byAttackType )
{
iMinAttackPower = GetAttr().GetBaseMagicMinAttPower() + GetAttr().GetMagicalAttackPower( (eATTACK_TYPE)byAttackType );
iMaxAttackPower = GetAttr().GetBaseMagicMaxAttPower() + GetAttr().GetMagicalAttackPower( (eATTACK_TYPE)byAttackType );
iBonusMinAttackPower = CalcAttackPowerIncreaseAsParty( dwCurMemberNum, iMinAttackPower );
iBonusMaxAttackPower = CalcAttackPowerIncreaseAsParty( dwCurMemberNum, iMaxAttackPower );
eMinAttrType = (eATTR_TYPE)( eATTR_ADD_WATER_MIN_ATTACK_POWER + iCount );
eMaxAttrType = (eATTR_TYPE)( eATTR_ADD_WATER_MAX_ATTACK_POWER + iCount );
m_Attr[eMinAttrType][eATTR_KIND_BASE] = iBonusMinAttackPower;
m_Attr[eMaxAttrType][eATTR_KIND_BASE] = iBonusMaxAttackPower;
++iCount;
}
m_Attr.Update();
}
// 规炔 裹困
BOOL Monster::IsOutOfWanderRadius() const
{
float fDistToRegenPos = GetDist2( m_RegenPos );
// TODO: 快急 磊脚捞 府哩等 镑栏肺何磐 50m 冻绢瘤搁 府哩康开阑 哈绢抄 巴栏肺 茄促.
// RegenInfo肺何磐 角力 沥焊甫 佬绰巴栏肺 荐沥秦具茄促.
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( fDistToRegenPos > stAIParamInfo.m_fWANDER_RADIUS_FROM_REGENAREA*stAIParamInfo.m_fWANDER_RADIUS_FROM_REGENAREA )
{
return TRUE;
}
return FALSE;
}
// 捞芭绰 轿快促富绊 公炼扒 倒酒啊霸 登绰 弥措 康开
BOOL Monster::IsOutOfRegenLocationLimit( WzVector &vTargetPos ) const
{
// 50m甫 哈绢唱搁 公炼扒 倒酒埃促.
float fDistToRegenPos = GetDist2( m_RegenPos );
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( fDistToRegenPos > stAIParamInfo.m_fREGEN_LOCATION_LIMIT*stAIParamInfo.m_fREGEN_LOCATION_LIMIT )
{
return TRUE;
}
return FALSE;
}
BOOL Monster::OnDead()
{
// 版氰摹甫 盒硅茄促.
DistributeExp();
// 酒捞袍阑 刚历 犬伏拌魂饶 角菩窍搁 捣 犬伏 拌魂
WzVector vDropPos; GetPos( &vDropPos );
// 泅犁 酒捞袍俊 措茄 家蜡鼻捞 绝促!
g_DropManager.Drop( GetField(), GetSectorIndex(), &vDropPos, NULL, GetObjectKey(), GetBaseInfo(), (eNPC_GRADE)GetBaseInfo()->m_byGrade, GetDisplayLevel() );
if( m_KillerType == PLAYER_OBJECT && m_dwKillerObjectKey != 0 )
{
Player * pOwner = PlayerManager::Instance()->FindPlayerForObjectKey(m_dwKillerObjectKey);
if(pOwner)
{
// TriggerManager肺 捞亥飘 皋技瘤 焊晨
TRIGGER_KILL_MONSTER msg;
msg.m_dwMonsterCode = m_pBaseInfo->m_MonsterCode;
msg.m_dwObjectKey = m_dwKillerObjectKey;
GetField()->GetTriggerManager()->OnMsg( &msg );
}
}
return NPC::OnDead();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -