コード例 #1
0
ファイル: EventBrowser.cpp プロジェクト: AJ92/renderdoc
void EventBrowser::Find(bool forward)
{
  if(ui->findEvent->text().isEmpty())
    return;

  uint32_t curEID = m_Core->CurEvent();
  if(!ui->events->selectedItems().isEmpty())
    curEID = ui->events->selectedItems()[0]->data(COL_EID, Qt::UserRole).toUInt();

  int eid = FindEvent(ui->findEvent->text(), curEID, forward);
  if(eid >= 0)
  {
    SelectEvent((uint32_t)eid);
    ui->findEvent->setStyleSheet("");
  }
  else    // if(WrapSearch)
  {
    eid = FindEvent(ui->findEvent->text(), forward ? 0 : ~0U, forward);
    if(eid >= 0)
    {
      SelectEvent((uint32_t)eid);
      ui->findEvent->setStyleSheet("");
    }
    else
    {
      ui->findEvent->setStyleSheet("QLineEdit{background-color:#ff0000;}");
    }
  }
}
コード例 #2
0
ファイル: BattleDust.cpp プロジェクト: kitnet/project-o
bool CBattleDust::CheckForMerging(CBattleEvent* pEvent)
{
	FUNCTION_PROFILER(GetISystem(), PROFILE_GAME);

	if(!g_pGameCVars->g_battleDust_enable)
		return false;

	if(!pEvent)
		return false;

	if(!gEnv->bServer)
		return false;

	// check if area can merge with nearby areas
	for(std::list<EntityId>::iterator it = m_eventIdList.begin(); it != m_eventIdList.end(); ++it)
	{
		EntityId areaId = (*it);
		CBattleEvent *pBattleArea = FindEvent(areaId);
		if(!pBattleArea)
			continue;

		if(CheckIntersection(pEvent, pBattleArea->m_worldPos, pBattleArea->m_radius) && pBattleArea->m_radius > 0 && (pBattleArea != pEvent) && pBattleArea->GetEntity())
		{
			MergeAreas(pBattleArea, pEvent->m_worldPos, pEvent->m_radius);
			return true;
		}
	}

	return false;
}
コード例 #3
0
ファイル: EventBrowser.cpp プロジェクト: AJ92/renderdoc
int EventBrowser::FindEvent(QString filter, uint32_t after, bool forward)
{
  if(!m_Core->LogLoaded())
    return 0;

  return FindEvent(ui->events->topLevelItem(0), filter, after, forward);
}
コード例 #4
0
void CRecordPlayerDlg::WorkerMain()
{
	int	nEvents = m_Record.GetEventCount();
	if (!nEvents)	// if no events
		return;	// nothing to do
	UINT	nTrackPorts = m_TrackMap.GetSize();
	// convert start position from relative milliseconds to relative counts
	LONGLONG	StartPos = MillisToCount(m_StartPos);
	int	iFirst = FindEvent(StartPos);	// find event at or after start position
	iFirst = max(iFirst, 0);	// enforce event range
	LONGLONG	tStart = GetPerfCount();	// get start time in absolute counts
	m_StartCount = tStart;	// store start time
	tStart -= StartPos;	// deduct start position from start time
	for (int iEvent = iFirst; iEvent < nEvents; iEvent++) {	// for each event
		// convert event's relative time to target time in absolute counts
		LONGLONG	tTarget = m_EventTime[iEvent] + tStart;
		do {	// spin
			if (m_Worker.GetStopFlag())	// if stop requested
				return;
		} while (GetPerfCount() < tTarget);	// while current time less than target
		const CMidiRecord::EVENT&	ev = m_Record[iEvent];
		if (ev.Port < nTrackPorts) {	// if event port within track map range
			// use event's port and channel to look up track index
			int	iTrack = m_TrackMap[ev.Port].TrackIdx[MIDI_CHAN(ev.Msg)];
			if (m_TrackEnable[iTrack]) {	// if track enabled
				gEngine.OutputMidi(m_Track[iTrack].m_Inst, 
					MIDI_CMD(ev.Msg), MIDI_P1(ev.Msg), MIDI_P2(ev.Msg));
			}
		}
	}
}
コード例 #5
0
ファイル: EventBrowser.cpp プロジェクト: AJ92/renderdoc
int EventBrowser::FindEvent(QTreeWidgetItem *parent, QString filter, uint32_t after, bool forward)
{
  if(parent == NULL)
    return -1;

  for(int i = forward ? 0 : parent->childCount() - 1; i >= 0 && i < parent->childCount();
      i += forward ? 1 : -1)
  {
    auto n = parent->child(i);

    uint eid = n->data(COL_EID, Qt::UserRole).toUInt();

    bool matchesAfter = (forward && eid > after) || (!forward && eid < after);

    if(matchesAfter)
    {
      QString name = n->text(COL_NAME);
      if(name.contains(filter, Qt::CaseInsensitive))
        return (int)eid;
    }

    if(n->childCount() > 0)
    {
      int found = FindEvent(n, filter, after, forward);

      if(found > 0)
        return found;
    }
  }

  return -1;
}
コード例 #6
0
ファイル: BattleDust.cpp プロジェクト: kitnet/project-o
void CBattleDust::Update()
{
	FUNCTION_PROFILER(GetISystem(), PROFILE_GAME);

	if(!g_pGameCVars->g_battleDust_enable)
	{
		RemoveAllEvents();
		return;
	}

	if(!gEnv->bServer)
		return;

	if(g_pGameCVars->g_battleDust_debug != 0)
	{
		float col[] = {1,1,1,1};
		gEnv->pRenderer->Draw2dLabel(50, 40, 2.0f, col, false, "Num BD areas: %d (max %d)", (int32)m_eventIdList.size(), m_maxBattleEvents);
	}
	float ypos = 60.0f;

	// go through the list of areas, remove any which are too small
	m_maxBattleEvents = MAX(m_maxBattleEvents, m_eventIdList.size());
	std::list<EntityId>::iterator next;
	std::list<EntityId>::iterator it = m_eventIdList.begin();
	for(; it != m_eventIdList.end(); it = next)
	{
		next = it; ++next;
		EntityId areaId = (*it);
		CBattleEvent *pBattleArea = FindEvent(areaId);
		if(!pBattleArea)
			continue;

		if(pBattleArea->m_lifetime > 0.0f)
		{
			pBattleArea->m_lifeRemaining -= gEnv->pTimer->GetFrameTime();
			pBattleArea->m_radius = pBattleArea->m_peakRadius * (pBattleArea->m_lifeRemaining / pBattleArea->m_lifetime);
		}

		if(g_pGameCVars->g_battleDust_debug != 0)
		{
			float col[] = {1,1,1,1};
			gEnv->pRenderer->Draw2dLabel(50, ypos, 1.4f, col, false, "Area: (%.2f, %.2f, %.2f), Radius: %.2f/%.2f, Particles: %.0f, Lifetime: %.2f/%.2f", pBattleArea->m_worldPos.x, pBattleArea->m_worldPos.y, pBattleArea->m_worldPos.z, pBattleArea->m_radius, pBattleArea->m_peakRadius, pBattleArea->m_numParticles, pBattleArea->m_lifeRemaining, pBattleArea->m_lifetime);
			ypos += 10.0f;
		}

		if(pBattleArea->m_lifeRemaining < 0.0f)
		{
			// remove it (NB this will also call RemoveBattleArea(), which will remove it from the list)
			gEnv->pEntitySystem->RemoveEntity(areaId);
		}
		else
		{
			if(pBattleArea->GetEntity())
			{
				UpdateParticlesForArea(pBattleArea);
			}
		}
	}
}
コード例 #7
0
// ---------------------------------------------------------------------------
// Find CCsConversationEvent based on ConversationEntryId and delete it.
// ---------------------------------------------------------------------------
//
void CCsConversationCacheHelper::DeleteEvent(
                                             const CCsConversationEvent& aConvEvent)
{
    TInt index = FindEvent(aConvEvent);

    if (KErrNotFound != index)
    {
        CCsConversationEvent* conversationEvent =
                (*iConversationEventList)[index];
        iConversationEventList->Remove(index);
        delete conversationEvent;
    }
}
コード例 #8
0
ULONG STREAM::DisableEvent(PDDCMDCONTROL pControl)
{
   pTrace->vLog(DDCMD_DisableEvent,pControl->hEvent);
   PEVENT pevent = FindEvent(pControl->hEvent, &qhEvent);
   if (!pevent)
      return ERROR_INVALID_EVENT;

    // destroying an event may change things that get referenced in the ISR
    // so we really need to cli/sti around the call to DestroyElement
   _cli_();
   qhEvent.DestroyElement((PQUEUEELEMENT)pevent);
   if (qhEvent.Head() != qhEvent.Tail())
      SetNextEvent();
   _sti_();
   return NO_ERROR;
}
コード例 #9
0
ULONG STREAM::EnableEvent(PDDCMDCONTROL pControl)
{

   // see if the event already exists on the event queue
   // call FindEvent if we get back an address (event exists)
   // call the UpdateEvent member function and get the event info updated.
   // if Findevent returns NULL (no event on queue) then call the construct
   // a new event and put it on the tail of the event queue. then call
   // SetNextEvent to update the next event to time out....

   PEVENT pevent = FindEvent(pControl->hEvent, &qhEvent);
   if (pevent)
      pevent->UpdateEvent(this,pControl->hEvent,(PCONTROL_PARM)pControl->pParm);
   else {
      pevent= new EVENT(this,pControl->hEvent,(PCONTROL_PARM)pControl->pParm);
   }
   if (!pevent)
      return ERROR_TOO_MANY_EVENTS;

   SetNextEvent();
   return NO_ERROR;
}
コード例 #10
0
T_void CompileEvent(T_byte8 *p_event)
{
    T_sword16 value ;

    p_event[strlen(p_event)-1] = '\0' ;
    value = FindEvent(p_event) ;
    if (value == -1)  {
        printf("Error!  Event '%s' unknown on line %d",
            p_event,
            G_line) ;
        G_errors++ ;
    } else {
        if (G_eventPlaces[value] == 0xFFFF)  {
            G_eventPlaces[value] = G_place ;
        } else {
            printf("Error!  Event '%s' already defined (line %d)\n",
                p_event,
                G_line) ;
            G_errors++ ;
        }
    }
}
コード例 #11
0
ファイル: MainEventPool.cpp プロジェクト: KFlaga/FlagRTS
	Trigger* MainEventPool::CreateTrigger(XmlNode* trigNode)
	{
		const char* trigName = XmlUtility::XmlGetString(trigNode, "name");

		Trigger* trigger = xNew1(Trigger, trigName);

		XmlNode* evtNode = trigNode->first_node("Event");
		if(evtNode != 0) // Trigger may not have and event
		{
			trigger->SetEvent(FindEvent(evtNode));
		}

		XmlNode* actsNode = trigNode->first_node("Actions", 7);
		MultiAction* actions = xNew0(MultiAction);
		XmlNode* actNode = actsNode->first_node("Action", 6);
		while (actNode != 0)
		{
			actions->AddAction(CreateAction(actNode));
			actNode = actNode->next_sibling();
		}
		trigger->SetActions(actions);
		return trigger;
	}
