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

📄 battlerecord.h

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 H
字号:
#pragma once

#include <windows.h>
#include <hash_map>
#include <set>

using namespace std;
using namespace stdext;

class NPC;

/**

NPC绰 BattleRecord*甫 爱绰促.
俺牢利牢 傈捧俊 措茄 沥焊捞促.

*/
//--------------------------------------------------------------------------------------------------------------
//
//										BATTLE_RECORD
//
//--------------------------------------------------------------------------------------------------------------
/// 俺牢喊 傈捧 扁废
class BATTLE_RECORD
{
public :
	BATTLE_RECORD();
	~BATTLE_RECORD();

	VOID		Init();
	VOID		Update();

	inline VOID			SetObjectKey(DWORD objectKey)	{ m_ObjectKey = objectKey; }
	inline DWORD		GetObjectKey() const			{ return m_ObjectKey; }

	inline VOID			SetLevel( LEVELTYPE wLevel )	{ m_wLevel = wLevel; }
	inline LEVELTYPE	GetLevel() const				{ return m_wLevel; }

	inline VOID			SetFirstAttackerFlag( BOOL b )	{ m_bFirstAttacker = b; }
	inline BOOL			IsFirstAttacker() const			{ return m_bFirstAttacker; }

	inline int			GetAttackPoint() const			{ return m_AttackPoint; }
	inline VOID			IncAttackPoint(int point)		{ m_AttackPoint += point; }
	inline VOID			DecAttackPoint(int point)		{ m_AttackPoint = max(0, m_AttackPoint - point); }

	inline DWORD		GetTotalPoint() const			{ return m_dwTotalPoint; }
	inline VOID			IncTotalPoint( DWORD point )	{ m_dwTotalPoint += point; }
	inline VOID			DecTotalPoint( DWORD point )	{ m_dwTotalPoint = max( 0, m_dwTotalPoint - point ); }
	inline VOID			ResetTotalPoint()				{ m_dwTotalPoint = 0; }
	inline VOID			SetTotalPoint(DWORD point)		{ m_dwTotalPoint = point;}

	inline DWORD		GetCreateTick() const			{ return m_CreateTick; }

private :
	DWORD				m_ObjectKey;
	LEVELTYPE			m_wLevel;			// 弥檬俊 傍拜沁阑 锭狼 饭骇
	int					m_AttackPoint;		// 穿利 单固瘤
	DWORD				m_dwTotalPoint;		// 弥辆 痢荐
	DWORD				m_CreateTick;
	BOOL				m_bFirstAttacker;	// 弥檬肺 唱甫 傍拜茄 敲饭捞绢牢啊?
};

//--------------------------------------------------------------------------------------------------------------
//
//										BattleRecord
//
//--------------------------------------------------------------------------------------------------------------
/// 茄 NPC 趣篮 NPCGroup捞 利栏肺 牢侥窍绊 乐绰 Character甸俊 措茄 傈捧扁废
class BattleRecord
{
public :
	typedef		stdext::hash_map<DWORD, BATTLE_RECORD>	BATTLE_RECORDS;

public :
	BattleRecord();
	~BattleRecord();

	VOID					Init();
	
	BOOL					IsEmpty() const					{ return m_Records.empty(); }
	BOOL					IsExist( DWORD objectKey ) const;
	BATTLE_RECORD*			Get( DWORD objectKey );
	const BATTLE_RECORD*	Get( DWORD objectKey ) const;
	BATTLE_RECORD*			Add( Character *pAttacker, BOOL bFirstAttacker);
	BOOL					Remove( DWORD objectKey );
	int						GetCount() const				{ return (int)m_Records.size(); }
	VOID					IncTotalPoint( DWORD objectKey, DWORD point );
	Character*				SelectBestTarget( NPC *pNPC );
	inline LEVELTYPE		GetTotalLevel()	{ return m_dwTotalLevel; }

	VOID					Update( DWORD dwTick );

	template <class Finder>
	BATTLE_RECORD*			Find( Finder finder )
	{
		BATTLE_RECORDS::iterator iRecord = m_Records.begin();

		for (; iRecord != m_Records.end(); iRecord++ )
		{
			BATTLE_RECORD* pRecord = &iRecord->second;

			if (finder( pRecord ))
			{
				break;
			}
		}

		return finder.GetResult();
	}

	template<class RecordOperator>
	VOID					ForEachRecord( RecordOperator & Opr );

private :
	VOID					CalcTotalPoint( NPC *pNPC );

	BATTLE_RECORDS			m_Records;	
	LEVELTYPE				m_dwTotalLevel;
	DWORD					m_LastUpdateTick;
};

template<class RecordOperator>
VOID BattleRecord::ForEachRecord( RecordOperator & Opr )
{
	BATTLE_RECORD* pRecord = NULL;

	for( BATTLE_RECORDS::iterator iRecord = m_Records.begin(); iRecord != m_Records.end(); iRecord++ )
	{
		BATTLE_RECORD* pRecord = &iRecord->second;

		Opr( pRecord );
	}
}

//--------------------------------------------------------------------------------------------------------------
//
//										GreatestAttackPointFinder
//
//--------------------------------------------------------------------------------------------------------------
// 啊厘 attackPoint啊 腹篮 逞 茫扁
class GreatestAttackPointFinder
{
	typedef set<DWORD>		EXCEPT_CHARACTERS;

public :
	GreatestAttackPointFinder() 
	: m_pResult(NULL)
	{
	}

	bool			operator () (BATTLE_RECORD* pRecord)
	{
		ASSERT( pRecord != NULL );

		if (m_pResult==NULL || m_pResult->GetAttackPoint() < pRecord->GetAttackPoint())
		{
			EXCEPT_CHARACTERS::const_iterator itr = m_ExceptCharacters.find(pRecord->GetObjectKey());

			// except character啊 酒囱 版快俊..
			if (itr == m_ExceptCharacters.end())
			{
				// not except character
				m_pResult = pRecord;				
			}						
		}

		// not found --> continue
		return false;
	}

	VOID				AddExceptCharacter( DWORD dwKey )		{ m_ExceptCharacters.insert( dwKey ); }

	BATTLE_RECORD*		GetResult()		{ return m_pResult;	}

private :
	BATTLE_RECORD*		m_pResult;
	EXCEPT_CHARACTERS	m_ExceptCharacters;
};


//--------------------------------------------------------------------------------------------------------------
//
//										FirstBattleRecordFinder
//
//--------------------------------------------------------------------------------------------------------------
// 弥檬肺 眠啊等 BattleRecord 茫扁
class FirstBattleRecordFinder
{
public :
	FirstBattleRecordFinder() 
	: m_pResult(NULL)
	{
	}

	bool			operator () (BATTLE_RECORD* pRecord)
	{
		ASSERT( pRecord != NULL );

		if (m_pResult==NULL || pRecord->GetCreateTick() < m_pResult->GetCreateTick())
		{
			m_pResult = pRecord;
		}

		// not found --> continue
		return false;
	}

	BATTLE_RECORD*		GetResult()		{ return m_pResult;	}

private :
	BATTLE_RECORD*		m_pResult;
};

⌨️ 快捷键说明

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