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

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

Аватар пользователя
Проблема со скриптом. Скрипт карты (весь):
SetRegionBlocked("Block1", true, 2);
SetRegionBlocked("Block2", true, 2);
SetObjectiveVisible("killall", nil);

function am()
while 1 do
local count = 0
for i=36,43 do
count = count + (HasArtefact("Muscip", i) or 0)
end;
if count < 8 then
SetObjectiveState("obj", OBJECTIVE_ACTIVE);
end;
sleep(5);
end;
end;

function killallactive()
SetObjectiveVisible("killall", true);
startThread (am);
end;

function winF()
Win();
end;

function obj()
local old = 0
while 1 do
local count = 0
for i=36,43 do
count = count + (HasArtefact("Muscip", i) or 0)
end
if count == 8 then
print("Player 1 has all artifacts")
SetObjectiveState("obj", OBJECTIVE_COMPLETED)
QuestionBox(GetMapDataPath().."complete-game.txt", "killallactive", "winF");
break
end
if count ~= old then
print("Player 1 has "..count.."/8 artifacts")
SetObjectiveProgress("obj", count)
old = count
end
sleep(5)
end
end

startThread (obj);

Для теста я снял с героя один из артефактов и передал его другому герою. Задача сбросилась в 0, а консоль высветил ошибку:

(Script) ERROR: Objective "obj" is active, so can only complete or fail it

Что это значит?
502 Bad Gateway
__________________________________
nginx/0.8.54
В ответ пользователю Warrior777
Аватар пользователя
Значит так. GetPlayerState возвращает
1 - игрок участвует
2 - игрок победил
3 - игрок проиграл
4 - его не было сначала.
В мануале полно косяков.
Использовать константы или нет - ваше дело.
Насчет непонятного выражения: всё на сайте разработчика языка lua.org, в том числе и приоритет операций. Я лишь использовал возможности, а десять лишних скобок погоды не сделают.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Аватар пользователя
2RedHeavenHero:
Использовать константы или нет - ваше дело.
Естественно. Вопрос был - почему числа магические, я дал развернутый ответ. Применять константы или нет - личное дело каждого. По сути, это лишь вопрос разборчивого/неразборчивого почерка.
Насчет непонятного выражения: всё на сайте разработчика языка lua.org, в том числе и приоритет операций. Я лишь использовал возможности, а десять лишних скобок погоды не сделают.
Никто приоритеты операций запоминать не будет, поскольку такие детали реализации различаются в разных языках программирования. И отсылать к справочникам, чтобы можно было расшифровать код, также не очень хорошо. Следовательно, для чтения человеком нужны скобки (это как знаки препинания в "казнить нельзя помиловать"), если они помогают понять порядок операций. Если скобки не расставляются, не удивляйся подобным вопросам.

Если ты понимаешь, что написано в том выражении, тогда объясни пожалуйста, что значит
GetPlayerState(...) == 1 or 0
? Это значит, число сравнивается и с 0, и с 1, и операция возвращает true (1) в случае, если оно равно одному из них? В таком случае, причём здесь статус PLAYER_NOT_IN_GAME = 0, который был использован в сравнении? Другими словами, зачем здесь ноль?
RedHeavenHero
Значит так. GetPlayerState возвращает
1 - игрок участвует
2 - игрок победил
3 - игрок проиграл
4 - его не было сначала.
В мануале полно косяков.
Зато в файле advmap-startup.lua, который подключается к игре, значится:
-- Player states
--
PLAYER_NOT_IN_GAME = 0
PLAYER_ACTIVE = 1
PLAYER_WON = 2
PLAYER_LOST = 3
И никаких 4. Стало быть, цифра 4 была получена вручную? И, всё-таки, что правильнее использовать, сравнение статуса с 1 (0?) или с 4? Или без разницы?
Разработчик Heroes 5.5 WarGame Edition.
Сайт проекта - пока неактивен
Автор Асимметричных шахмат
В ответ пользователю Nargott
Аватар пользователя
GetPlayerState(i) == 1 or 0
Если функция вернула единицу (игрок жив), то "==" вернет 1 и эта 1 будет прибавлена к n, иначе вернет nil. Но nil прибавлять нельзя и операция "или" заменяет его на 0.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
В ответ пользователю RedHeavenHero
Аватар пользователя
RedHeavenHero
GetPlayerState(i) == 1 or 0
Если функция вернула единицу (игрок жив), то "==" вернет 1 и эта 1 будет прибавлена к n, иначе вернет nil. Но nil прибавлять нельзя и операция "или" заменяет его на 0.
Понял, значит это издержки конструкции
n = n + (isCondition or 0)

