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

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

Аватар пользователя
6 лет назад
я бы предложил вариант покороче даже:
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)
6 лет назад

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

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

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

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

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

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

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

Статистика

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

Сейчас на сайте 8 пользователей 1354 гостей