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

📄 monster.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -