#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; }