コード例 #12
0
ファイル: stream.cpp プロジェクト: OS2World/DRV-MPU-401
ULONG STREAM::Control(PDDCMDCONTROL p)
{
   switch (p->ulCmd) {
      case DDCMD_START:
         Trace(TRACE_DDCMD_CNTRL_START, 0);
         if (!Start())
            return ERROR_START_STREAM;
         fPaused = FALSE;
         fActive = TRUE;
         break;
      case DDCMD_STOP:
         Trace(TRACE_DDCMD_CNTRL_STOP, 0);
         Stop();
         ReturnBuffers();
         fPaused = FALSE;
         fActive = FALSE;
         p->pParm = &ulCurrentTime;
         p->ulParmSize = sizeof(ULONG);
         break;
      case DDCMD_PAUSE:
         Trace(TRACE_DDCMD_CNTRL_PAUSE, fPaused);
         if (fPaused) return ERROR_INVALID_SEQUENCE;
         Pause();
         fPaused = TRUE;
         fActive = FALSE;
         p->pParm = &ulCurrentTime;
         p->ulParmSize = sizeof(ULONG);
         break;
      case DDCMD_RESUME:
         Trace(TRACE_DDCMD_CNTRL_RESUME, fPaused);
         if (!fPaused) return ERROR_INVALID_SEQUENCE;
         Resume();
         fPaused = FALSE;
         fActive = TRUE;
         break;
      case DDCMD_ENABLE_EVENT: {
         Trace(TRACE_DDCMD_CNTRL_EVENT_ON, p->hEvent);
         EVENT *pevent = FindEvent(p->hEvent);
         if (pevent)
            pevent = new (pevent) EVENT(this,p->hEvent,(PCONTROL_PARM) p->pParm);
         else
            pevent = new EVENT(this,p->hEvent,(PCONTROL_PARM) p->pParm);
         if (!pevent)
            return ERROR_TOO_MANY_EVENTS;
         break;
      }
      case DDCMD_DISABLE_EVENT: {
         Trace(TRACE_DDCMD_CNTRL_EVENT_OFF, p->hEvent);
         EVENT *pevent=FindEvent(p->hEvent);
         if (!pevent)
            return ERROR_INVALID_EVENT;
         delete pevent;
         break;
      }
      case DDCMD_PAUSE_TIME:
         Trace(TRACE_DDCMD_CNTRL_PAUSE_TIME, ulCurrentTime);
         fIncrementCounter = FALSE;
         break;
      case DDCMD_RESUME_TIME:
         Trace(TRACE_DDCMD_CNTRL_RESUME_TIME, ulCurrentTime);
         fIncrementCounter = TRUE;
         break;
   }
   return 0;
}
コード例 #13
0
ファイル: bot.cpp プロジェクト: aadarshasubedi/choria
// Update bot based on goals
void _Bot::EvaluateGoal() {

	// Respawn
	if(!Player->WaitForServer && !Player->IsAlive()) {
		_Buffer Packet;
		Packet.Write<PacketType>(PacketType::WORLD_RESPAWN);
		Network->SendPacket(Packet);

		Player->WaitForServer = true;
		return;
	}

	// Evaluate goal
	switch(GoalState) {
		case GoalStateType::NONE:
			DetermineNextGoal();
		break;
		case GoalStateType::FARMING:
			if(Map->NetworkID != 11) {
				if(Map->NetworkID != 10) {
					glm::ivec2 Position;
					if(FindEvent(_Event(_Map::EVENT_MAPCHANGE, 10), Position))
						MoveTo(Player->Position, Position);
				}
				else if(Map->NetworkID == 10) {
					glm::ivec2 Position;
					if(FindEvent(_Event(_Map::EVENT_MAPCHANGE, 11), Position))
						MoveTo(Player->Position, Position);
				}
			}
			else if(Map->NetworkID == 11) {
				glm::ivec2 Position;
				if(FindEvent(_Event(_Map::EVENT_SCRIPT, 3), Position))
					MoveTo(Player->Position, Position);
			}
			else {
				BotState = BotStateType::MOVE_RANDOM;
			}
		break;
		case GoalStateType::HEALING:
			if(Map->NetworkID != 1) {
				if(!Player->WaitForServer && Player->CanTeleport()) {
				   _Buffer Packet;
				   Packet.Write<PacketType>(PacketType::PLAYER_STATUS);
				   Packet.Write<uint8_t>(_Object::STATUS_TELEPORT);
				   Network->SendPacket(Packet);

				   Player->WaitForServer = true;
				}
			}
			else {
				if(Player->GetHealthPercent() < 1.0f) {
					glm::ivec2 Position;
					if(FindEvent(_Event(_Map::EVENT_SCRIPT, 1), Position)) {
						if(Player->Position == Position)
							BotState = BotStateType::MOVE_HEAL;
						else
							MoveTo(Player->Position, Position);
					}
				}
				else
					DetermineNextGoal();
			}
		break;
	}

}
コード例 #14
0
ファイル: BattleDust.cpp プロジェクト: kitnet/project-o
void CBattleDust::RecordEvent(EBattleDustEventType event, Vec3 worldPos, const IEntityClass* pClass)
{
	FUNCTION_PROFILER(GetISystem(), PROFILE_GAME);

	if(!g_pGameCVars->g_battleDust_enable)
		return;

	if(!gEnv->bServer)
		return;

	// this typically means the xml file failed to load. Turn off the dust.
	if(m_maxParticleCount == 0)
		return;

	SBattleEventParameter param;
	if(!GetEventParams(event, pClass, param))
		return;
	
	if(param.m_power == 0 || worldPos.IsEquivalent(Vec3(0,0,0)))
		return;

	if(m_pBattleEventClass == NULL)
		m_pBattleEventClass = gEnv->pEntitySystem->GetClassRegistry()->FindClass( "BattleEvent" );

	// first check if we need a new event
	bool newEvent = true;
	for(std::list<EntityId>::iterator it = m_eventIdList.begin(); it != m_eventIdList.end(); ++it)
	{
		EntityId areaId = (*it);
		CBattleEvent *pBattleArea = FindEvent(areaId);
		if(pBattleArea && CheckIntersection(pBattleArea, worldPos, param.m_power))
		{
			// don't need a new event as this one is within an existing one. Just merge them.
			MergeAreas(pBattleArea, worldPos, param.m_power);
			pBattleArea->m_lifeRemaining += param.m_lifetime;
			pBattleArea->m_lifetime = pBattleArea->m_lifeRemaining;
			pBattleArea->m_lifetime = CLAMP(pBattleArea->m_lifetime, 0.0f, m_maxLifetime);
			pBattleArea->m_lifeRemaining = CLAMP(pBattleArea->m_lifeRemaining, 0.0f, m_maxLifetime);
			newEvent = false;			
			break;
		}
	}
 
	if(newEvent)
	{
		IEntitySystem * pEntitySystem = gEnv->pEntitySystem;
 		SEntitySpawnParams esp;
 		esp.id = 0;
 		esp.nFlags = 0;
 		esp.pClass = m_pBattleEventClass;
 		if (!esp.pClass)
 			return;
 		esp.pUserData = NULL;
 		esp.sName = "BattleDust";
 		esp.vPosition	= worldPos;
	
		// when CBattleEvent is created it will add itself to the list
		IEntity * pEntity = pEntitySystem->SpawnEntity( esp );
		if(pEntity)
		{
			// find the just-added entity in the list, and set it's properties
			IGameObject* pGO = g_pGame->GetIGameFramework()->GetGameObject(pEntity->GetId());
			if(pGO)
			{
				CBattleEvent* pNewEvent = static_cast<CBattleEvent*>(pGO->QueryExtension("BattleEvent"));
				if(pNewEvent)
				{
					pNewEvent->m_radius = param.m_power;
					pNewEvent->m_peakRadius = param.m_power;
					pNewEvent->m_lifetime = param.m_lifetime;
					pNewEvent->m_lifeRemaining = param.m_lifetime;
					pNewEvent->m_worldPos = worldPos;

					pNewEvent->m_lifetime = CLAMP(pNewEvent->m_lifetime, 0.0f, m_maxLifetime);
					pNewEvent->m_lifeRemaining = CLAMP(pNewEvent->m_lifeRemaining, 0.0f, m_maxLifetime);

					pGO->ChangedNetworkState(CBattleEvent::PROPERTIES_ASPECT);
				}
			}
		}
	}
}
コード例 #15
0
ファイル: map.cpp プロジェクト: aadarshasubedi/choria
// Check for events
void _Map::CheckEvents(_Object *Object) {

	// Check for teleporting
	if(Server && Object->TeleportTime == 0.0) {
		Object->TeleportTime = -1.0;
		Object->Status = _Object::STATUS_NONE;
		Server->SpawnPlayer(Object, Object->SpawnMapID, _Map::EVENT_SPAWN);
		return;
	}

	// Handle events
	const _Tile *Tile = &Tiles[Object->Position.x][Object->Position.y];
	switch(Tile->Event.Type) {
		case _Map::EVENT_SPAWN:
			Object->SpawnMapID = NetworkID;
			Object->SpawnPoint = Tile->Event.Data;
		break;
		case _Map::EVENT_MAPENTRANCE:
		case _Map::EVENT_MAPCHANGE:
			if(Server)
				Server->SpawnPlayer(Object, (NetworkIDType)Tile->Event.Data, _Map::EVENT_MAPENTRANCE);
			else
				Object->WaitForServer = true;
		break;
		case _Map::EVENT_VENDOR: {
			if(Server) {
				Object->Vendor = Server->Stats->GetVendor(Tile->Event.Data);

				// Notify client
				_Buffer Packet;
				Packet.Write<PacketType>(PacketType::EVENT_START);
				Packet.Write<uint32_t>(Tile->Event.Type);
				Packet.Write<uint32_t>(Tile->Event.Data);
				Packet.Write<glm::ivec2>(Object->Position);
				Server->Network->SendPacket(Packet, Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		case _Map::EVENT_TRADER: {
			if(Server) {
				Object->Trader = Server->Stats->GetTrader(Tile->Event.Data);

				// Notify client
				_Buffer Packet;
				Packet.Write<PacketType>(PacketType::EVENT_START);
				Packet.Write<uint32_t>(Tile->Event.Type);
				Packet.Write<uint32_t>(Tile->Event.Data);
				Packet.Write<glm::ivec2>(Object->Position);
				Server->Network->SendPacket(Packet, Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		case _Map::EVENT_SCRIPT: {
			if(Server)
				Server->RunEventScript(Tile->Event.Data, Object);
		} break;
		case _Map::EVENT_PORTAL: {
			if(Server) {

				// Find matching even/odd event
				FindEvent(_Event(Tile->Event.Type, Tile->Event.Data ^ 1), Object->Position);
				Server->SendPlayerPosition(Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		case _Map::EVENT_JUMP: {
			if(Server) {

				// Find next jump
				FindEvent(_Event(Tile->Event.Type, Tile->Event.Data + 1), Object->Position);
				Server->SendPlayerPosition(Object->Peer);
			}
			else
				Object->WaitForServer = true;
		} break;
		default:
			if(Server) {
				Object->Vendor = nullptr;
				Object->Trader = nullptr;

				if(Object->NextBattle <= 0) {
					Server->QueueBattle(Object, Tile->Zone, false);
				}
			}
		break;
	}
}
コード例 #16
0
void EventController :: RunLoop ()
{
	
	bool Running = true;
	bool EventWait;
	void * Message;
	
	RunLoopThread = Thread :: GetCurrentThread ();
	RunningPointer = & Running;
	
	StateSync.Lock ();
	State = kControllerState_Running;
	StateSync.Unlock ();
	
	InsertionQueue.ReceiveMessage ( & Message );
	
	do
	{
		
		if ( Message == reinterpret_cast <void *> ( const_cast <int *> ( & AREF_KILL ) ) )
		{
			
			Running = false;
			EventWait = false;
			
			StateSync.Lock ();
			State = kControllerState_Dead;
			StateSync.Unlock ();
			
			StateChange.Signal ();
			
		}
		else if ( Message == reinterpret_cast <void *> ( const_cast <int *> ( & AREF_PAUSE ) ) )
		{
			
			StateSync.Lock ();
			State = kControllerState_Paused;
			StateSync.Unlock ();
			
			StateChange.Signal ();
			
			InsertionQueue.ReceiveMessage ( & Message );
			EventWait = false;
			
		}
		else if ( Message == reinterpret_cast <void *> ( const_cast <int *> ( & AREF_PAUSE_AND_DISCARD ) ) )
		{
			
			StateSync.Lock ();
			State = kControllerState_Paused;
			StateSync.Unlock ();
			
			StateChange.Signal ();
			
			ScheduleList.Clear ();
			
			InsertionQueue.ReceiveMessage ( & Message );
			EventWait = false;
			
		}
		else if ( Message == reinterpret_cast <void *> ( const_cast <int *> ( & AREF_RESUME ) ) )
		{
			
			StateSync.Lock ();
			State = kControllerState_Running;
			StateSync.Unlock ();
			
			StateChange.Signal ();
		
			if ( ScheduleList.Length () != 0 )
			{
				
				bool WaitReceive = false;
				
				while ( ! WaitReceive && ScheduleList.Length () != 0 )
				{
					
					ScheduleRecord Record = ScheduleList [ 0 ];
				
					uint64_t CurrentTime = Clock :: GetTimeMonotonicMS ();
					
					if ( Record.TimeMS <= CurrentTime )
					{
						
						NextEvent = FindEvent ( Record.Type );
						
						if ( NextEvent != NULL )
						{
							
							NextEvent -> Trigger ();
							NextEvent = NULL;
							
						}
						
						if ( ScheduleList [ 0 ].DeallocTypeString )
							free ( ScheduleList [ 0 ].Type );
						
						ScheduleList.Shift ();
						
					}
					else
					{
					
						NextEventMS = Record.TimeMS;
						NextEvent = FindEvent ( Record.Type );
						
						if ( NextEvent != NULL )
							WaitReceive = true;
						
					}
					
				}
				
				if ( NextEvent != NULL )
					EventWait = true;
				else
				{
					
					InsertionQueue.ReceiveMessage ( & Message );
					
					EventWait = false;
					
				}
				
			}
			else
			{
				
				InsertionQueue.ReceiveMessage ( & Message );
				
				EventWait = false;
				
			}
			
		}
		else
		{
			

			//ScheduleRecord TempRecord;


		}
		if ( EventWait )
		{
			
			uint64_t CurrentTime = Clock :: GetTimeMonotonicMS ();
			uint64_t Delta = NextEventMS - CurrentTime;
			
			if ( NextEventMS > CurrentTime )
			{
				
				while ( ! InsertionQueue.TryReceiveMessage ( & Message, static_cast <double> ( Delta ) / 1000 ) )
				{
					
					if ( ScheduleList [ 0 ].DeallocTypeString )
						free ( ScheduleList [ 0 ].Type );

					ScheduleList.Shift ();

					NextEvent -> Trigger ();
					NextEvent = NULL;
					
					if ( ScheduleList.Length () != 0 )
					{

						NextEvent = FindEvent ( ScheduleList [ 0 ].Type );
						NextEventMS = ScheduleList [ 0 ].TimeMS;

						CurrentTime = Clock :: GetTimeMonotonicMS ();
						Delta = NextEventMS - CurrentTime;

					}
					else
						break;
					
				}
				
			}
			
		}
		
	}
	while ( Running );
	
	while ( ScheduleList.Length () != 0 )
	{
		
		ScheduleRecord Record = ScheduleList.Shift ();
		
		if ( Record.DeallocTypeString )
			free ( Record.Type );
		
	}
	
};