Скрипты - Страница 78 - Форум HeroesWorld-а

Быстрая навигация по основным разделам форума:
Турниры
КАРТЫ
Heroes 6
Heroes 5
Heroes 4
Heroes 3
Heroes 2
Heroes 1
Might&Magic

Герои Меча и Магии 5 - Картостроительство (Редактор карт) В этом разделе можно обсуждать все что касается редактора карт для Heroes of Might and Magic V. Так же здесь обсуждаем картостроительство.

Ответ
Страница 78 из 267
 
Опции темы
#1156
Старый 18.04.2013, 21:56
  #1156
^
Warrior777
 
Аватар для Warrior777
📖
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
По умолчанию
Re: Скрипты

Проблема со скриптом. Скрипт карты (весь):
	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
502 Bad Gateway

__________________________________

nginx/0.8.54
Warrior777 вне форума
Ответить с цитированием
#1157
Старый 18.04.2013, 22:56
  #1157
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
По умолчанию
Re: Скрипты

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

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#1158
Старый 18.04.2013, 23:34
  #1158
^
Nargott
 
Аватар для Nargott
📖
Регистрация: 09.05.2009
Адрес: Смоленск
Сообщения: 1584
Регистрация: 09.05.2009
Адрес: Смоленск
Сообщения: 1584
По умолчанию
Re: Скрипты

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.
Сайт проекта - пока неактивен
Автор Асимметричных шахмат
Разработчик Heroes 5.5 WarGame Edition.
Сайт проекта - пока неактивен
Автор Асимметричных шахмат
Nargott вне форума
Ответить с цитированием
#1159
Старый 19.04.2013, 07:44
  #1159
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
По умолчанию
Re: Скрипты

GetPlayerState(i) == 1 or 0
Если функция вернула единицу (игрок жив), то "==" вернет 1 и эта 1 будет прибавлена к n, иначе вернет nil. Но nil прибавлять нельзя и операция "или" заменяет его на 0.
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#1160
Старый 19.04.2013, 09:35
  #1160
^
Nargott
 
Аватар для Nargott
📖
Регистрация: 09.05.2009
Адрес: Смоленск
Сообщения: 1584
Регистрация: 09.05.2009
Адрес: Смоленск
Сообщения: 1584
По умолчанию
Re: Скрипты

RedHeavenHeroGetPlayerState(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.
Сайт проекта - пока неактивен
Автор Асимметричных шахмат
Разработчик Heroes 5.5 WarGame Edition.
Сайт проекта - пока неактивен
Автор Асимметричных шахмат
Nargott вне форума
Ответить с цитированием
#1161
Старый 19.04.2013, 10:08
  #1161
^
Warrior777
 
Аватар для Warrior777
📖
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
По умолчанию
Re: Скрипты

ау люди помогите
__________________
502 Bad Gateway

__________________________________

nginx/0.8.54
502 Bad Gateway

__________________________________

nginx/0.8.54
Warrior777 вне форума
Ответить с цитированием
#1162
Старый 19.04.2013, 14:40
  #1162
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
По умолчанию
Re: Скрипты

	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
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#1163
Старый 19.04.2013, 15:01
  #1163
^
Warrior777
 
Аватар для Warrior777
📖
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
По умолчанию
Re: Скрипты

RedHeavenHero, это точно правильный скрипт? Он должен делать SetObjectiveState("obj", OBJECTIVE_ACTIVE), только если количество необходимых артефактов упало ниже 8.
__________________
502 Bad Gateway

__________________________________

nginx/0.8.54
502 Bad Gateway

__________________________________

nginx/0.8.54
Warrior777 вне форума
Ответить с цитированием
#1164
Старый 19.04.2013, 15:05
  #1164
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
По умолчанию
Re: Скрипты

Да. Как работает?
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#1165
Старый 19.04.2013, 15:12
  #1165
^
Warrior777
 
Аватар для Warrior777
📖
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
По умолчанию
Re: Скрипты

Повторю текст ошибки:
(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
502 Bad Gateway

__________________________________

nginx/0.8.54
Warrior777 вне форума
Ответить с цитированием
#1166
Старый 19.04.2013, 15:19
  #1166
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
По умолчанию
Re: Скрипты

Это связано именно с этим местом, и у разрабов на этом месте тоже выскакивает та же ошибка.
Объяснять надо?
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#1167
Старый 19.04.2013, 15:25
  #1167
^
Warrior777
 
Аватар для Warrior777
📖
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
По умолчанию
Re: Скрипты

Я всё понял.
В общем, не выйдет обновлять задачу при потере артов?
__________________
502 Bad Gateway

__________________________________

nginx/0.8.54
502 Bad Gateway

__________________________________

nginx/0.8.54
Warrior777 вне форума
Ответить с цитированием
#1168
Старый 19.04.2013, 15:27
  #1168
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
По умолчанию
Re: Скрипты

Я ж написал уже скрипт с обновлением.
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#1169
Старый 19.04.2013, 15:30
  #1169
^
Warrior777
 
Аватар для Warrior777
📖
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
Регистрация: 15.09.2012
Адрес: Под кроватью
Сообщения: 602
По умолчанию
Re: Скрипты

А как насчёт этого?
	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
502 Bad Gateway

__________________________________

nginx/0.8.54
Warrior777 вне форума
Ответить с цитированием
#1170
Старый 19.04.2013, 15:31
  #1170
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2380
Выставка наград
По умолчанию
Re: Скрипты

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
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
Ответ
Страница 78 из 267


Опции темы



Часовой пояс GMT +4, время: 05:27.


vBulletin v3.5.0, Copyright ©2000-2026, Jelsoft Enterprises Ltd. (Русский)

Яндекс цитирование    Top.Mail.Ru