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

📄 monster.cpp

📁 墨香最新私服
💻 CPP
字号:
// Monster.cpp: implementation of the CMonster class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Monster.h"
#include "ObjectManager.h"
#include "MHCamera.h"
#include "MoveManager.h"
#include ".\interface\cWindowManager.h"
#include "ObjectGuagen.h"
#include "ObjectManager.h"
#include "GameResourceManager.h"
#include "MOTIONDESC.h"
#include "GameIn.h"
#include "ObjectStateManager.h"

#include "MonsterGuageDlg.h"


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

CMonster::CMonster()
{
	m_pSInfo = NULL;

	memset(&m_DummyMonsterInfo,0xaa,sizeof(MONSTER_TOTALINFO));
}

CMonster::~CMonster()
{

}


void CMonster::InitMonster(MONSTER_TOTALINFO* pTotalInfo)
{
	memcpy(&m_DummyMonsterInfo,pTotalInfo,sizeof(MONSTER_TOTALINFO));
	memcpy(&m_MonsterInfo,pTotalInfo,sizeof(MONSTER_TOTALINFO));
	m_pSInfo = GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind());
}

void CMonster::CheckTmpFunc()
{
	if(
		m_DummyMonsterInfo.MonsterKind != m_MonsterInfo.MonsterKind ||
		m_DummyMonsterInfo.Group != m_MonsterInfo.Group ||
		m_DummyMonsterInfo.MapNum != m_MonsterInfo.MapNum )
	{
		ASSERT(0);
	}
}
void CMonster::Process()
{
//	CheckTmpFunc();

	if(IsDied())
	{
		if( gCurTime - m_DiedTime > REMOVEFADE_START_TIME )
		{
			ShowObjectName( FALSE );
			ShowChatBalloon( FALSE, NULL );
			//弊覆磊档 绝局林磊.
			if(m_ShadowObj.IsInited())
			{
				m_ShadowObj.Release();
			}

			DWORD ToTime = REMOVEFADE_START_TIME;
			DWORD ElTime = gCurTime - m_DiedTime - REMOVEFADE_START_TIME;
			float alp = 1 - (ElTime / (float)ToTime);
			if(alp <= 0)
				alp = 0;
			GetEngineObject()->SetAlpha(alp);
			
			if( GAMEIN->GetMonsterGuageDlg() )
			if( GAMEIN->GetMonsterGuageDlg()->IsActive() == TRUE )
			{
				if( GAMEIN->GetMonsterGuageDlg()->GetCurMonster() == this )
				{
					GAMEIN->GetMonsterGuageDlg()->SetActive(FALSE);
				}
			}

		}
#ifdef _TESTCLIENT_
		if(gCurTime - m_DiedTime > MONSTERREMOVE_TIME)
		{
			OBJECTMGR->AddGarbageObject(this);
		}
#endif
	}
/*	
	// 磷菌阑锭 老沥茄 矫埃捞 瘤唱搁 芒 剁款促.
	if(GetState() == eObjectState_Die)
	{		
		if(gCurTime - GetStateStartTime() > REMOVEFADE_START_TIME)
		{
			// 霸捞瘤 昏力
			if( GAMEIN->GetMonsterGuageDlg() )
			{
				CMonster * pSelectedObj = GAMEIN->GetMonsterGuageDlg()->GetCurMonster();//OBJECTMGR->GetSelectedObject();
				if( pSelectedObj == this )
				{
//					OBJECTMGR->SetSelectedObject(NULL);
					GAMEIN->GetMonsterGuageDlg()->SetActive(FALSE);
				}
			}
		}
	}
*/	
	//////////////////////////////////////////////////////////////////////////


	CObject::Process();
}

