⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conversationtrigger.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : ConversationTrigger.cpp
//
// PURPOSE : ConversationTrigger - Implementation
//
// CREATED : 5/26/98
//
// ----------------------------------------------------------------------- //

#include "ConversationTrigger.h"
#include "cpp_server_de.h"
#include "SharedDefs.h"
#include "BloodServerShell.h"
#include "PlayerObj.h"
#include "ObjectUtilities.h"
#include "ConversationStrings.h"


BEGIN_CLASS(ConversationTrigger)
	ADD_STRINGPROP(WaveFile, "default.wav")
	ADD_STRINGPROP(WaveFile2, "")
	ADD_STRINGPROP(WaveFile3, "")
	ADD_STRINGPROP(WaveFile4, "")
	ADD_STRINGPROP(WaveFile5, "")
	ADD_STRINGPROP(WaveFile6, "")
	ADD_STRINGPROP(WaveFile7, "")
	ADD_STRINGPROP(WaveFile8, "")

	ADD_LONGINTPROP(CharacterType, 0)
	ADD_BOOLPROP(RepeatLastMessage, DFALSE)
	ADD_BOOLPROP(LoopToFirstMessage, DFALSE)

	ADD_STRINGPROP_FLAG(ActivationSound, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(SoundRadius, 200.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName1, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName1, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName2, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName2, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay2, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName3, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName3, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay3, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName4, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName4, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay4, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName5, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName5, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay5, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName6, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName6, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay6, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName7, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName7, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay7, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName8, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName8, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay8, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName9, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName9, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay9, 0.0f, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(TargetName10, "", PF_HIDDEN)
	ADD_STRINGPROP_FLAG(MessageName10, "", PF_HIDDEN)
	ADD_REALPROP_FLAG(MessageDelay10, 0.0f, PF_HIDDEN)
	ADD_BOOLPROP(TouchActivate, DFALSE)
	ADD_BOOLPROP(PlayerActivate, DTRUE)
	ADD_BOOLPROP(AIActivate, DFALSE)
	ADD_BOOLPROP(ObjectActivate, DFALSE)
	ADD_BOOLPROP(TriggerRelayActivate, DFALSE)
	ADD_BOOLPROP_FLAG(TypeActionMode, DFALSE, PF_GROUP6)
END_CLASS_DEFAULT(ConversationTrigger, Trigger, NULL, NULL)


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::ConversationTrigger()
//
//	PURPOSE:	Initialize object
//
// ----------------------------------------------------------------------- //

ConversationTrigger::ConversationTrigger() : Trigger()
{
	for (int i=0; i < CT_MAXMESSAGES; i++)
	{
		m_hstrSoundFile[i] = DNULL;
	}
	m_nCharacterType = 0;

	m_nNumMessages = 0;
	m_nCurrentMessage = 0;

	m_bRepeatLastMessage = DFALSE;
	m_bLoopMessages		 = DFALSE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::~ConversationTrigger()
//
//	PURPOSE:	Deallocate object
//
// ----------------------------------------------------------------------- //

ConversationTrigger::~ConversationTrigger()
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	for (int i=0; i < CT_MAXMESSAGES; i++)
	{
		if (m_hstrSoundFile[i])
			pServerDE->FreeString(m_hstrSoundFile[i]);
	}
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::EngineMessageFn
//
//	PURPOSE:	Handle engine messages
//
// ----------------------------------------------------------------------- //

DDWORD ConversationTrigger::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
	switch(messageID)
	{
		case MID_PRECREATE:
		{
			if (fData == PRECREATE_WORLDFILE || fData == PRECREATE_STRINGPROP)
			{
				ReadProp((ObjectCreateStruct*)pData);
			}
		}
		break;

		case MID_SAVEOBJECT:
		{
			Save((HMESSAGEWRITE)pData, (DDWORD)fData);
		}
		break;

		case MID_LOADOBJECT:
		{
			Load((HMESSAGEREAD)pData, (DDWORD)fData);
		}
		break;

		default : break;
	}


	return Trigger::EngineMessageFn(messageID, pData, fData);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::ReadProp
//
//	PURPOSE:	Set property value
//
// ----------------------------------------------------------------------- //

DBOOL ConversationTrigger::ReadProp(ObjectCreateStruct *pData)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !pData) return DFALSE;

	GenericProp genProp;

	for (int i=0; i < CT_MAXMESSAGES; i++)
	{
		char name[20];
		_mbscpy((unsigned char*)name, (const unsigned char*)"WaveFile");
		if (i > 0)
			_itoa(i+1, &name[_mbstrlen(name)], 10);

		if (pServerDE->GetPropGeneric(name, &genProp) == DE_OK)
		{
			if (genProp.m_String[0]) 
				m_hstrSoundFile[i] = pServerDE->CreateString(genProp.m_String);
			else
				break;
		}

		m_nNumMessages++;
	}

	if (pServerDE->GetPropGeneric("RepeatLastMessage", &genProp) == DE_OK)
	{
		m_bRepeatLastMessage = genProp.m_Bool;
	}

	if (pServerDE->GetPropGeneric("LoopToFirstMessage", &genProp) == DE_OK)
	{
		m_bLoopMessages = genProp.m_Bool;
	}

	if (pServerDE->GetPropGeneric("CharacterType", &genProp) == DE_OK)
	{
		m_nCharacterType = (char)genProp.m_Long;
	}

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::SendMessages
//
//	PURPOSE:	
//
// ----------------------------------------------------------------------- //

void ConversationTrigger::SendMessages()
{
/*	if (m_hLastSender && IsPlayer(m_hLastSender))
	{
		CServerDE* pServerDE = GetServerDE();
		if (!pServerDE) return;
	
		CPlayerObj* pPlayer = (CPlayerObj*)pServerDE->HandleToObject(m_hLastSender);
		if (!pPlayer) return;

		HCLIENT hClient = pPlayer->GetClient();

		HMESSAGEWRITE hMsg = pServerDE->StartMessage(hClient, SMSG_CONVERSATION);
		pServerDE->WriteToMessageHString(hMsg, m_hstrSoundFile[0]);
		pServerDE->WriteToMessageByte(hMsg, m_nCharacterType);
		pServerDE->EndMessage(hMsg);
	}
*/
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || m_nCurrentMessage >= m_nNumMessages ) return;

	char* pText = FilenameToText(m_hstrSoundFile[m_nCurrentMessage]);
	if (!pText) return;

	HSTRING hstrText = pServerDE->CreateString(pText);

	if (hstrText && m_hstrSoundFile[m_nCurrentMessage])
	{
		HMESSAGEWRITE hMsg = pServerDE->StartMessage(DNULL, SMSG_CONVERSATION);
		pServerDE->WriteToMessageHString(hMsg, m_hstrSoundFile[m_nCurrentMessage]);
		pServerDE->WriteToMessageHString(hMsg, hstrText);
		pServerDE->WriteToMessageByte(hMsg, m_nCharacterType);
		pServerDE->EndMessage(hMsg);

		m_nCurrentMessage++;
		if (m_nCurrentMessage == m_nNumMessages)
		{
			// Check repeat flags:  RepeatLastMessage causes the last sound to repeat
			// over and over. LoopMessages causes it to start over at the first.
			// Neither means that the trigger will no longer play a message.
			if (m_bRepeatLastMessage) 
				m_nCurrentMessage--;
			else if (m_bLoopMessages)
				m_nCurrentMessage = 0;
		}
	}

	if (hstrText)
	{
		pServerDE->FreeString(hstrText);
	}
}




// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::CacheFiles
//
//	PURPOSE:	Cache resources used by the object
//
// ----------------------------------------------------------------------- //

void ConversationTrigger::CacheFiles()
{
/* TODO: Don't cache anything, want to use PLAYSOUND_STREAMING.
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	char* pFile = DNULL;

	for (int i=0; i < CT_MAXMESSAGES; i++)
	{
		if (m_hstrSoundFile[i])
		{
			pFile = pServerDE->GetStringData(m_hstrSoundFile[i]);
			if (pFile)
			{
				 pServerDE->CacheFile(FT_SOUNDLOCAL, pFile);
			}
		}
	}
*/
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::Save
//
//	PURPOSE:	Save the object
//
// ----------------------------------------------------------------------- //

void ConversationTrigger::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !hWrite) return;

	for (int i=0; i < CT_MAXMESSAGES; i++)
	{
		pServerDE->WriteToMessageHString(hWrite, m_hstrSoundFile[i]);
	}
	pServerDE->WriteToMessageByte(hWrite, m_nCharacterType);
	pServerDE->WriteToMessageByte(hWrite, m_nNumMessages);
	pServerDE->WriteToMessageByte(hWrite, m_nCurrentMessage);

	pServerDE->WriteToMessageByte(hWrite, m_bRepeatLastMessage);
	pServerDE->WriteToMessageByte(hWrite, m_bLoopMessages);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ConversationTrigger::Load
//
//	PURPOSE:	Load the object
//
// ----------------------------------------------------------------------- //

void ConversationTrigger::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !hRead) return;

	for (int i=0; i < CT_MAXMESSAGES; i++)
	{
		m_hstrSoundFile[i]	= pServerDE->ReadFromMessageHString(hRead);
	}
	m_nCharacterType	= pServerDE->ReadFromMessageByte(hRead);
	m_nNumMessages		= pServerDE->ReadFromMessageByte(hRead);
	m_nCurrentMessage	= pServerDE->ReadFromMessageByte(hRead);

	m_bRepeatLastMessage = pServerDE->ReadFromMessageByte(hRead);
	m_bLoopMessages		 = pServerDE->ReadFromMessageByte(hRead);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -