Files
Sun1602/ProgramCommon/TriggerParser.cpp
T
2022-10-26 12:25:11 +08:00

1099 lines
30 KiB
C++

#include "StdAfx.h"
#include "TriggerParser.h"
#include <SolarFileReader.h>
TriggerParser::TriggerParser()
{
Init();
}
TriggerParser::~TriggerParser()
{
Release();
}
BOOL TriggerParser::Init()
{
m_TriggerListForMap.Initialize( _MAX_TRIGGERLIST_SIZE );
return TRUE;
}
void TriggerParser::Release()
{
sTRIGGER_CONTAINER * pTriggerContainer = NULL;
TRIGGER_TYPE * pTRIGGER_TYPE = NULL;
sTRIGGERLIST * pTriggerList = NULL;
m_TriggerListForMap.SetFirst();
while( pTriggerList = m_TriggerListForMap.GetNext() )
{
TriggerList_iterator it;
for( it = pTriggerList->m_TriggerListVector.begin() ; it != pTriggerList->m_TriggerListVector.end() ; ++it )
{
// 트리거 한개 꺼낸다
pTriggerContainer = *it;
TriggerType_iterator it_TriggerType;
// 컨디션 트리거 리스트 삭제
for( it_TriggerType = pTriggerContainer->m_ConditionTrigger.begin() ; it_TriggerType != pTriggerContainer->m_ConditionTrigger.end() ; ++it_TriggerType )
{
pTRIGGER_TYPE = *it_TriggerType;
SAFE_DELETE( pTRIGGER_TYPE );
}
pTriggerContainer->m_ConditionTrigger.clear();
// 액션 트리거 리스트 삭제
for( it_TriggerType = pTriggerContainer->m_ActionTrigger.begin() ; it_TriggerType != pTriggerContainer->m_ActionTrigger.end() ; ++it_TriggerType )
{
pTRIGGER_TYPE = *it_TriggerType;
SAFE_DELETE( pTRIGGER_TYPE );
}
pTriggerContainer->m_ActionTrigger.clear();
// 트리거 리스트 중, 한개 삭제
SAFE_DELETE( pTriggerContainer );
}
pTriggerList->m_TriggerListVector.clear();
SAFE_DELETE( pTriggerList );
}
m_TriggerListForMap.RemoveAll();
}
BOOL TriggerParser::Load( char * pTriggerFileName, sTRIGGERLIST * pTriggerList )
{
HANDLE hFile = ::CreateFile( pTriggerFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
if( INVALID_HANDLE_VALUE == hFile )
{
return FALSE;
}
//-----------------------------------------------------------------------------------
// 데이터 분석
//-----------------------------------------------------------------------------------
DWORD dwNumber = 0;
// 방씨!!!! 이 6 바이트는 뭐냐고~~~~~~~ ( 파일 헤더랍니다 )
const DWORD dwSIX_BYTE = 6;
// 건너뛸 파일 헤더
DWORD dwFileHeaderSize = dwSIX_BYTE + sizeof( WORD );
BYTE FileHeader[8];
BOOL rt = ::ReadFile( hFile, &FileHeader, dwFileHeaderSize, &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
// 건너뛸 청크 사이즈 읽기
DWORD dwDummyChunkSize;
rt = ::ReadFile( hFile, &dwDummyChunkSize, sizeof(DWORD), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
// 필요 없는 청크 건너 뛰기
dwDummyChunkSize = dwDummyChunkSize + 2 + 4; // 청크 헤더와 청크 사이즈 정보 건너 뛴다
BYTE *pDummyChunk = new BYTE[dwDummyChunkSize + 1];
rt = ::ReadFile( hFile, pDummyChunk, dwDummyChunkSize, &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
SAFE_DELETE_ARRAY( pDummyChunk );
//-----------------------------------------------------------------------------------
// 실제 데이터 시작
//-----------------------------------------------------------------------------------
DWORD dwPos = dwSIX_BYTE + dwDummyChunkSize + 6;
// 총 트리거 갯수
rt = ::ReadFile( hFile, &(pTriggerList->m_wNumberOfTriggerContainer), sizeof(WORD), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
// 총 트리거 갯수만큼 돌면서 트리거 읽기
for( WORD wCount = 0 ; wCount < pTriggerList->m_wNumberOfTriggerContainer ; ++wCount )
{
sTRIGGER_CONTAINER * pTriggerContainer = new sTRIGGER_CONTAINER;
// 트리거 리스트 속성
rt = ::ReadFile( hFile, &(pTriggerContainer->m_wTriggerListAtt), sizeof(WORD), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
// 컨디션 트리거 개수
rt = ::ReadFile( hFile, &(pTriggerContainer->m_wNumConTrigger), sizeof(WORD), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
WORD wType; // 트리거 타입 정보
DWORD dwSize; // 타입에 따른 트리거 데이터 구조체 크기
TRIGGER_TYPE *pTRIGGER_TYPE; // 트리거 리스트에 저장될 트리거 데이터
BYTE *pBuffer;
// 개수 만큼 돌면서 컨디션 트리거 읽기
for( WORD wNumConTrigger = 0 ; wNumConTrigger < pTriggerContainer->m_wNumConTrigger ; ++wNumConTrigger )
{
// 컨디션 트리거 타입 읽기
rt = ::ReadFile( hFile, &wType, sizeof(WORD), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
// 타입에 따라 데이터 읽기
pBuffer = SetTriggerType( wType, &dwSize, eTRIGGER_CONDITION );
rt = ::ReadFile( hFile, ( pBuffer + sizeof(WORD) ), ( dwSize - sizeof(WORD) ), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pBuffer;
// 읽은 컨디션 트리거 데이터 저장
pTriggerContainer->m_ConditionTrigger.push_back( pTRIGGER_TYPE );
}
// 액션 트리거 개수
rt = ::ReadFile( hFile, &(pTriggerContainer->m_wNumActTrigger), sizeof(WORD), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
// 개수 만큼 돌면서 액션 트리거 읽기
for( WORD wNumActTrigger = 0 ; wNumActTrigger < pTriggerContainer->m_wNumActTrigger ; ++wNumActTrigger )
{
// 액션 트리거 타입 읽기
rt = ::ReadFile( hFile, &wType, sizeof(WORD), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
// 타입에 따라 데이터 읽기
pBuffer = SetTriggerType( wType, &dwSize, eTRIGGER_ACTION );
rt = ::ReadFile( hFile, ( pBuffer + sizeof(WORD) ), ( dwSize - sizeof(WORD) ), &dwNumber, NULL );
if( !rt )
{
return FALSE;
}
dwPos += dwNumber;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pBuffer;
FASSERT( pTRIGGER_TYPE != NULL );
// 읽은 액션 트리거 데이터 저장
pTriggerContainer->m_ActionTrigger.push_back( pTRIGGER_TYPE );
}
// 트리거 리스트에 저장
pTriggerList->m_TriggerListVector.push_back( pTriggerContainer );
}
::CloseHandle( hFile );
return TRUE;
}
BOOL TriggerParser::Load( char * pszRootDir, char *pTriggerScriptFileName )
{
//-----------------------------------------------------------------------------------------------
// Trigger.txt파일 파싱
//-----------------------------------------------------------------------------------------------
char pszFullPath[MAX_PATH];
sprintf( pszFullPath, "%s%s", pszRootDir, pTriggerScriptFileName );
util::SolarFileReader sr;
if ( !sr.OpenFile( pszFullPath, SEPERATOR_WHITESPACE ) )
{
SUNLOG( eCRITICAL_LOG, "Script File Load Fail, 匡숭 = %s", pszFullPath );
SASSERT( NULL, "[에러]:트리거 스크립트 파일을 열 수 없습니다." );
return FALSE;
}
else
SUNLOG( eDEV_LOG, "Script File Load Start, 匡숭 = %s", pszFullPath );
sTRIGGERLIST * pTriggerList = NULL;
while( TRUE )
{
eTOKEN_TYPE ettType = sr.GetNextTokenType();
if ( TOKEN_END == ettType )
{
break;
}
if( ettType != TOKEN_NUMBER )
{
FASSERT( !"잘못된 Field 스크립트입니다." );
}
pTriggerList = new sTRIGGERLIST;
pTriggerList->m_TriggerCode = (CODETYPE)sr.GetTokenNumber();
char pszPath[MAX_PATH];
sr.GetNextTokenType( TOKEN_STRING );
sprintf( pszPath, "%s%s", pszRootDir, sr.GetTokenString() );
if( !Load( pszPath, pTriggerList ) )
{
SUNLOG( eCRITICAL_LOG, "[에러]:트리거 파일로 부터 트리거 정보를 읽을 수 없습니다." );
SASSERT( NULL, "[에러]:트리거 파일로 부터 트리거 정보를 읽을 수 없습니다." );
}
FASSERT( NULL == m_TriggerListForMap.GetData( pTriggerList->m_TriggerCode ) );
m_TriggerListForMap.Add( pTriggerList, pTriggerList->m_TriggerCode );
}
sr.CloseFile();
SUNLOG( eDEV_LOG, "Script File Load Complete, 匡숭 = %s", pszFullPath );
return TRUE;
}
BYTE *TriggerParser::SetTriggerType( WORD Type, DWORD *pdwSize, eTRIGGER_TYPE eCondition )
{
TRIGGER_TYPE *pTRIGGER_TYPE = NULL;
if( eCondition == eTRIGGER_CONDITION )
{
// 컨디션 트리거
switch( Type )
{
case eTRIGGER_ALWAYS_CONDITION: // 0
{
TRIGGER_ALWAYS_CONDITION *pTRIGGER_ALWAYS_CONDITION = new TRIGGER_ALWAYS_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_ALWAYS_CONDITION;
*pdwSize = sizeof( TRIGGER_ALWAYS_CONDITION );
}
break;
case eTRIGGER_COMPARE_SWITCH_CONDITION: // 1
{
TRIGGER_COMPARE_SWITCH_CONDITION *pTRIGGER_SWITCH_CONDITION = new TRIGGER_COMPARE_SWITCH_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_SWITCH_CONDITION;
*pdwSize = sizeof( TRIGGER_COMPARE_SWITCH_CONDITION );
}
break;
case eTRIGGER_CLICK_OBJECT_CONDITION: // 2
{
TRIGGER_CLICK_OBJECT_CONDITION *pTRIGGER_CLICK_OBJECT_CONDITION = new TRIGGER_CLICK_OBJECT_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_CLICK_OBJECT_CONDITION;
*pdwSize = sizeof( TRIGGER_CLICK_OBJECT_CONDITION );
}
break;
case eTRIGGER_DAMAGE_OBJECT_CONDITION: // 3
{
TRIGGER_DAMAGE_OBJECT_CONDITION *pTRIGGER_DAMAGE_OBJECT_CONDITION = new TRIGGER_DAMAGE_OBJECT_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_DAMAGE_OBJECT_CONDITION;
*pdwSize = sizeof( TRIGGER_DAMAGE_OBJECT_CONDITION );
}
break;
case eTRIGGER_COUNT_NPCKILL_CONDITION: // 4
{
TRIGGER_COUNT_NPCKILL_CONDITION *pTRIGGER_COUNT_NPCKILL_CONDITION = new TRIGGER_COUNT_NPCKILL_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_COUNT_NPCKILL_CONDITION;
*pdwSize = sizeof( TRIGGER_COUNT_NPCKILL_CONDITION );
}
break;
case eTRIGGER_PASS_TIME_CONDITION: // 5
{
TRIGGER_PASS_TIME_CONDITION *pTRIGGER_PASS_TIME_CONDITION = new TRIGGER_PASS_TIME_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_PASS_TIME_CONDITION;
*pdwSize = sizeof( TRIGGER_PASS_TIME_CONDITION );
}
break;
case eTRIGGER_ENTER_AREA_CONDITION: // 6
{
TRIGGER_ENTER_AREA_CONDITION *pTRIGGER_ENTER_AREA_CONDITION = new TRIGGER_ENTER_AREA_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_ENTER_AREA_CONDITION;
*pdwSize = sizeof( TRIGGER_ENTER_AREA_CONDITION );
}
break;
case eTRIGGER_OBTAIN_ITEM_CONDITION: // 7
{
TRIGGER_OBTAIN_ITEM_CONDITION *pTRIGGER_OBTAIN_ITEM_CONDITION = new TRIGGER_OBTAIN_ITEM_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_OBTAIN_ITEM_CONDITION;
*pdwSize = sizeof( TRIGGER_OBTAIN_ITEM_CONDITION );
}
break;
case eTRIGGER_MULTI_SWITCH_CONDITION: // 8
{
TRIGGER_MULTI_SWITCH_CONDITION *pTRIGGER_MULTI_SWITCH_CONDITION = new TRIGGER_MULTI_SWITCH_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_MULTI_SWITCH_CONDITION;
*pdwSize = sizeof( TRIGGER_MULTI_SWITCH_CONDITION );
}
break;
case eTRIGGER_MISSION_POINT_CONDITION: // 9
{
TRIGGER_MISSION_POINT_CONDITION *pTRIGGER_MISSION_POINT_CONDITION = new TRIGGER_MISSION_POINT_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_MISSION_POINT_CONDITION;
*pdwSize = sizeof( TRIGGER_MISSION_POINT_CONDITION );
}
break;
case eTRIGGER_VARIABLE_COMPARE_CONDITION: // 10
{
TRIGGER_VARIABLE_COMPARE_CONDITION *pTRIGGER = new TRIGGER_VARIABLE_COMPARE_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_VARIABLE_COMPARE_CONDITION );
}
break;
case eTRIGGER_TEST_QUEST_FLAG_CONDITION: // 11
{
TRIGGER_TEST_QUEST_FLAG_CONDITION *pTRIGGER = new TRIGGER_TEST_QUEST_FLAG_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_TEST_QUEST_FLAG_CONDITION );
}
break;
case eTRIGGER_USER_CONDITION: // 12
{
TRIGGER_USER_CONDITION *pTRIGGER = new TRIGGER_USER_CONDITION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_USER_CONDITION );
}
break;
case eTRIGGER_MONSTER_KILL: // 13
{
TRIGGER_MONSTER_KILL *pTRIGGER = new TRIGGER_MONSTER_KILL;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_MONSTER_KILL );
}
break;
// _NA_002098_20110307_ADD_NPC_CONTROL_TRIGGER
case eTRIGGER_NPC_ENTER_AREA_CONDITION: // 14
{
pTRIGGER_TYPE = new TRIGGER_NPC_ENTER_AREA_CONDITION;
*pdwSize = sizeof(TRIGGER_NPC_ENTER_AREA_CONDITION);
}
break;
//_NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER
case eTRIGGER_COMPLETE_COLLECTION_CONDITION: // 15
{
pTRIGGER_TYPE = new TRIGGER_COMPLETE_COLLECTION_CONDITION;
*pdwSize = sizeof(TRIGGER_COMPLETE_COLLECTION_CONDITION);
}
break;
default:
{
FASSERT(!"읽을수 없는 조건 트리거입니다.");
return NULL;
}
}
}
else if( eCondition == eTRIGGER_ACTION )
{
// 액션 트리거
switch( Type )
{
case eTRIGGER_CHANGE_SWITCH_ACTION: // 1000
{
TRIGGER_CHANGE_SWITCH_ACTION *pTRIGGER_CHANGE_SWITCH_ACTION = new TRIGGER_CHANGE_SWITCH_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_CHANGE_SWITCH_ACTION;
*pdwSize = sizeof( TRIGGER_CHANGE_SWITCH_ACTION );
}
break;
case eTRIGGER_CHANGE_OBJECTANI_ACTION: // 1001
{
TRIGGER_CHANGE_OBJECTANI_ACTION *pTRIGGER_CHANGE_OBJECTANI_ACTION = new TRIGGER_CHANGE_OBJECTANI_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_CHANGE_OBJECTANI_ACTION;
*pdwSize = sizeof( TRIGGER_CHANGE_OBJECTANI_ACTION );
}
break;
case eTRIGGER_CHANGE_PATHTILE_ACTION: // 1002
{
TRIGGER_CHANGE_PATHTILE_ACTION *pTRIGGER_CHANGE_PATHTILE_ACTION = new TRIGGER_CHANGE_PATHTILE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_CHANGE_PATHTILE_ACTION;
*pdwSize = sizeof( TRIGGER_CHANGE_PATHTILE_ACTION );
}
break;
case eTRIGGER_CHANGE_OBJECTSTATE_ACTION: // 1003
{
TRIGGER_CHANGE_OBJECTSTATE_ACTION *pTRIGGER_CHANGE_OBJECTSTATE_ACTION = new TRIGGER_CHANGE_OBJECTSTATE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_CHANGE_OBJECTSTATE_ACTION;
*pdwSize = sizeof( TRIGGER_CHANGE_OBJECTSTATE_ACTION );
}
break;
case eTRIGGER_PLAY_EVENT_ACTION: // 1004
{
TRIGGER_PLAY_EVENT_ACTION *pTRIGGER_PLAY_EVENT_ACTION = new TRIGGER_PLAY_EVENT_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_PLAY_EVENT_ACTION;
*pdwSize = sizeof( TRIGGER_PLAY_EVENT_ACTION );
}
break;
case eTRIGGER_SET_ISATTACK_ACTION: // 1005
{
TRIGGER_SET_ISATTACK_ACTION *pTRIGGER_SET_ISATTACK_ACTION = new TRIGGER_SET_ISATTACK_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_SET_ISATTACK_ACTION;
*pdwSize = sizeof( TRIGGER_SET_ISATTACK_ACTION );
}
break;
case eTRIGGER_PORTAL_PLAYER_ACTION: // 1006
{
TRIGGER_PORTAL_PLAYER_ACTION *pTRIGGER_PORTAL_PLAYER_ACTION = new TRIGGER_PORTAL_PLAYER_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_PORTAL_PLAYER_ACTION;
*pdwSize = sizeof( TRIGGER_PORTAL_PLAYER_ACTION );
}
break;
case eTRIGGER_SET_OBJECTTHRUST_ACTION: // 1007
{
TRIGGER_SET_OBJECTTHRUST_ACTION *pTRIGGER_SET_OBJECTTHRUST_ACTION = new TRIGGER_SET_OBJECTTHRUST_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_SET_OBJECTTHRUST_ACTION;
*pdwSize = sizeof( TRIGGER_SET_OBJECTTHRUST_ACTION );
}
break;
case eTRIGGER_APPLY_DAMAGE_ACTION: // 1008
{
TRIGGER_APPLY_DAMAGE_ACTION *pTRIGGER_APPLY_DAMAGE_ACTION = new TRIGGER_APPLY_DAMAGE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_APPLY_DAMAGE_ACTION;
*pdwSize = sizeof( TRIGGER_APPLY_DAMAGE_ACTION );
}
break;
case eTRIGGER_REFLECT_DAMAGE_ACTION: // 1009
{
TRIGGER_REFLECT_DAMAGE_ACTION *pTRIGGER_REFLECT_DAMAGE_ACTION = new TRIGGER_REFLECT_DAMAGE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_REFLECT_DAMAGE_ACTION;
*pdwSize = sizeof( TRIGGER_REFLECT_DAMAGE_ACTION );
}
break;
case eTRIGGER_CREATE_MONSTER_ACTION: // 1010
{
TRIGGER_CREATE_MONSTER_ACTION *pTRIGGER_CREATE_MONSTER_ACTION = new TRIGGER_CREATE_MONSTER_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_CREATE_MONSTER_ACTION;
*pdwSize = sizeof( TRIGGER_CREATE_MONSTER_ACTION );
}
break;
case eTRIGGER_DISPLAY_MSGBOX_ACTION: // 1011
{
TRIGGER_DISPLAY_MSGBOX_ACTION *pTRIGGER_DISPLAY_MSGBOX_ACTION = new TRIGGER_DISPLAY_MSGBOX_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_DISPLAY_MSGBOX_ACTION;
*pdwSize = sizeof( TRIGGER_DISPLAY_MSGBOX_ACTION );
}
break;
case eTRIGGER_REMOVE_ITEM_ACTION: // 1012
{
TRIGGER_REMOVE_ITEM_ACTION *pTRIGGER_REMOVE_ITEM_ACTION = new TRIGGER_REMOVE_ITEM_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_REMOVE_ITEM_ACTION;
*pdwSize = sizeof( TRIGGER_REMOVE_ITEM_ACTION );
}
break;
case eTRIGGER_PRESERVER_ACTION: // 1013
{
TRIGGER_PRESERVER_ACTION *pTRIGGER_PRESERVER_ACTION = new TRIGGER_PRESERVER_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_PRESERVER_ACTION;
*pdwSize = sizeof( TRIGGER_PRESERVER_ACTION );
}
break;
case eTRIGGER_REWARD_PLAYER_ACTION: // 1014
{
TRIGGER_REWARD_PLAYER_ACTION *pTRIGGER_REWARD_PLAYER_ACTION = new TRIGGER_REWARD_PLAYER_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_REWARD_PLAYER_ACTION;
*pdwSize = sizeof( TRIGGER_REWARD_PLAYER_ACTION );
}
break;
case eTRIGGER_CLEAR_MISSION_ACTION: // 1015
{
TRIGGER_CLEAR_MISSION_ACTION *pTRIGGER_CLEAR_MISSION_ACTION = new TRIGGER_CLEAR_MISSION_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_CLEAR_MISSION_ACTION;
*pdwSize = sizeof( TRIGGER_CLEAR_MISSION_ACTION );
}
break;
case eTRIGGER_PORTAL_RANDOM_ACTION: // 1016
{
TRIGGER_PORTAL_RANDOM_ACTION *pTRIGGER_PORTAL_RANDOM_ACTION = new TRIGGER_PORTAL_RANDOM_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_PORTAL_RANDOM_ACTION;
*pdwSize = sizeof( TRIGGER_PORTAL_RANDOM_ACTION );
}
break;
case eTRIGGER_ACTIVATE_TRIGGER_ACTION: // 1017
{
TRIGGER_ACTIVATE_TRIGGER_ACTION *pTRIGGER_ACTIVATE_TRIGGER_ACTION = new TRIGGER_ACTIVATE_TRIGGER_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_ACTIVATE_TRIGGER_ACTION;
*pdwSize = sizeof( TRIGGER_ACTIVATE_TRIGGER_ACTION );
}
break;
case eTRIGGER_AREA_DAMAGE_ACTION: // 1018
{
TRIGGER_AREA_DAMAGE_ACTION *pTRIGGER_AREA_DAMAGE_ACTION = new TRIGGER_AREA_DAMAGE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_AREA_DAMAGE_ACTION;
*pdwSize = sizeof( TRIGGER_AREA_DAMAGE_ACTION );
}
break;
case eTRIGGER_OPERATE_SWITCH_ACTION: // 1019
{
TRIGGER_OPERATE_SWITCH_ACTION *pTRIGGER_OPERATE_SWITCH_ACTION = new TRIGGER_OPERATE_SWITCH_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER_OPERATE_SWITCH_ACTION;
*pdwSize = sizeof( TRIGGER_OPERATE_SWITCH_ACTION );
}
break;
case eTRIGGER_OPERATE_VARIABLE_ACTION: // 1020
{
TRIGGER_OPERATE_VARIABLE_ACTION *pTRIGGER = new TRIGGER_OPERATE_VARIABLE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_OPERATE_VARIABLE_ACTION );
}
break;
case eTRIGGER_AREA_CHANGE_PATHTILE_ACTION: // = 1021, // 영역 타일 속성변경
{
TRIGGER_AREA_CHANGE_PATHTILE_ACTION *pTRIGGER = new TRIGGER_AREA_CHANGE_PATHTILE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_AREA_CHANGE_PATHTILE_ACTION );
}
break;
case eTRIGGER_CREATE_MONSTER_WITH_DIRECTION: // = 1022, // 몬스터 생성 (방향)
{
TRIGGER_CREATE_MONSTER_WITH_DIRECTION *pTRIGGER = new TRIGGER_CREATE_MONSTER_WITH_DIRECTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_CREATE_MONSTER_WITH_DIRECTION );
}
break;
case eTRIGGER_CHANGE_LIGHT: // = 1023, // 광원 설정 변경
{
TRIGGER_CHANGE_LIGHT *pTRIGGER = new TRIGGER_CHANGE_LIGHT;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_CHANGE_LIGHT );
}
break;
case eTRIGGER_CHANGE_OBJECT_TYPE: // = 1024, // 오브젝트 상태를 바꾼다.
{
TRIGGER_CHANGE_OBJECT_TYPE *pTRIGGER = new TRIGGER_CHANGE_OBJECT_TYPE;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_CHANGE_OBJECT_TYPE );
}
break;
case eTRIGGER_RANDOMMAP_MOVE: // = 1025
{
TRIGGER_RANDOMMAP_MOVE *pTRIGGER = new TRIGGER_RANDOMMAP_MOVE;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_RANDOMMAP_MOVE );
}
break;
case eTRIGGER_DROP_TREASURE: // = 1026
{
TRIGGER_DROP_TREASURE *pTRIGGER = new TRIGGER_DROP_TREASURE;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_DROP_TREASURE );
}
break;
case eTRIGGER_QUEST_CONDITION_COMPLETE_ACTION: // = 1027
{
TRIGGER_QUEST_CONDITION_COMPLETE_ACTION *pTRIGGER = new TRIGGER_QUEST_CONDITION_COMPLETE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_QUEST_CONDITION_COMPLETE_ACTION );
}
break;
case eTRIGGER_GIVE_QUEST_ACTION : // = 1028
{
TRIGGER_GIVE_QUEST_ACTION *pTRIGGER = new TRIGGER_GIVE_QUEST_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_GIVE_QUEST_ACTION );
}
break;
case eTRIGGER_SET_QUEST_COMPLETE_FLAG_ACTION : // = 1029
{
TRIGGER_SET_QUEST_COMPLETE_FLAG_ACTION *pTRIGGER = new TRIGGER_SET_QUEST_COMPLETE_FLAG_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_SET_QUEST_COMPLETE_FLAG_ACTION );
}
break;
case eTRIGGER_USER_ACTION : // = 1030
{
TRIGGER_USER_ACTION *pTRIGGER = new TRIGGER_USER_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_USER_ACTION );
}
break;
case eTRIGGER_USE_CATEGORY_ACTION : // = 1031
{
TRIGGER_USE_CATEGORY_ACTION *pTRIGGER = new TRIGGER_USE_CATEGORY_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_USE_CATEGORY_ACTION );
}
break;
case eTRIGGER_SET_CANNOT_MOVE_ACTION : // = 1032
{
TRIGGER_SET_CANNOT_MOVE_ACTION *pTRIGGER = new TRIGGER_SET_CANNOT_MOVE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_SET_CANNOT_MOVE_ACTION );
}
break;
case eTRIGGER_CREATE_MONSTER_GROUP_ACTION : // = 1033
{
TRIGGER_CREATE_MONSTER_GROUP_ACTION *pTRIGGER = new TRIGGER_CREATE_MONSTER_GROUP_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_CREATE_MONSTER_GROUP_ACTION );
}
break;
case eTRIGGER_NOTICE_MESSAGE_BOX_ACTION : // = 1034
{
TRIGGER_NOTICE_MESSAGE_BOX_ACTION *pTRIGGER = new TRIGGER_NOTICE_MESSAGE_BOX_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_NOTICE_MESSAGE_BOX_ACTION );
}
break;
case eTRIGGER_SHOW_MONSTERUNIT_ACTION: // = 1035
{
TRIGGER_SHOW_MONSTERUNIT_ACTION *pTRIGGER = new TRIGGER_SHOW_MONSTERUNIT_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_SHOW_MONSTERUNIT_ACTION );
}
break;
case eTRIGGER_SHOW_MESSAGE_BOX_ACTION: // = 1036
{
TRIGGER_SHOW_MESSAGE_BOX_ACTION *pTRIGGER = new TRIGGER_SHOW_MESSAGE_BOX_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_SHOW_MESSAGE_BOX_ACTION );
}
break;
case eTRIGGER_SKILL_GENERATE_ACTION: // = 1037
{
TRIGGER_SKILL_GENERATE_ACTION *pTRIGGER = new TRIGGER_SKILL_GENERATE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_SKILL_GENERATE_ACTION );
}
break;
case eTRIGGER_TERRITORY_MOVE_ACTION: // = 1038
{
TRIGGER_TERRITORY_MOVE_ACTION *pTRIGGER = new TRIGGER_TERRITORY_MOVE_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE *)pTRIGGER;
*pdwSize = sizeof( TRIGGER_TERRITORY_MOVE_ACTION );
}
break;
case eTRIGGER_MON_RANDOM_SPAWN_ACTION: // = 1039
{
TRIGGER_MON_RANDOM_SPAWN_ACTION* pTRIGGER = new TRIGGER_MON_RANDOM_SPAWN_ACTION;
pTRIGGER_TYPE = (TRIGGER_TYPE*)pTRIGGER;
*pdwSize = sizeof(TRIGGER_MON_RANDOM_SPAWN_ACTION);
}
break;
case eTRIGGER_SET_LAYER: // = 1040
{
TRIGGER_SET_LAYER* pTRIGGER = new TRIGGER_SET_LAYER;
pTRIGGER_TYPE = (TRIGGER_TYPE*)pTRIGGER;
*pdwSize = sizeof(TRIGGER_SET_LAYER);
}
break;
default:
{
FASSERT(!"읽을수 없는 액션 트리거입니다.");
return NULL;
}
}
}
else
{
return NULL;
}
return (BYTE *)pTRIGGER_TYPE;
}
MapTrigger *TriggerParser::Load(CWzArchive *pArchive)
{
St_ChunkInfo ChunkInfo;
if( pArchive->GetVersion() >= 145 )
{
BOOL bTriggerChunk = FALSE;
while( TRUE )
{
ChunkInfo = pArchive->ReadChunk();
if( ChunkInfo.m_nID == 0x1786 )
{
bTriggerChunk = TRUE;
break;
}
pArchive->SkipCurrentChunk(ChunkInfo);
}
FASSERT( TRUE == bTriggerChunk );
MapTrigger * pMapTrigger = new MapTrigger;
WORD wNumberOfTriggerGroup = 0;
pMapTrigger->Load(pArchive);
return pMapTrigger;
}
else
{
return NULL;
}
}
MapTrigger::MapTrigger()
{
m_wGroupNum = 0;;
m_TriggerGroupList.clear();
}
MapTrigger::~MapTrigger()
{
Destroy();
}
void MapTrigger::Destroy()
{
TriggerGroup_iterator iter = m_TriggerGroupList.begin();
while(iter != m_TriggerGroupList.end())
{
sTRIGGERGROUP *pGroup = *iter;
pGroup->Destroy();
delete pGroup;
iter++;
}
m_TriggerGroupList.clear();
m_wGroupNum = 0;
}
int MapTrigger::GetGroupNum()
{
return m_wGroupNum;
}
void MapTrigger::Load(CWzArchive *pArchive)
{
*pArchive >> m_wGroupNum;
// Last Index는 필요없으니 건너뛴다.
if (pArchive->GetVersion() >= 160)
{
int lastindex;
*pArchive >> lastindex;
}
m_TriggerGroupList.clear();
for( DWORD idx = 0 ; idx < m_wGroupNum ; ++idx )
{
sTRIGGERGROUP *pTriggerGroup = new sTRIGGERGROUP;
pTriggerGroup->Load(pArchive);
m_TriggerGroupList.push_back(pTriggerGroup);
}
}
sTRIGGERGROUP * MapTrigger::GetGroup(int iGroupIndex)
{
TriggerGroup_vector::iterator iter;
int index = 0;
iter = m_TriggerGroupList.begin();
while (iter != m_TriggerGroupList.end())
{
if (index == iGroupIndex)
{
return (*iter);
}
index++;
iter++;
}
// 모든 경로에서 값을 반환하지 않는다! taiyo
return NULL;
}
void sTRIGGERGROUP::Load(CWzArchive *pArchive)
{
m_TriggerCategoryList.clear();
// 그룹 이름 읽기.
BYTE bNameLength;
*pArchive >> bNameLength;
ZeroMemory(m_szName,MAX_TRIGGER_GROUPNAME_LENGTH);
pArchive->Read(m_szName,bNameLength);
// 카테고리 갯수읽기.
*pArchive >> m_wNumberOfTriggerCategory;
// Last Index는 필요없으니 건너뛴다.
if (pArchive->GetVersion() >= 160)
{
int lastindex;
*pArchive >> lastindex;
}
for( DWORD idx = 0 ; idx < m_wNumberOfTriggerCategory ; ++idx )
{
sTRIGGERCATEGORY *pTriggerCategory = new sTRIGGERCATEGORY;
pTriggerCategory->Load(pArchive);
m_TriggerCategoryList.push_back(pTriggerCategory);
}
}
void sTRIGGERGROUP::Destroy()
{
TriggerCategory_iterator iter = m_TriggerCategoryList.begin();
while(iter != m_TriggerCategoryList.end())
{
sTRIGGERCATEGORY * pCategory = *iter;
pCategory->Destroy();
delete pCategory;
iter++;
}
m_TriggerCategoryList.clear();
}
void sTRIGGERCATEGORY::Load(CWzArchive *pArchive)
{
m_TriggerListVector.clear();
// 카테고리 이름 읽기.
BYTE bNameLength;
*pArchive >> bNameLength;
ZeroMemory(m_szName,MAX_TRIGGER_CATEGORYNAME_LENGTH);
pArchive->Read(m_szName,bNameLength);
// 리스트 갯수읽기.
*pArchive >> m_wNumberOfTriggerList;
// Last Index는 필요없으니 건너뛴다.
if (pArchive->GetVersion() >= 160)
{
int lastindex;
*pArchive >> lastindex;
}
for( DWORD idx = 0 ; idx < m_wNumberOfTriggerList ; ++idx )
{
sTRIGGER_CONTAINER *pTriggerList = new sTRIGGER_CONTAINER;
pTriggerList->Load(pArchive);
m_TriggerListVector.push_back(pTriggerList);
}
}
void sTRIGGERCATEGORY::Destroy()
{
TriggerList_iterator iter = m_TriggerListVector.begin();
while(iter != m_TriggerListVector.end())
{
sTRIGGER_CONTAINER *pContainer = *iter;
pContainer->Destroy();
delete pContainer;
iter++;
}
m_TriggerListVector.clear();
}
void sTRIGGER_CONTAINER::Load(CWzArchive *pArchive)
{
m_ConditionTrigger.clear();
m_ActionTrigger.clear();
if (pArchive->GetVersion() >= 160)
{
int index;
*pArchive >> index;
}
// ID
*pArchive >> m_TriggerListID;
// 속성
*pArchive >> m_wTriggerListAtt;
// 컨디션 트리거 개수
*pArchive >> m_wNumConTrigger;
// Last Index는 필요없으니 건너뛴다.
if (pArchive->GetVersion() >= 160)
{
int lastindex;
*pArchive >> lastindex;
}
WORD wType; // 트리거 타입 정보
DWORD dwSize; // 타입에 따른 트리거 데이터 구조체 크기
TRIGGER_TYPE * pTRIGGER_TYPE; // 트리거 리스트에 저장될 트리거 데이터
BYTE * pBuffer;
int iIDIndex;
WORD wOldTrigger = 0;
// 개수 만큼 돌면서 컨디션 트리거 읽기
WORD wNumConTrigger = 0;
for( ; wNumConTrigger < m_wNumConTrigger ; ++wNumConTrigger )
{
// 컨디션 트리거 타입 읽기
*pArchive >> wType;
// 타입에 따라 데이터 읽기
if (pArchive->GetVersion() >= 160)
{
*pArchive >> iIDIndex;
}
else
{
iIDIndex = wNumConTrigger;
}
pBuffer = TriggerParser::SetTriggerType( wType, &dwSize, eTRIGGER_CONDITION );
pArchive->Read(pBuffer + sizeof(WORD) + sizeof(int) ,dwSize - sizeof(WORD) - sizeof(int));
pTRIGGER_TYPE = (TRIGGER_TYPE *)pBuffer;
pTRIGGER_TYPE->m_iIDIndex = iIDIndex;
// 읽은 컨디션 트리거 데이터 저장
m_ConditionTrigger.push_back( pTRIGGER_TYPE );
wOldTrigger = wType;
}
// 액션 트리거 개수
*pArchive >> m_wNumActTrigger;
// Last Index는 필요없으니 건너뛴다.
if (pArchive->GetVersion() >= 160)
{
int lastindex;
*pArchive >> lastindex;
}
// 개수 만큼 돌면서 액션 트리거 읽기
for( WORD wNumActTrigger = 0 ; wNumActTrigger < m_wNumActTrigger ; ++wNumActTrigger )
{
// 액션 트리거 타입 읽기
*pArchive >> wType;
if (pArchive->GetVersion() >= 160)
{
*pArchive >> iIDIndex;
}
else
{
iIDIndex = wNumConTrigger;
}
// 타입에 따라 데이터 읽기
pBuffer = TriggerParser::SetTriggerType( wType, &dwSize, eTRIGGER_ACTION );
pArchive->Read(pBuffer + sizeof(WORD) + sizeof(int), dwSize - sizeof(WORD) - sizeof(int));
pTRIGGER_TYPE = (TRIGGER_TYPE *)pBuffer;
// 읽은 컨디션 트리거 데이터 저장
m_ActionTrigger.push_back( pTRIGGER_TYPE );
#if defined(_DEBUG)
// 에러체크용 코드
if (wType == 1016)
{
TRIGGER_PORTAL_RANDOM_ACTION * pTRIGGER_PORTAL_RANDOM_ACTION = (TRIGGER_PORTAL_RANDOM_ACTION *)pTRIGGER_TYPE;
}
#endif
wOldTrigger = wType;
}
}
void sTRIGGER_CONTAINER::Destroy()
{
TriggerType_iterator iter = m_ConditionTrigger.begin();
while(iter != m_ConditionTrigger.end())
{
TRIGGER_TYPE *pTrigger = *iter;
delete pTrigger;
iter++;
}
m_ConditionTrigger.clear();
iter = m_ActionTrigger.begin();
while (iter != m_ActionTrigger.end())
{
TRIGGER_TYPE *pTrigger = *iter;
delete pTrigger;
iter++;
}
m_ActionTrigger.clear();
}