📄 battlerecord.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 + -