Files
2022-10-26 12:25:11 +08:00

166 lines
4.3 KiB
C++

#pragma once
#include <ITimeout.h>
class State;
//==================================================================================================
// @history
// ~09/12/22
// 09/12/22, waverix, code-arrangement
namespace nsAI {
//--------------------------------------------------------------------------------------------------
struct CmdAI
{
enum eCmd {
eCmd_None = 0,
eCmd_Escape = 1<<20,
};
enum eArgOpt {
//eArg_PathCmd_ListSize = 5,
};
const eCmd Cmd;
CmdAI() : Cmd(eCmd_None) {}
CmdAI(const eCmd _cmd) : Cmd(_cmd) {}
struct DefaultArgs;
struct Escape;
__DISABLE_COPY(CmdAI);
};
//--------------------------------------------------------------------------------------------------
struct CmdAI::Escape : public CmdAI
{
const DWORD TimeoutInterval;
const WORD DestTileNo;
const WzVector* pDestPos;
Escape(DWORD timeoutInterval, WORD destTileNo, const WzVector* const _pDestPos = NULL)
: CmdAI(CmdAI::eCmd_Escape)
, TimeoutInterval(timeoutInterval)
, DestTileNo(destTileNo)
, pDestPos(_pDestPos)
{}
__DISABLE_COPY(Escape);
};
//--------------------------------------------------------------------------------------------------
class EscapeState;
}; //end of namespace 'nsAI'
//==================================================================================================
// <NPCStateManager>
class NPCStateManager
{
public:
NPCStateManager(NPC* pOwner);
~NPCStateManager();
void Init(DWORD stateID, BYTE byMoveType, DWORD moveAreaID, LPARAM param1 = 0);
void Release();
BOOL Update(DWORD delta_tick);
void AddStateObject(DWORD stateID, DWORD linkStateID);
void ChangeState(DWORD stateID, LPARAM param1 = 0, LPARAM param2 = 0, LPARAM param3 = 0);
State* GetCurState() const;
void SetRequestHelp(BOOL bHelp);
BOOLEAN IsRequestHelp() const;
eNPC_MOVE_ATTITUDE GetMoveType() const;
DWORD GetMoveAreaID() const;
#ifdef _NA_007907_20141222_MODIFY_MONSTER_MOVE_TRIGGER
void SetMoveAreaID(DWORD move_area_id);
#endif // _NA_007907_20141222_MODIFY_MONSTER_MOVE_TRIGGER
//_NA_0_20100222_UNIT_TRIGGERS_PATHLIST = {
void SetMovePosIndex(WORD pos_index) { pos_index_ = pos_index; }
BOOL IncreaseMovePosIndex();
BOOL DecreaseMovePosIndex();
const eCHAR_MOVE_STATE GetWalkState() const;
bool IsArrivedLastPosition() const; // 위치 목록 중 마지막 위치에 도달 했는지 검사한다.
//}
const WzVector& GetStartPos() const;
const WzVector& GetDestPos() const;
void RequestCommand_(const nsAI::CmdAI& rCmd);
void ResetStateObject(); //_NA_0_20100514_NPC_DEAD_STATE_TIME
private:
struct StateTransaction
{
StateTransaction(BYTE& bTrans) : m_bTrans(bTrans) { m_bTrans = true; }
~StateTransaction() { m_bTrans = false; }
BYTE& m_bTrans;
__DISABLE_COPY(StateTransaction);
};
void ClearFields();
private:
typedef STLX_MAP<DWORD, State*> STATE_MAP;
NPC* const m_pNPC; // 상태 주체
State* m_pCurState; // 현재 상태 (Delegator)
STATE_MAP m_mapStates; // 상태 리스트
eNPC_MOVE_ATTITUDE m_eMoveType; // 이동 성향
DWORD m_dwMoveAreaID; // 이동 영역
WORD pos_index_;
ITimerBase m_SpecialTimer; // 특수조건, 상태저항
// for DEBUG
ITimeout m_StateChangeCheckTimer;
WORD m_StateChangeCount; // <주의!> 이 부분부터 순서 바꾸면 용량 늘어남
BYTE m_bStateTransaction;
BOOLEAN m_bRequestHelp; // Help 요청을 한 상태인가?
nsAI::EscapeState* m_pEscapeState;
__DISABLE_COPY(NPCStateManager);
};
//==================================================================================================
inline State*
NPCStateManager::GetCurState() const {
return m_pCurState;
}
inline void
NPCStateManager::SetRequestHelp(BOOL bHelp) {
m_bRequestHelp = !!bHelp;
}
inline BOOLEAN
NPCStateManager::IsRequestHelp() const {
return m_bRequestHelp;
}
inline eNPC_MOVE_ATTITUDE
NPCStateManager::GetMoveType() const {
return m_eMoveType;
}
inline DWORD
NPCStateManager::GetMoveAreaID() const {
return m_dwMoveAreaID;
}
#ifdef _NA_007907_20141222_MODIFY_MONSTER_MOVE_TRIGGER
inline void
NPCStateManager::SetMoveAreaID(DWORD move_area_id) {
m_dwMoveAreaID = move_area_id;
}
#endif // _NA_007907_20141222_MODIFY_MONSTER_MOVE_TRIGGER
inline void
NPCStateManager::Release() {
ClearFields();
}