void CMonster::SetMotionInState(BYTE State)
{
//	CheckTmpFunc();
	switch(State)
	{
	case eObjectState_Move:
		{			
			switch(m_MoveInfo.KyungGongIdx)
			{
			case eMA_WALKAROUND:
				{
					m_ObjectState.State_Start_Motion = GetMotionIDX(eMonsterMotionN_Walk);
					m_ObjectState.State_Ing_Motion = GetMotionIDX(eMonsterMotionN_Walk);
					m_ObjectState.State_End_Motion = GetMotionIDX(eMonsterMotionN_Walk);
				}
				break;
			case eMA_RUNAWAY:
				{
					m_ObjectState.State_Start_Motion = GetMotionIDX(eMonsterMotionN_Run);
					m_ObjectState.State_Ing_Motion = GetMotionIDX(eMonsterMotionN_Run);
					m_ObjectState.State_End_Motion = GetMotionIDX(eMonsterMotionN_Run);
				}
				break;
			case eMA_PERSUIT:
				{
					m_ObjectState.State_Start_Motion = GetMotionIDX(eMonsterMotionN_Run);
					m_ObjectState.State_Ing_Motion = GetMotionIDX(eMonsterMotionN_Run);
					m_ObjectState.State_End_Motion = GetMotionIDX(eMonsterMotionN_Run);
				}
				break;
			}
			m_ObjectState.State_End_MotionTime = 0;
			
			ChangeMotion(m_ObjectState.State_Start_Motion,FALSE);
			if(m_ObjectState.State_Ing_Motion != -1)
				ChangeBaseMotion(m_ObjectState.State_Ing_Motion);
		}
		break;
	case eObjectState_None:
		{
			m_ObjectState.State_Start_Motion = GetMotionIDX(eMonsterMotionN_Stand);
			m_ObjectState.State_Ing_Motion = GetMotionIDX(eMonsterMotionN_Stand);
			m_ObjectState.State_End_Motion = GetMotionIDX(eMonsterMotionN_Stand);
			m_ObjectState.State_End_MotionTime = 0;
		}
		break;
	default:
		{
			m_ObjectState.State_Start_Motion = -1;
			m_ObjectState.State_Ing_Motion = -1;
			m_ObjectState.State_End_Motion = -1;
			m_ObjectState.State_End_MotionTime = 0;
		}
		break;
	}
/*
		switch(State)
		{
		case eObjectState_Move:
			{
				m_ObjectState.State_Start_Motion = eMonsterMotion_Walk;
				m_ObjectState.State_Ing_Motion = eMonsterMotion_Walk;
				m_ObjectState.State_End_Motion = eMonsterMotion_Walk;
				m_ObjectState.State_End_MotionTime = 0;
			}
			break;
		case eObjectState_None:
			{
				m_ObjectState.State_Start_Motion = eMonsterMotion_Standard;
				m_ObjectState.State_Ing_Motion = eMonsterMotion_Standard;
				m_ObjectState.State_End_Motion = eMonsterMotion_Standard;
				m_ObjectState.State_End_MotionTime = 0;
			}
			break;
		default:
			{
				m_ObjectState.State_Start_Motion = -1;
				m_ObjectState.State_Ing_Motion = -1;
				m_ObjectState.State_End_Motion = -1;
				m_ObjectState.State_End_MotionTime = 0;
			}
			break;
		}*/

}

//////////////////////////////////////////////////////////////////////////
// 青悼 窃荐甸..
void CMonster::Die(CObject* pAttacker,BOOL bFatalDamage,BOOL bCritical)
{
//	CheckTmpFunc();
//	OBJECTSTATEMGR->EndObjectState(this,eObjectState_Die,REMOVEFADE_START_TIME);
	if(pAttacker)
		MOVEMGR->SetLookatPos(this,&pAttacker->GetCurPosition(),0,gCurTime);

	int DieEffect;
	if(bFatalDamage)
		DieEffect = GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind())->Die2DramaNum;	// 朝扼啊辑 磷扁
	else
		DieEffect = GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind())->Die1DramaNum;	// 弊成 磷扁
		
	if(DieEffect != -1)
	{
		TARGETSET set;
		set.pTarget = this;
		set.ResultInfo.bCritical = bCritical;
		
		EFFECTMGR->StartEffectProcess(DieEffect,pAttacker,&set,1,GetID(),
							EFFECT_FLAG_DIE|EFFECT_FLAG_GENDERBASISTARGET);
	}

	// Life 悸泼
	SetLife(0);
	
	CObject::Die(pAttacker,bFatalDamage,bCritical);
}
void CMonster::Damage(CObject* pAttacker,BYTE DamageKind,DWORD Damage,DWORD ShieldDamage,BOOL bCritical)
{	
//	CheckTmpFunc();
	if(Damage != 0)
	{
		if(GetState() == eObjectState_None)
		{
			if(pAttacker)
				MOVEMGR->SetLookatPos(this,&pAttacker->GetCurPosition(),0,gCurTime);
		}
		
		if(GetState() == eObjectState_None)
		{
			ChangeMotion(1,FALSE);
			switch(DamageKind) {
			case eDamageKind_Front:
				ChangeMotion(eMonsterMotion_DamageFront,FALSE);
				break;
			case eDamageKind_Left:
				ChangeMotion(eMonsterMotion_DamageLeft,FALSE);
				break;
			case eDamageKind_Right:
				ChangeMotion(eMonsterMotion_DamageRight,FALSE);
				break;
			}	
		}
		
		int DamageEffect = GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind())->Damage1DramaNum;

		if(DamageEffect != -1)
		{
			TARGETSET set;
			set.pTarget = this;
			set.ResultInfo.bCritical = bCritical;
			
			EFFECTMGR->StartEffectProcess(DamageEffect,pAttacker,&set,1,GetID(),
											EFFECT_FLAG_GENDERBASISTARGET);
		}
	}

	if( pAttacker == HERO )	//磊脚狼 单固瘤 锅龋父 钎矫 //KES 040801
		EFFECTMGR->AddDamageNumber(Damage,pAttacker,this,DamageKind,bCritical);
	
	// Life 悸泼
	DWORD life = GetLife();
	if(life < Damage)
		life = 0;
	else
		life = life - Damage;
	SetLife(life);
	
	// Shield 悸泼
	DWORD Shield = GetShield();
	if(Shield < ShieldDamage)
		Shield = 0;
	else
		Shield = Shield - ShieldDamage;
	SetShield(Shield,FALSE);	
}
void CMonster::Heal(CObject* pHealer,BYTE HealKind,DWORD HealVal)
{
//	CheckTmpFunc();
	DWORD life = GetLife() + HealVal;
	SetLife(life);
}

