#include "stdafx.h" #include "RunAwayState.h" #include #include #include #include #include "GameField.h" #include "Player.h" RunAwayState::RunAwayState() { #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE m_dwTargetKey = 0; m_abilityID = eABILITY_INVALID; #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE } RunAwayState::~RunAwayState() { } void RunAwayState::Init() { __noop; } void RunAwayState::OnEnter(LPARAM param1, LPARAM param2, LPARAM param3) { State::OnEnter(param1, param2, param3); m_vTargetPos = *m_pNPC->GetPosPtr(); m_bTouchedSomething = false; // µµ¸Á°¡¾ßÇÒ ÀûÀ» ã¾Æ¼­ Ÿ°Ù°ú À§Ä¡¸¦ ¼ÂÆÃÇÑ´Ù. DWORD target_key = static_cast(param1); Player* pTarget = PlayerManager::Instance()->FindPlayerByObjKey(target_key); if (pTarget) { m_pNPC->SetTargetChar(pTarget); m_vTargetPos = *pTarget->GetPosPtr(); } #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE DWORD delay = m_pAITypeInfo->m_wRUNAWAY_TIME; const AI_MSG_RUNAWAY* pRecvMsg = reinterpret_cast(param2); if (param1 != NULL && pRecvMsg != NULL) { delay = pRecvMsg->dwRunAwayTime; m_abilityID = pRecvMsg->abilityID; } m_dwTargetKey = target_key; #else // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE // µµ¸Á°¡¾ßÇÒ ½Ã°£À» ¼ÂÆÃÇÑ´Ù. DWORD delay = param1 ? static_cast(param2) : m_pAITypeInfo->m_wRUNAWAY_TIME; #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE m_RunAwayTimer.SetTimer(delay); //__NA_S00015_20080828_NEW_HOPE_SHADOW m_wStateID = static_cast(param3); // TODO : need check boundary } void RunAwayState::OnExit() { State::OnExit(); } BOOL RunAwayState::OnUpdate(DWORD dwDeltaTick) { __UNUSED(dwDeltaTick); if (!m_pNPC->IsMoving()) { RunAway(); } if (m_RunAwayTimer.IsExpired()) { if (m_pNPC->GetTargetChar()) { m_pNPC->ChangeState(STATE_ID_HELP); } else { m_pNPC->SetTargetChar(NULL); m_pNPC->ChangeState(STATE_ID_IDLE); } } return true; } void RunAwayState::RunAway() { // À̵¿ÇÒ °Å¸®¸¦ ±¸ÇÑ´Ù. float MOVE_DISTANCE = (float)dRandom(AIParamParser::AICommonInfo.m_fMIN_MOVE_DISTANCE, AIParamParser::AICommonInfo.m_fMAX_MOVE_DISTANCE); #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE if (m_abilityID == eABILITY_CHARMED) // ¸ÅȤ { Player* pTarget = PlayerManager::Instance()->FindPlayerByObjKey(m_dwTargetKey); // Ÿ°Ù À§Ä¡ °»½Å if (pTarget) { m_pNPC->SetTargetChar(pTarget); m_vTargetPos = *pTarget->GetPosPtr(); } MOVE_DISTANCE = 1; // 1À» À̵¿ÇÒ¶§¸¶´Ù Ÿ°ÙÀÇ À§Ä¡¸¦ °»½ÅÇϵµ·Ï ÇÑ´Ù MOVE_DISTANCE *= -1; // ¹æÇâ ¼³Á¤ } #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE const WzVector& wvCurPos = *m_pNPC->GetPosPtr(); GameField* pField = m_pNPC->GetField(); if (pField == NULL) return; WzVector wvMovement; // ÀÌÀü ±æÃ£±â¿¡¼­ ¹«¾ð°¡¿¡ ´êÀº °æ¿ì 60µµ ȸÀü½Ã۰í, ±×·¸Áö ¾Ê´Ù¸é ·£´ýÇÑ ¹æÇâÀ¸·Î Æ÷ÀÎÆÃ if (m_bTouchedSomething) { m_bTouchedSomething = false; wvMovement = m_wvRotatedVector; } else { VectorNormalize(&wvMovement, &(wvCurPos - m_vTargetPos)); wvMovement.x *= MOVE_DISTANCE; wvMovement.y *= MOVE_DISTANCE; } wvMovement.z = 2.f; WzVector& wvDestPos = wvCurPos + wvMovement; if (!pField->FindPath(m_pNPC, &wvDestPos, (eCHAR_STATE_TYPE)m_wStateID)) { // Àå¾Ö¹°¿¡ ´ê¾Ò´Ù´Â Ç¥½Ã¸¦ Çϰí Áö±Ý °¡·Á´Â ¹æÇâ¿¡¼­ 60µµ ȸÀü½ÃŲ º¤Å͸¦ ±¸ÇصдÙ. m_bTouchedSomething = true; const WzVector& wvDistanceWantToMove = wvDestPos - wvCurPos; m_wvRotatedVector.x = wvDistanceWantToMove.x * g_SinTable.FCOS(AIParamParser::AICommonInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * g_SinTable.FSIN(AIParamParser::AICommonInfo.m_wSEARCH_ROTATE_ANGLE); m_wvRotatedVector.y = -wvDistanceWantToMove.x * g_SinTable.FSIN(AIParamParser::AICommonInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * g_SinTable.FCOS(AIParamParser::AICommonInfo.m_wSEARCH_ROTATE_ANGLE); m_wvRotatedVector.z = 0.0f; return; } m_pNPC->SetMoveState(CMS_RUN); { MSGSUB_SYNC_MOVE_THRUST_BRD msg; msg.m_dwObjectKey = m_pNPC->GetObjectKey(); msg.m_byState = CMS_RUN; msg.m_wTileIndex = m_pNPC->GetPathExplorer()->GetTile(); msg.m_byState = CMS_RUN; //ij¸¯ÅÍÀÇ °æ¿ì´Â ¹«Á¶°Ç ¶Ù±â¸¸ Á¸Àç!!(¸ó½ºÅÍ¿Í °°ÀÌ ¾²´Â ÆÐŶÀ̹ǷΠ°ªÀº ³Ö¾îÁÜ) msg.m_wvCurPos = wvCurPos; msg.m_wvDestPos = wvDestPos; m_pNPC->SendPacketAroundForSync(&msg); }; } // µµ¸Á»óŰ¡ ³¡³ª¸é Follow(Idle)»óÅ·Πº¹±ÍÇÑ´Ù. void RunAwayState::OnMsgCommandFollow(const AI_MSG* pMsg) { m_pNPC->SetTargetChar(NULL); }