#include "stdafx.h" #include "DeadState.h" #include "GameField.h" #include "AIParamParser.h" #include "TargetManager.h" DeadState::DeadState() { } DeadState::~DeadState() { } void DeadState::Init() { __noop; } void DeadState::OnEnter(LPARAM param1, LPARAM param2, LPARAM param3) { State::OnEnter(param1, param2, param3); // (CHANGES) (100206) (WAVERIX) PCC_CONTINUING_NPC_UPDATE Ãß°¡¿¡ µû¸¥ »óÅ ¹Ý¿µ const sPOLICY_CHARACTER& kCharPolicy = m_pNPC->Policyment; __TOUCHED(kCharPolicy); m_pNPC->ChangePolicyPostEnterField(kCharPolicy.PCC_CONTINUING_NPC_UPDATE, kCharPolicy.PCC_DISABLE_ALL, NULL); // CHANGES: f110720.2L, remove assertion check. a MapObject npc don't have no dead interval. //ASSERT(param1); DWORD interval = static_cast(param1); m_DeadTimer.SetTimer(interval); } void DeadState::OnExit() { State::OnExit(); // (CHANGES) (100206) (WAVERIX) PCC_CONTINUING_NPC_UPDATE Ãß°¡¿¡ µû¸¥ »óÅ ¹Ý¿µ // CHANGES: f110228.1L, remove deletion state to prevent skip update routine if a monster is dead } BOOL DeadState::OnUpdate(DWORD dwDeltaTick) { __UNUSED(dwDeltaTick); // (WAVERIX)(080923)(NOTE) ÇöÀç·Î¼­´Â ±¸Á¶°¡ ÁÁÁö ¾Ê´Ù. ÀÏ´Ü ±âÁ¸ Äڵ忡 ¹¯¾î°¡´Â ½ÄÀÇ ¶«»§ 󸮷Πº¯°æÇÑ´Ù. const BOOLEAN isExpired = m_DeadTimer.IsExpired(); if (isExpired) { GameField* const pField = m_pNPC->GetField(); if (!pField) { SUNLOG(eCRITICAL_LOG, "[DeadState::OnUpdate] GameField is NULL"); m_pNPC->ChangeState(STATE_ID_DESTROY_OBJECT); return true; } const BOOLEAN exist_trans = !!m_pNPC->IsSpecialAction(eNPC_SPECIAL_ACTION_TRANSFORMATION); const BOOLEAN exist_selfdest= !exist_trans && m_pNPC->IsSpecialAction(eNPC_SPECIAL_ACTION_SELP_DESTRUCTION); if (exist_trans ^ exist_selfdest) { SPECIAL_CONDITION* special_condition = m_pNPC->GetDrawLotsSpecialAction(); if (special_condition) { m_pNPC->ChangeState(STATE_ID_SPECIAL_DEAD_ACTION, reinterpret_cast(special_condition)); return true; } } m_pNPC->ChangeState(STATE_ID_DESTROY_OBJECT); } return true; } void DeadState::OnAIMsg(const AI_MSG* pMsg) { switch (pMsg->dwMsgID) { case AI_MSG_ID_LEAVE_FIELD: OnMsgLeaveField(pMsg); break; } } void DeadState::OnMsgLeaveField(const AI_MSG* pMsg) { const AI_MSG_LEAVE_FIELD* pLeaveMsg = static_cast(pMsg); m_pNPC->GetTargetManager()->RemoveTarget(pLeaveMsg->dwObjectKey); }