Как вариант, в функции Barracks_build_ok можно написать:
function Barracks_build_ok()
MessageBox("/Maps/SingleMissions/Time of Troubles1/Barracks_building1.txt");
SetObjectiveState("zadanie1", OBJECTIVE_ACTIVE,1);
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "QuestSword", nil)
startThread( _Barracks_build_mob_monitor);
end
И сама функция _Barracks_build_mob_monitor:
function _Barracks_build_mob_monitor ()
while 1 do
sleep(2);
if not Exists("Neutral") then
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "QuestSword", "Barracks_build_2");
break
end;
end;
end;
Она в отдельном потоке проверяет, существует ли отряд 'Neutal' (Exists("Neutral")). Если в какой-то момент его победили, то триггер на регион меняется на "Barracks_build_2" - функция с диалогом №2.
Выполнение квеста зависит от того, какой у него тип (kind) стоит. Если OBJECTIVE_KIND_MANUAL, то его можно завершить строчкой:
SetObjectiveState('zadanie1', OBJECTIVE_COMPLETED);
Поставить его надо под условие if not Exists("Neutral") then до триггера.
Если не OBJECTIVE_KIND_MANUAL, а настроенный на уничтожение отряда, то должен сам засчитаться.
С разблокировкой зданий не сталкивался, но тут скорее всего поможет SetTownBuildingLimitLevel.