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

259 lines
6.7 KiB
C++

#include "stdafx.h"
#include "ZoneControl.h"
//
#include <SinTable.h>
#include <SCPlayer.h>
//
#include "WiseMapInfo.h"
#include <Information/Zone/ZoneManager.h>
#include <Information/Zone/GameZone.h>
//////////////////////////////////////////////////////////////////////////
//
ZoneControl::ZoneControl()
{
m_pUser = NULL;
m_pGameZone = NULL;
m_bMapPosCmdBlock = TRUE;
m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_ARG_CLEAR] = _CMD_ZONE_ARG_CLEAR;
m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_GET_CUR_INFO] = _CMD_ZONE_GET_CUR_INFO;
m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_MOV_START] = _CMD_ZONE_MOV_START;
m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_MOV_END] = _CMD_ZONE_MOV_END;
m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_CLEAR] = _CMD_ZONE_CLEAR;
ZoneMoveCmd(eZONE_MOV_CMD::CMD_ZONE_CLEAR, NULL);
m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_ARG_CLEAR] = _CMD_POS_ARG_CLEAR;
m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_GET_CUR_INFO] = _CMD_POS_GET_CUR_INFO;
m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_SET_CUR_INFO] = _CMD_POS_SET_CUR_INFO;
m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_CALC_MOV_DIRECTION]= _CMD_POS_CALC_MOV_DIRECTION;
m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_CALC_MOV_TARGET] = _CMD_POS_CALC_MOV_TARGET;
m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_CLEAR] = _CMD_POS_CLEAR;
MapPosCmd(eMAP_POS_CMD::CMD_POS_CLEAR, NULL);
m_ZONE_CTRL_INFO.Clear();
}
ZoneControl::~ZoneControl()
{
}
//////////////////////////////////////////////////////////////////////////
//
BOOL ZoneControl::ZoneMoveCmd(eZONE_MOV_CMD IN zCMD, sZONE_MOVINFO_ARG* IN OUT pARG)
{
if((DWORD)zCMD < eZONE_MOV_CMD::CMD_ZONE_MAX)
return (this->*m_ZONE_HANDLERS[zCMD])(pARG);
return FALSE;
}
BOOL ZoneControl::_CMD_ZONE_ARG_CLEAR(sZONE_MOVINFO_ARG* IN OUT pARG)
{
if(pARG)
{
ZeroMemory(pARG, sizeof(*pARG));
return TRUE;
}
return FALSE;
}
BOOL ZoneControl::_CMD_ZONE_GET_CUR_INFO(sZONE_MOVINFO_ARG* OUT pARG)
{
if(pARG)
{
CopyMemory(pARG, &m_ZONE_MOV_INFO, sizeof(*pARG));
return TRUE;
}
return FALSE;
}
// 1) _CMD_ZONE_GET_CUR_INFO
// 2) 이동할 위치 설정
// 3) _CMD_ZONE_MOV_START
BOOL ZoneControl::_CMD_ZONE_MOV_START(sZONE_MOVINFO_ARG* IN pARG)
{
sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO;
if(pARG && (pARG->ZONETYPE_CUR == rINFO.ZONETYPE_CUR))
{
if(!_IsZoneTransaction())
{
sZONE_MOVINFO_ARG& rARG = *pARG;
rINFO.ZONETYPE_NEXT = rARG.ZONETYPE_NEXT;
rINFO.FIELDCODE_NEXT = rARG.FIELDCODE_NEXT;
_GetZoneStateByMoving(rINFO.ZONESTATE_CUR);
if(ePRS_BEFORE_ENTER_ZONE != rINFO.ZONESTATE_CUR)
{
// NULL이 아닌 경우 Release 필요할 듯 하지만 일단!
// 그리고 바뀐 경우에 대한 보완책은?
m_pGameZone = ZoneManager::GetMap(rINFO.FIELDCODE_NEXT);
return TRUE;
}
DEBUGGING_CODE_L1("UNEXPECTED ZONESTATE");
}
}
return FALSE;
}
BOOL ZoneControl::_CMD_ZONE_MOV_END(sZONE_MOVINFO_ARG* IN pARG)
{
sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO;
if(_IsZoneTransaction())
{
rINFO.ZONETYPE_CUR = rINFO.ZONETYPE_NEXT;
rINFO.FIELDCODE_CUR = rINFO.FIELDCODE_NEXT;
m_pGameZone->SetCurrentField(rINFO.FIELDCODE_CUR);
_GetZoneStateByMoved(rINFO.ZONESTATE_CUR);
if(ePRS_NOT_AT_ZONE != rINFO.ZONESTATE_CUR)
return TRUE;
DEBUGGING_CODE_L1("UNEXPECTED ZONESTATE");
}
return FALSE;
}
BOOL ZoneControl::_CMD_ZONE_CLEAR(sZONE_MOVINFO_ARG* pARG)
{
sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO;
rINFO.ZONETYPE_CUR = eZONETYPE_MAX;
rINFO.FIELDCODE_CUR = 0;
rINFO.ZONESTATE_CUR = ePRS_NOT_AT_ZONE;
rINFO.ZONETYPE_NEXT = eZONETYPE_MAX;
rINFO.FIELDCODE_NEXT = 0;
return TRUE;
}
void ZoneControl::_GetZoneStateByMoving(eZONE_STATE& rzsSTATE)
{
sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO;
eZONETYPE rZT = rINFO.ZONETYPE_NEXT;
switch(rZT)
{
case eZONETYPE_LOBBY: rzsSTATE = ePRS_BEFORE_ENTER_LOBBY; break;
case eZONETYPE_VILLAGE: rzsSTATE = ePRS_BEFORE_ENTER_VILLAGE; break;
case eZONETYPE_CHARSELECT: rzsSTATE = ePRS_BEFORE_ENTER_CHARSELECT; rINFO.FIELDCODE_NEXT = 11001; break;
case eZONETYPE_MISSION: rzsSTATE = ePRS_BEFORE_ENTER_MISSION; break;
case eZONETYPE_HUNTING: rzsSTATE = ePRS_BEFORE_ENTER_HUNTING; break;
//case eZONETYPE_QUEST: rzsSTATE =
case eZONETYPE_PVP: rzsSTATE = ePRS_BEFORE_ENTER_PVP; break;
//case eZONETYPE_EVENT: rzsSTATE =
//case eZONETYPE_GUILD: rzsSTATE =
//case eZONETYPE_SIEGE: rzsSTATE =
case eZONETYPE_FIELD: rzsSTATE = ePRS_BEFORE_ENTER_FIELD; break;
case eZONETYPE_CHUNTING: rzsSTATE = ePRS_BEFORE_ENTER_CHUNTING; break;
case eZONETYPE_TUTORIAL_FIELD: rzsSTATE = ePRS_BEFORE_ENTER_FIELD; break;
case eZONETYPE_INSTANCE: rzsSTATE = ePRS_BEFORE_ENTER_INSTNACE; break;
default: rzsSTATE = ePRS_BEFORE_ENTER_ZONE; break;
}
}
void ZoneControl::_GetZoneStateByMoved(eZONE_STATE& rzsSTATE)
{
sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO;
eZONE_STATE rSTATE = rINFO.ZONESTATE_CUR;
switch(rSTATE)
{
case ePRS_BEFORE_ENTER_LOBBY: rzsSTATE = ePRS_AT_LOBBY; break;
case ePRS_BEFORE_ENTER_VILLAGE: rzsSTATE = ePRS_AT_VILLAGE; break;
case ePRS_BEFORE_ENTER_CHARSELECT: rzsSTATE = ePRS_AT_CHARSELECT; break;
case ePRS_BEFORE_ENTER_MISSION: rzsSTATE = ePRS_AT_MISSION; break;
case ePRS_BEFORE_ENTER_HUNTING: rzsSTATE = ePRS_AT_HUNTING; break;
//cas rzsSTATE =
case ePRS_BEFORE_ENTER_PVP: rzsSTATE = ePRS_AT_PVP; break;
//cas rzsSTATE =
//cas rzsSTATE =
//cas rzsSTATE =
case ePRS_BEFORE_ENTER_FIELD: rzsSTATE = ePRS_AT_FIELD; break;
case ePRS_BEFORE_ENTER_CHUNTING: rzsSTATE = ePRS_AT_CHUNTING; break;
case ePRS_BEFORE_ENTER_INSTNACE: rzsSTATE = ePRS_AT_INSTANCE; break;
default: rzsSTATE = ePRS_NOT_AT_ZONE; break;
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
BOOL ZoneControl::MapPosCmd(eMAP_POS_CMD IN zCMD, sMAP_POS_ARG* IN OUT pARG)
{
if((DWORD)zCMD < eMAP_POS_CMD::CMD_POS_MAX)
return (this->*m_POS_HANDLERS[zCMD])(pARG);
return FALSE;
}
BOOL ZoneControl::_CMD_POS_ARG_CLEAR(sMAP_POS_ARG* IN pARG)
{
if(pARG)
{
ZeroMemory(pARG, sizeof(*pARG));
return TRUE;
}
return FALSE;
}
BOOL ZoneControl::_CMD_POS_GET_CUR_INFO(sMAP_POS_ARG* OUT pARG)
{
if(pARG)
{
CopyMemory(pARG, &m_MAP_POS_INFO, sizeof(*pARG));
return TRUE;
}
return FALSE;
}
BOOL ZoneControl::_CMD_POS_SET_CUR_INFO(sMAP_POS_ARG* IN pARG)
{
if((!m_bMapPosCmdBlock) && pARG)
{
CopyMemory(&m_MAP_POS_INFO, pARG, sizeof(*pARG));
return TRUE;
}
return FALSE;
}
BOOL ZoneControl::_CMD_POS_CALC_MOV_DIRECTION(sMAP_POS_ARG* IN pARG)
{
return FALSE;
}
BOOL ZoneControl::_CMD_POS_CALC_MOV_TARGET(sMAP_POS_ARG* IN pARG)
{
return FALSE;
}
BOOL ZoneControl::_CMD_POS_CLEAR(sMAP_POS_ARG* IN pARG)
{
return FALSE;
}