red_squads = {["red1"] = 1, ["red2"] = 1, ["red3"] = 1, ["red4"] = 1, ["red5"] = 1, ["red6"] = 1, ["red7"] = 1, ["red8"] = 1, ["red9"] = 1, ["red10"] = 1,
["red11"] = 1, ["red12"] = 1, ["red13"] = 1, ["red14"] = 1, ["red15"] = 1};
rednumber = 0
function CheckRedStacks()
while 1 do
for stack, exists in red_squads do
if exists and (not IsObjectExists(stack)) then
red_squads[stack] = nil
rednumber = rednumber + 1
if GetObjectiveState('нужное_задание') == OBJECTIVE_ACTIVE then
SetObjectiveProgress('нужное_задание', rednumber)
end
end
end
sleep()
end
end
startThread(CheckRedStacks)
Сообщения от Скрипты
function CheckRedStacks() --конкретно у меня тут проверка существования
while 1 do
for i, stack in red_squads do
if IsObjectExists(stack) == nil then
rednumber = 0 + 1;
end;
end;
end;
end;
function Checking()
while 1 do
sleep(5);
if rednumber == 1 then
SetObjectiveProgress('sec1', 1);
elseif rednumber == 2 then
SetObjectiveProgress('sec1', 2);
--и т.д
end;
end;
end;
...
function CheckRedStacks()
while 1 do
for stack, exists in red_squads do
if exists and (not IsObjectExists(stack)) then
red_squads[stack] = nil
rednumber = rednumber + 1
if GetObjectiveState('нужное_задание') == OBJECTIVE_ACTIVE then
SetObjectiveProgress('нужное_задание', rednumber)
end
end
end
sleep()
end
end
...
А зачем добавлять конструкцию типа "while 1 do ... end" ?
Ничего против не имею, просто интересно :)
для создания бесконечного цикла проверки, очевидно
Какая цель этой бесконечной проверки?
постоянно проверять существование стеков и обновлять прогресс задания при их уничтожении. конечно, мой цикл нужно дополнить условием выхода при прогрессе равном 15, но это мелочь уже.
Просто у меня небольшое недоумение вызвала реализация, но в целом вполне рабочий вариант.
ну предложи свой вариант, будет интересно глянуть
Но в целом это не особо важно для скриптов к карте.
...
Набросал код в общих чертах (3 в одном). Не проверял.
-- Имена отрядов в редакторе карт
squadList = {
"squad01", "squad02", -- ... "squad99"
}
function connect()
Trigger( NEW_DAY_TRIGGER, "onDateUpdate" )
Trigger( COMBAT_RESULTS_TRIGGER, "onCombatFinish" )
for i, squad in squadList do
setSquadDisabled( squad )
Trigger( OBJECT_TOUCH_TRIGGER, squad, "onObjectTouch" )
end
end
function setSquadDisabled( squad )
SetObjectEnabled( squad, nil )
-- SetDisabledObjectMode( squad, DISABLED_INTERACT ) -- меняет курсор
-- SetMonsterSelectionType( squad, 0 ) -- убирает юбку
end
-- Если не критично ждать следующего дня (по сюжету или задумке)
function onDateUpdate()
-- ...
check()
end
-- Здесь есть возможность дополнительно узнать имя героя,
-- кол-во существ, результат битвы и т.д.
-- Суть способа - дополнительные расширенные возможности.
function onCombatFinish( index )
-- local heroWinner = GetSavedCombatArmyHero( index, 1 )
-- local heroLooser = GetSavedCombatArmyHero( index, 0 )
check()
end
-- Здесь дополнительно придется узнавать стеки и их кол-во у обьекта,
-- или полностью завязать на скрипт исключая установки редактора.
-- Суть способа - запускать контролируемую проверку после боя.
function onObjectToucch( hero, object )
StartCombat( hero, nil, ... , "check", ... ) -- ??? Куча разных параметров, мб ошибся
end
function check()
local count = getSquadCount()
if count == length( squadList ) then
-- Убиты все отряды -> действия ...
else
-- Очевидно, что в редакторе должны быть указаны все ProgreesFile's
-- в количестве равном кол-ву отрядов в списке squadList
SetObjectiveProgress( <имя задания в редакторе>, count )
end
end
function getSquadCount()
local count = 0
for i, squad in squadList do
if IsObjectExists( squad ) then
count = count + 1
end
end
return count
end
startThread( connect )
а если говорить глобально, то триггеры в некоторых ситуациях просто неприменимы, в отличие от подобных потоков
Для расширенного редактора нужна лицензионная версия?
Спасибо за предоставленные выше коды)
многовато лишних движений, имхо, для столь простых задач. ну да тут неважно, оба варианта рабочие, человек выберет, какой ему будет понятнее и удобнее.
а если говорить глобально, то триггеры в некоторых ситуациях просто неприменимы, в отличие от подобных потоков
Есть ли какая-нибудь документация по пользованию расширенным редактором карт? Очень много интересного можно с ним сделать, но как работать я не знаю. Знаю, как только включить его.
Для расширенного редактора нужна лицензионная версия?
...
Согласен. Если уж отходить от примера, то лучше поток вообще использовать только если другие варианты не подходят. Чем больше проверок (условий) тем лагучее карта.
Там вроде нет ничего такого особенного, чему стоит учиться. Различия точно не вспомню, но вроде из полезного позволяет открывать ресурсы игры, выбирать нужные окна (?), запаковывать изменения в архив карты, мб еще что-то. По линцензионной версии - скорее всего не имеет значения.
В этом и проблема. Я не знаю как добавить на карту объекты из расширенного редактора.
Или речь о моде?
Например, функция GetObjectFromLocation(x, y).
Или единственный способ — перебрать все существующие объекты на карте и проверить их по одному?