void CMonster::Attack(int AttackNum,CObject* pTarget)
{
	/*int AttackEffect;
	if(AttackNum)
		AttackEffect = GAMERESRCMNGR->GetMonsterInfo(GetMonsterKind())->Attack1DramaNum;
	else
		AttackEffect = GAMERESRCMNGR->GetMonsterInfo(GetMonsterKind())->Attack2DramaNum;

	if(AttackEffect != -1)
	{
		TARGETSET set;
		set.pTarget = pTarget;
		set.TargetData = 0;
		EFFECTMGR->StartMonEffectProcess(AttackEffect,this,&set,1,pTarget->GetID());
	}*/
}

float CMonster::GetWeight()
{
//	CheckTmpFunc();
	BASE_MONSTER_LIST* pList = GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind());
	ASSERT(pList->MonsterKind == GetMonsterKind());
	return pList->Weight;
}

float CMonster::GetRadius()
{
//	CheckTmpFunc();
	BASE_MONSTER_LIST* pList = GAMERESRCMNGR->GetMonsterListInfo(GetMonsterKind());
	ASSERT(pList->MonsterKind == GetMonsterKind());
	return (float)pList->MonsterRadius;
}

void CMonster::SetLife(DWORD val, BYTE type)
{
//	CheckTmpFunc();
	m_MonsterInfo.Life = val;

	if( GAMEIN->GetMonsterGuageDlg() && m_pSInfo )
	{
		if( GAMEIN->GetMonsterGuageDlg()->GetCurMonster() == this )
		{
			GAMEIN->GetMonsterGuageDlg()->SetMonsterLife( val, m_pSInfo->Life );
		}
	}
}

void CMonster::SetShield(DWORD val, BYTE type)
{
//	CheckTmpFunc();
	m_MonsterInfo.Shield = val;

	if( GAMEIN->GetMonsterGuageDlg() && m_pSInfo )
	{
		if( GAMEIN->GetMonsterGuageDlg()->GetCurMonster() == this )
		{
			GAMEIN->GetMonsterGuageDlg()->SetMonsterShield( val, m_pSInfo->Shield );
		}
	}
}

float CMonster::DoGetMoveSpeed()
{
//	CheckTmpFunc();
	float Speed;
	WORD kind = GetMonsterKind();
//	if(kind == 0)
//		int a =1;
	switch(m_MoveInfo.KyungGongIdx)
	{
	case eMA_WALKAROUND:
		{
			Speed = (float)GAMERESRCMNGR->GetMonsterListInfo(kind)->WalkMove;
		}
		break;
	case eMA_RUNAWAY:
		{
			Speed = (float)GAMERESRCMNGR->GetMonsterListInfo(kind)->RunawayMove;
		}
		break;
	case eMA_PERSUIT:
		{
			Speed = (float)GAMERESRCMNGR->GetMonsterListInfo(kind)->RunMove;
		}
		break;
	default:
		{
			Speed = 0;
//			ASSERT(0);
		}
		break;
	}
	return Speed;
}

⌨️ 快捷键说明

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