DragonNest/Client/EtWorldPainter/TEtTriggerElement.cpp

359 lines
11 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "TEtTriggerElement.h"
#include "ScriptControl.h"
#include "TEtWorld.h"
#include "TEtWorldGrid.h"
#include "TEtWorldSector.h"
#include "TEtWorldProp.h"
#include "SundriesFuncEx.h"
#include "TEtTriggerObject.h"
#include "TEtWorldEventArea.h"
#include "TEtTrigger.h"
CTEtTriggerElement::CTEtTriggerElement( CEtTriggerObject *pObject )
: CEtTriggerElement( pObject, NULL )
{
m_hItem = NULL;
}
CTEtTriggerElement::~CTEtTriggerElement()
{
FreeParam();
}
void CTEtTriggerElement::SetFileName( const char *szFileName )
{
FreeParam();
m_szScriptName = szFileName;
m_szCustomScript.clear();
AllocParam();
}
void CTEtTriggerElement::SetCustomScript( const char *szString )
{
FreeParam();
m_szScriptName.clear();
m_szCustomScript = szString;
}
std::string CTEtTriggerElement::MakeString()
{
std::string szStr;
if( m_ScriptType == CustomScript ) {
szStr = "Custom Script";
return szStr;
}
CScriptControl::DefineScriptStruct *pStruct = GetScriptStruct();
if( pStruct == NULL ) return szStr;
int nParamIndex = 0;
for( DWORD j=0; j<pStruct->VecStringList.size(); j++ ) {
if( pStruct->VecStringList[j].Type != -1 ) {
szStr += "[";
szStr += MakeString( nParamIndex );
szStr += "]";
nParamIndex++;
}
else {
szStr += pStruct->VecStringList[j].szStr;
}
}
return szStr;
}
std::string CTEtTriggerElement::MakeString( DWORD dwIndex )
{
if( dwIndex < 0 || dwIndex >= m_pVecParamList.size() ) return "";
CUnionValueProperty *pVariable = m_pVecParamList[dwIndex];
CScriptControl::DefineScriptStruct *pStruct = GetScriptStruct();
if( pStruct == NULL ) return "";
char szBuf[256] = { 0, };
switch( pStruct->GetParamStruct(dwIndex)->Type ) {
case CEtTrigger::Integer:
sprintf_s( szBuf, "%d", pVariable->GetVariableInt() );
break;
case CEtTrigger::Float:
sprintf_s( szBuf, "%.2f", pVariable->GetVariableFloat() );
break;
case CEtTrigger::String:
sprintf_s( szBuf, "%s", pVariable->GetVariableString() );
break;
case CEtTrigger::Operator:
switch( pVariable->GetVariableInt() ) {
case 0: sprintf_s( szBuf, "==" ); break;
case 1: sprintf_s( szBuf, "!=" ); break;
case 2: sprintf_s( szBuf, ">" ); break;
case 3: sprintf_s( szBuf, "<" ); break;
case 4: sprintf_s( szBuf, ">=" ); break;
case 5: sprintf_s( szBuf, "<=" ); break;
}
break;
case CEtTrigger::Position:
sprintf_s( szBuf, "%.2f; %.2f; %.2f", pVariable->GetVariableVector3Ptr()->x, pVariable->GetVariableVector3Ptr()->y, pVariable->GetVariableVector3Ptr()->z );
break;
case CEtTrigger::Prop:
{
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) break;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( pSector == NULL ) break;
CEtWorldProp *pProp = pSector->GetPropFromCreateUniqueID( pVariable->GetVariableInt() );
if( pProp ) sprintf_s( szBuf, "%s (%d)", pProp->GetPropName(), pVariable->GetVariableInt() );
else sprintf_s( szBuf, "Unknown (%d)", pVariable->GetVariableInt() );
}
break;
case CEtTrigger::EventArea:
{
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) break;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( pSector == NULL ) break;
CString szControlName, szAreaName;
CEtWorldEventArea *pArea = pSector->GetEventAreaFromCreateUniqueID( pVariable->GetVariableInt() );
if( pArea ) {
szAreaName = pArea->GetName();
szControlName = pSector->GetEventControlNameFromCreateUniqueID( pVariable->GetVariableInt() );
sprintf_s( szBuf, "%s - %s(%d)", szControlName, szAreaName, pVariable->GetVariableInt() );
}
else {
sprintf_s( szBuf, "Unknown (%d)", pVariable->GetVariableInt() );
}
}
break;
case CEtTrigger::Value:
{
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) break;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( pSector == NULL ) break;
CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger();
if( pTrigger == NULL ) break;
CEtTrigger::DefineValue *pValue = pTrigger->GetDefineValueFromUniqueID( pVariable->GetVariableInt() );
if( pValue ) {
sprintf_s( szBuf, "%s (%d)", pValue->szName.c_str(), pValue->nUniqueID );
}
else {
sprintf_s( szBuf, "NoName (%d)", pVariable->GetVariableInt() );
}
}
break;
}
return szBuf;
}
CScriptControl::DefineScriptStruct *CTEtTriggerElement::GetScriptStruct()
{
switch( m_Type ) {
case Condition: return CScriptControl::GetInstance().GetDefineConditionStructFromName( m_szScriptName.c_str() ); break;
case Action: return CScriptControl::GetInstance().GetDefineActionStructFromName( m_szScriptName.c_str() ); break;
case Event: return CScriptControl::GetInstance().GetDefineEventStructFromName( m_szScriptName.c_str() ); break;
}
return NULL;
}
void CTEtTriggerElement::AllocParam()
{
CScriptControl::DefineScriptStruct *pStruct = GetScriptStruct();
if( pStruct == NULL ) return;
DWORD dwCount = pStruct->GetParamCount();
for( DWORD i=0; i<dwCount; i++ ) {
CUnionValueProperty *pVariable = NULL;
CScriptControl::ScriptStringStruct *pParam = pStruct->GetParamStruct(i);
switch( pParam->Type ) {
case CEtTrigger::Integer: pVariable = new CUnionValueProperty( CUnionValueProperty::Integer ); break;
case CEtTrigger::Float: pVariable = new CUnionValueProperty( CUnionValueProperty::Float ); break;
case CEtTrigger::String: pVariable = new CUnionValueProperty( CUnionValueProperty::String ); break;
case CEtTrigger::Operator: pVariable = new CUnionValueProperty( CUnionValueProperty::Integer ); break;
case CEtTrigger::Position: pVariable = new CUnionValueProperty( CUnionValueProperty::Vector3 ); break;
case CEtTrigger::Prop: pVariable = new CUnionValueProperty( CUnionValueProperty::Integer ); break;
case CEtTrigger::EventArea: pVariable = new CUnionValueProperty( CUnionValueProperty::Integer ); break;
case CEtTrigger::Value: pVariable = new CUnionValueProperty( CUnionValueProperty::Integer ); break;
}
if( pVariable == NULL ) {
assert(0);
continue;
}
m_pVecParamList.push_back( pVariable );
m_bVecModifyFlag.push_back( false );
}
}
void CTEtTriggerElement::FreeParam()
{
SAFE_DELETE_PVEC( m_pVecParamList );
SAFE_DELETE_VEC( m_bVecModifyFlag );
}
CUnionValueProperty *CTEtTriggerElement::GetParamVariable( DWORD dwIndex )
{
if( dwIndex < 0 || dwIndex >= m_pVecParamList.size() ) return NULL;
return m_pVecParamList[dwIndex];
}
void CTEtTriggerElement::SetParamVariable( DWORD dwIndex, CUnionValueProperty *pVariable )
{
if( dwIndex < 0 || dwIndex >= m_pVecParamList.size() ) return;
m_bVecModifyFlag[dwIndex] = true;
*m_pVecParamList[dwIndex] = *pVariable;
}
CTEtTriggerElement & CTEtTriggerElement::operator = ( CTEtTriggerElement &e )
{
m_Type = e.m_Type;
m_ScriptType = e.m_ScriptType;
m_hItem = e.m_hItem;
m_OperatorType = e.m_OperatorType;
m_nOperatorIndex = e.m_nOperatorIndex;
memcpy( m_nOperatorValue, e.m_nOperatorValue, sizeof(m_nOperatorValue) );
if( e.m_ScriptType == ScriptFile ) SetFileName( e.GetFileName() );
else SetCustomScript( e.GetCustomScript() );
if( m_pVecParamList.empty() ) {
for( DWORD i=0; i<e.m_pVecParamList.size(); i++ ) {
CUnionValueProperty *pVariable = new CUnionValueProperty( e.m_pVecParamList[i]->GetType() );
*pVariable = *e.m_pVecParamList[i];
m_pVecParamList.push_back( pVariable );
m_bVecModifyFlag.push_back( e.m_bVecModifyFlag[i] );
}
}
else {
for( DWORD i=0; i<e.m_pVecParamList.size(); i++ ) {
*m_pVecParamList[i] = *e.m_pVecParamList[i];
m_bVecModifyFlag[i] = e.m_bVecModifyFlag[i];
}
}
return *this;
}
void CTEtTriggerElement::Save( FILE *fp )
{
fwrite( &m_Type, sizeof(int), 1, fp );
fwrite( &m_ScriptType, sizeof(int), 1, fp );
fwrite( &m_OperatorType, sizeof(int), 1, fp );
fwrite( &m_nOperatorIndex, sizeof(int), 1, fp );
fwrite( m_nOperatorValue, sizeof(m_nOperatorValue), 1, fp );
CString szStr;
switch( m_ScriptType ) {
case ScriptFile:
{
szStr = m_szScriptName.c_str();
WriteCString( &szStr, fp );
// Save Parameter;
CScriptControl::DefineScriptStruct *pStruct = GetScriptStruct();
DWORD dwCount = pStruct->GetParamCount();
fwrite( &dwCount, sizeof(DWORD), 1, fp );
for( DWORD i=0; i<pStruct->GetParamCount(); i++ ) {
CScriptControl::ScriptStringStruct *pSS = pStruct->GetParamStruct(i);
CUnionValueProperty *pVariable = m_pVecParamList[i];
fwrite( &pSS->Type, sizeof(int), 1, fp );
int nSize = 0;
void *pPtr = NULL;
switch( pSS->Type ) {
case CEtTrigger::Integer:
case CEtTrigger::Operator:
case CEtTrigger::Prop:
case CEtTrigger::EventArea:
case CEtTrigger::Value:
{
nSize = sizeof(int);
fwrite( &nSize, sizeof(int), 1, fp );
int nValue = pVariable->GetVariableInt();
fwrite( &nValue, nSize, 1, fp );
}
break;
case CEtTrigger::Float:
{
nSize = sizeof(float);
fwrite( &nSize, sizeof(int), 1, fp );
float fValue = pVariable->GetVariableFloat();
fwrite( &fValue, nSize, 1, fp );
}
break;
case CEtTrigger::String:
WriteCString( &CString( pVariable->GetVariableString() ), fp );
break;
case CEtTrigger::Position:
nSize = sizeof(EtVector3);
fwrite( &nSize, sizeof(int), 1, fp );
fwrite( pVariable->GetVariableVector3Ptr(), nSize, 1, fp );
break;
}
}
}
break;
case CustomScript:
szStr = m_szCustomScript.c_str();
WriteCString( &szStr, fp );
break;
}
}
bool CTEtTriggerElement::Load( CStream *pStream )
{
bool bResult = CEtTriggerElement::Load( pStream );
if( bResult == false ) return false;
FreeParam();
if( m_ScriptType == ScriptFile ) {
CScriptControl::DefineScriptStruct *pStruct = GetScriptStruct();
if( pStruct == NULL ) return false;
AllocParam();
if( pStruct->GetParamCount() != m_VecParamList.size() ) {
CString szStr;
szStr.Format( "%s : %s <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ʋ<><C6B2><EFBFBD>ϴ<EFBFBD>.\n File : %d, Current Script : %d", m_pTriggerObj->GetTriggerName(), m_szScriptName.c_str(), m_VecParamList.size(), pStruct->GetParamCount() );
MessageBox( CGlobalValue::GetInstance().m_pParentView->m_hWnd, szStr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_OK );
}
for( DWORD i=0; i<pStruct->GetParamCount(); i++ ) {
if( i < 0 || i >= m_VecParamList.size() ) continue;
CUnionValueProperty *pVariable = m_pVecParamList[i];
switch( pStruct->GetParamStruct(i)->Type ) {
case CEtTrigger::Integer:
case CEtTrigger::Prop:
case CEtTrigger::Operator:
case CEtTrigger::EventArea:
case CEtTrigger::Value:
pVariable->SetVariable( m_VecParamList[i].nValue );
break;
case CEtTrigger::Float:
pVariable->SetVariable( m_VecParamList[i].fValue );
break;
case CEtTrigger::String:
pVariable->SetVariable( m_VecParamList[i].szValue );
break;
case CEtTrigger::Position:
pVariable->SetVariable( *m_VecParamList[i].vValue );
break;
}
m_bVecModifyFlag[i] = true;
}
}
ReleaseParamList();
return true;
}