Поэтому советую вместо нее использовать более адекватную с точки зрения читабельности (вместо попыток складывать числа с логикой):
if (isCondition) then
n = n + 1
end

И вопросов никаких вызывать не будет.
Разработчик Heroes 5.5 WarGame Edition.
Сайт проекта - пока неактивен
Автор Асимметричных шахмат
Аватар пользователя
ау люди помогите:smile41:
502 Bad Gateway
__________________________________
nginx/0.8.54
В ответ пользователю Warrior777
Аватар пользователя
Автопереведено
function am()
local old = 8
while 1 do
local count = 0
for i=36,43 do
count = count + (HasArtefact("Muscip", i) or 0)
end
if count ~= old then
if old == 8 then
SetObjectiveState("obj", OBJECTIVE_ACTIVE)
end
if count == 8 then
SetObjectiveState("obj", OBJECTIVE_COMPLETED)
else
SetObjectiveProgress('obj', count)
end
old = count
end
sleep(5)
end
end
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Аватар пользователя
RedHeavenHero, это точно правильный скрипт? Он должен делать SetObjectiveState("obj", OBJECTIVE_ACTIVE), только если количество необходимых артефактов упало ниже 8.
502 Bad Gateway
__________________________________
nginx/0.8.54
Аватар пользователя
Повторю текст ошибки:
(Script) ERROR: Objective "obj" is active, so can only complete or fail it
С аm, я думаю, это мало связано, особенно с тем местом, где ты изменил.
Первоначальный вариант от Нивала:
function am()
while 1 do
local heroes = GetPlayerHeroes(PLAYER_1);
local count = 0
h = "Maahir";
if HasArtefact(h, ARTIFACT_RING_OF_MAGI) then
count = count + 1;
end;
if HasArtefact(h, ARTIFACT_CROWN_OF_MAGI) then
count = count + 1;
end;
if HasArtefact(h, ARTIFACT_ROBE_OF_MAGI) then
count = count + 1;
end;
if HasArtefact(h, ARTIFACT_STAFF_OF_MAGI) then
count = count + 1;
end;
if count < 4 then
SetObjectiveState("obj1", OBJECTIVE_ACTIVE);
startThread (objective_1);
end;
sleep(3);
end;
end;
502 Bad Gateway
__________________________________
nginx/0.8.54
В ответ пользователю Warrior777
Аватар пользователя
Это связано именно с этим местом, и у разрабов на этом месте тоже выскакивает та же ошибка.;)
Объяснять надо?
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Аватар пользователя
Я всё понял.
В общем, не выйдет обновлять задачу при потере артов? :(
502 Bad Gateway
__________________________________
nginx/0.8.54
В ответ пользователю Warrior777
Аватар пользователя
Я ж написал уже скрипт с обновлением.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Аватар пользователя
А как насчёт этого?
function am()
local old = 0
while 1 do
local count = 0
for i=36,43 do
count = count + (HasArtefact("Muscip", i) or 0)
end;
if count ~= old then
if old < 8 then
SetObjectiveState("obj", OBJECTIVE_ACTIVE);
startThread(obj);
end;
old = count
end;
sleep(5);
end;
end;
502 Bad Gateway
__________________________________
nginx/0.8.54
В ответ пользователю Warrior777
Аватар пользователя
Warrior777
А как насчёт этого?
function am()
local old = 0
while 1 do
local count = 0
for i=36,43 do
count = count + (HasArtefact("Muscip", i) or 0)
end;
if count ~= old then
if old < 8 then
SetObjectiveState("obj", OBJECTIVE_ACTIVE);
startThread(obj);
end;
old = count
end;
sleep(5);
end;
end;
Цикл на цикле и циклом погоняет.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4

Статистика

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