If you want to help us maintaining this wiki, check out our discord server: https://discord.gg/3u69jMa 

*Dispatcher

From SWRC Wiki
Jump to navigation Jump to search
//=============================================================================
// Dispatcher: receives one trigger (corresponding to its name) as input, 
// then triggers a set of specifid events with optional delays.
//=============================================================================
class Dispatcher extends Actor
	placeable;

#exec Texture Import File=Textures\Dispatch.pcx Name=S_Dispatcher Mips=Off MASKED=1

enum EDispatcherBehavior
{	
	DBV_Pause,
	DBV_Reset,
	DBV_StartOver,
	DBV_Ignore,
	DBV_OnceOnly
};

struct DispatcherEvent
{
	var() name Event;
	var() float Delay;
	var() float	DelayMax;
	var() Actor SoundSource;
	var() Sound Sound;
	var() bool  bWaitForSound;
};

//-----------------------------------------------------------------------------
// Dispatcher variables.

var() bool					 bLoop;

var() EDispatcherBehavior	 TriggerBehavior;
var() array<DispatcherEvent> Events;	// Events to generate.
var int EventCounter;				// Internal counter.

//Editor function for determining whether an event matches this thing
function bool ContainsPartialEvent(string StartOfEventName)
{
	local string EventString;
	local int i;
	for (i = 0; i < Events.Length; ++i)
	{
		EventString = string(Events[i].Event);
		if ( Caps(StartOfEventName) == Left(Caps(EventString), Len(StartOfEventName) ) )
		{
			return true;
		}
	}
	return Super.ContainsPartialEvent(StartOfEventName);
}


//=============================================================================
// Dispatcher logic.

//
// When dispatcher is triggered...
//
function Trigger( actor Other, pawn EventInstigator )
{
	GotoState('Dispatch');
}

//
// Dispatch events.
//
state Dispatch
{
	function Trigger( actor Other, pawn EventInstigator )
	{
		switch ( TriggerBehavior )
		{
		case DBV_Pause:			
			GotoState('');
			break;
		case DBV_Reset:
            EventCounter = 0;
			GotoState('');
			break;
		case DBV_StartOver:
			EventCounter = 0;
			break;
		}		
	}

Begin:
	while( EventCounter < Events.Length )
	{
		Sleep( RandRange( Events[EventCounter].Delay, Events[EventCounter].Delay + Events[EventCounter].DelayMax ) );
		if( Events[EventCounter].Event != '' )
			TriggerEvent(Events[EventCounter].Event,self,Instigator);
		if( Events[EventCounter].Sound != None )
		{
			if (Events[EventCounter].SoundSource != None)
				Events[EventCounter].SoundSource.PlaySound( Events[EventCounter].Sound );
			else
				PlaySound( Events[EventCounter].Sound );
			if (Events[EventCounter].bWaitForSound)
				Sleep(GetSoundDuration(Events[EventCounter].Sound) + 0.1);
		}

		EventCounter++;
	}
	EventCounter=0;
	if( bLoop )		
		Goto('Begin');	
	else if( TriggerBehavior == DBV_OnceOnly )
		GotoState('Completed');
	else
		GotoState('');
}

state Completed
{
	ignores Trigger;	
}


defaultproperties
{
     bHidden=True
     Texture=Texture'Gameplay.S_Dispatcher'
}