#include "stdafx.h"
#include "trigger.h"
#include "resource.h"
#include "mainfrm.h"
#include "mmsystem.h"
#include "gmud32.h"
#include "io.h"
#include "GMud32Vw.h"
#include "script.h"
IMPLEMENT_SERIAL(CTrigger,CSelectable,2|VERSIONABLE_SCHEMA);
bool match(LPCSTR *szOrigTest, LPCSTR szOrigPattern,CMapStringToString ¶ms);
CTrigger::CTrigger()
{
;
}
CTrigger::~CTrigger()
{
;
}
void CTrigger::Serialize(CArchive &ar)
{
WORD wSchema=2;
if(!ar.IsStoring())
wSchema == ar.GetObjectSchema();
if(wSchema>1)
CSelectable::Serialize(ar);
if(ar.IsStoring())
{
ar << m_sMudOutput;
ar << m_sFileName;
}
else
{
if(wSchema<2)
{
CString sTemp;
ar >> sTemp;
SetName(sTemp);
}
ar >> m_sMudOutput;
ar >> m_sFileName;
}
}
CSelectable *CTrigger::CreateCopy()
{
CTrigger *pTrig = new CTrigger;
pTrig->m_sMudOutput = m_sMudOutput;
pTrig->m_sFileName = m_sFileName;
pTrig->SetName(GetName());
return pTrig;
}
BOOL CTrigger::CheckActivation(LPCSTR str, CMudView *pView)
{
if(!GetName().GetLength()) // if the trigger string is set...
return FALSE;
while(str && *str && match(&str,GetName(),*pView->GetUserVariables()))
{
str+=GetName().GetLength();
CMudApp *pApp = (CMudApp*)AfxGetApp();
if(pApp->m_bTriggerSound && m_sFileName.GetLength() && _access(m_sFileName,0)==0)
sndPlaySound(m_sFileName,SND_ASYNC);
if(!m_sMudOutput.IsEmpty())
RunScript((LPCSTR)(m_sMudOutput),*pView,*pView->m_pWorld);
}
return FALSE; // no trigger string set
}
bool match(LPCSTR *szOrigTest, LPCSTR szOrigPattern,CMapStringToString ¶ms)
{
if(!*szOrigPattern)
return false;
LPCSTR szTest=*szOrigTest;
LPCSTR szPattern=szOrigPattern;
LPCSTR szNonMatch =szTest;
bool bMatching=false;
CMapStringToString aTempParams;
while(*szTest && *szPattern)
{
if(*szPattern == '%')
{
szPattern++;
CString sVarName;
while(*szPattern && !isspace(*szPattern))
{
sVarName+=*szPattern;
szPattern++;
}
CString sVarValue;
while(*szTest && !isspace(*szTest))
{
sVarValue+=*szTest;
szTest++;
}
aTempParams.SetAt(sVarName,sVarValue);
bMatching=true;
}
else if(*szTest == *szPattern)
{
bMatching=true;
szTest++;
szPattern++;
}
else
bMatching=false;
if(!bMatching)
{
szPattern=szOrigPattern;
szNonMatch++;
szTest=szNonMatch;
}
}
if(*szPattern)
bMatching=false;
if(bMatching)
{
*szOrigTest=szTest;
for(POSITION pos = aTempParams.GetStartPosition(); pos != NULL; )
{
CString sKey,sVal;
aTempParams.GetNextAssoc( pos, sKey, sVal);
params.SetAt(sKey,sVal);
}
}
return bMatching;
}