Перейти к содержанию

Сообщения от Скрипты

Аватар пользователя
я бы предложил вариант покороче даже:
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" ?
Ничего против не имею, просто интересно :)
Аватар пользователя
для создания бесконечного цикла проверки, очевидно
Нет войне.
В ответ пользователю Gerter
Gerter
для создания бесконечного цикла проверки, очевидно
Ок, задам по другому.
Какая цель этой бесконечной проверки?
Аватар пользователя
постоянно проверять существование стеков и обновлять прогресс задания при их уничтожении. конечно, мой цикл нужно дополнить условием выхода при прогрессе равном 15, но это мелочь уже.
Нет войне.
В ответ пользователю Gerter
Gerter
постоянно проверять существование стеков и обновлять прогресс задания при их уничтожении. конечно, мой цикл нужно дополнить условием выхода при прогрессе равном 15, но это мелочь уже.
Понятно.
Просто у меня небольшое недоумение вызвала реализация, но в целом вполне рабочий вариант.
Аватар пользователя
ну предложи свой вариант, будет интересно глянуть
Нет войне.
В ответ пользователю Gerter
Gerter
ну предложи свой вариант, будет интересно глянуть
Оптимальнее не использовать дополнительные бесконечные циклы. Как вариант, завязать проверку на COMBAT_RESULT, OBJECT_TOUCH или NEW_DAY.
Но в целом это не особо важно для скриптов к карте.
...
Набросал код в общих чертах (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 )
Кстати тоже любопытные скрипты, спасибо. Можно много где применить. Правда для задания ожидать нового дня, когда тебе надо обновить задание в реальном времени, может быть критично
Аватар пользователя
многовато лишних движений, имхо, для столь простых задач. ну да тут неважно, оба варианта рабочие, человек выберет, какой ему будет понятнее и удобнее.

а если говорить глобально, то триггеры в некоторых ситуациях просто неприменимы, в отличие от подобных потоков
Нет войне.
Аватар пользователя
Есть ли какая-нибудь документация по пользованию расширенным редактором карт? Очень много интересного можно с ним сделать, но как работать я не знаю. Знаю, как только включить его.

Для расширенного редактора нужна лицензионная версия?

Спасибо за предоставленные выше коды)
В ответ пользователю Gerter
Gerter
многовато лишних движений, имхо, для столь простых задач. ну да тут неважно, оба варианта рабочие, человек выберет, какой ему будет понятнее и удобнее.
а если говорить глобально, то триггеры в некоторых ситуациях просто неприменимы, в отличие от подобных потоков
Согласен. Если уж отходить от примера, то лучше поток вообще использовать только если другие варианты не подходят. Чем больше проверок (условий) тем лагучее карта.
User01322342
Есть ли какая-нибудь документация по пользованию расширенным редактором карт? Очень много интересного можно с ним сделать, но как работать я не знаю. Знаю, как только включить его.
Для расширенного редактора нужна лицензионная версия?
...
Там вроде нет ничего такого особенного, чему стоит учиться. Различия точно не вспомню, но вроде из полезного позволяет открывать ресурсы игры, выбирать нужные окна (?), запаковывать изменения в архив карты, мб еще что-то. По линцензионной версии - скорее всего не имеет значения.
В ответ пользователю JonnyP
Аватар пользователя
JonnyP
Согласен. Если уж отходить от примера, то лучше поток вообще использовать только если другие варианты не подходят. Чем больше проверок (условий) тем лагучее карта.

Там вроде нет ничего такого особенного, чему стоит учиться. Различия точно не вспомню, но вроде из полезного позволяет открывать ресурсы игры, выбирать нужные окна (?), запаковывать изменения в архив карты, мб еще что-то. По линцензионной версии - скорее всего не имеет значения.
В этом и проблема. Я не знаю как добавить на карту объекты из расширенного редактора.
В ответ пользователю John_Lock
User01322342
В этом и проблема. Я не знаю как добавить на карту объекты из расширенного редактора.
О каком "расширенном редакторе" идет речь? Он не дает возможности добавлять обьекты.
Или речь о моде?
Автопереведено
Есть ли способ узнать, какой объект находится в заданных координатах?

Например, функция GetObjectFromLocation(x, y).

Или единственный способ — перебрать все существующие объекты на карте и проверить их по одному?

Статистика

Приветствуем новейшего участника: Emil