예제 #1
0
void CGameTaskManager::SetActiveTask(const TASK_ID& id, u16 idx)
{
	if(idx==0)
		Msg("! g_active_task_objective_idx==0");

	g_active_task_id			= id;
	g_active_task_objective_id	= idx;

	Level().MapManager().DisableAllPointers();
	SGameTaskObjective* o		= ActiveObjective();

	if(o)
	{
		CMapLocation* ml	= o->LinkedMapLocation();
		if(ml)
			ml->EnablePointer();
	}
}
예제 #2
0
void CGameTaskManager::UpdateTasks						()
{
	u32					task_count = GameTasks().size();
	if(0==task_count)	return;

	SGameTaskKey		*tasks = (SGameTaskKey*)_alloca(task_count*sizeof(SGameTaskKey));
	SGameTaskKey		*I = tasks;
	SGameTaskKey		*E = tasks + task_count;
	GameTasks_it		i = GameTasks().begin();
	
	for ( ; I != E; ++I, ++i)
		new	(I)	SGameTaskKey(*i);

	for (I = tasks; I != E; ++I)
	{
		CGameTask		*t = (*I).game_task;
		for(u16 i=0; i<t->m_Objectives.size() ;++i)
		{
			SGameTaskObjective& obj = t->Objective(i);
			if(obj.TaskState()!=eTaskStateInProgress && i==0) break;
			if(obj.TaskState()!=eTaskStateInProgress) continue;

			ETaskState state = obj.UpdateState();

			if( (state==eTaskStateFail || state==eTaskStateCompleted))
				SetTaskState(t, i, state);
		}
	}
	
	for ( ; I != E; ++I, ++i)
		I->~SGameTaskKey	();

	SGameTaskObjective* obj = ActiveObjective();
	if(obj)
	{
		Level().MapManager().DisableAllPointers();
		CMapLocation* ml = obj->LinkedMapLocation();
		if(ml && !ml->PointerEnabled())
			ml->EnablePointer();
	}

	if(	m_flags.test(eChanged) )
		UpdateActiveTask	();
}