Скрипты для начинающих - Страница 7 - Форум HeroesWorld-а

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

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

Ответ
Страница 7 из 28
 
Опции темы
#91
Старый 21.04.2016, 23:02
  #91
^
LordRaia
 
Аватар для LordRaia
📖
Регистрация: 10.11.2012
Сообщения: 21
Регистрация: 10.11.2012
Сообщения: 21
По умолчанию
Re: Скрипты для начинающих

MentЯ тогда не понимаю, как это у Вас работает... Вы точно за второго игрока-то играете? ) Если за первого, у Вас с квестами ничего не произойдёт, у Вас же в скрипте прописано, что меняется состояние только для второго игрока.

Это был такой некрасивый костыль, чтобы игрок был синего цвета. Поэтому игру я начинал за второго Но с цветом я уже разобрался - глянул ваш faq

Jack_of_shadowsВ функции proph_event вроде бы не хватает end для if/else
Можно попробовать. После python как-то сложно свыкнуться с мыслью, что везде нужны end-ы

Upd: Спасибо Jack_of_shadows, end-а там действительно не хватало. Но теперь встает другая проблема: квест не хочет завершаться.

	path = GetMapDataPath()
function activate(obj)
     SetObjectiveState(obj,OBJECTIVE_ACTIVE,PLAYER_1)
end

function complete(obj)
     SetObjectiveState(obj,OBJECTIVE_COMPLETED,PLAYER_1)
     MessageBox(path.."text1.txt")
end

function proph_event(hero)
     if GetObjectiveState("Conquer") == OBJECTIVE_UNKNOWN then
        activate("Conquer")
     else
         if (GetObjectiveState("Conquer") == OBJECTIVE_ACTIVE and HasArtefact(hero, ARTIFACT_ENDLESS_BAG_OF_GOLD))  then
            complete("Conquer")
            Trigger(OBJECT_TOUCH_TRIGGER, "Prophet", nil)
         end
     end
end

SetObjectEnabled("Prophet", nil)
Trigger(OBJECT_TOUCH_TRIGGER, "Prophet", "proph_event")

Я пытался закомментить кусок про проверку наличия артефакта у героя, все сработало нормально

Видимо, какая-то проблема в
	and HasArtefact(hero, ARTIFACT_ENDLESS_BAG_OF_GOLD))
Какие есть идеи?
__________________
Злой пещерный демон
Злой пещерный демон
LordRaia вне форума
Ответить с цитированием
#92
Старый 07.08.2016, 21:47
  #92
^
Emris
📖
Регистрация: 07.08.2016
Сообщения: 1
Регистрация: 07.08.2016
Сообщения: 1
По умолчанию
Re: Скрипты для начинающих

Ребят здравствуйте я начинающий в этом деле,хотелось бы узнать вот какую вещь: Хочу увеличить кол - во существ в постройке. Как можно это сделать ?
Emris вне форума
Ответить с цитированием
#93
Старый 09.08.2016, 01:34
  #93
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
По умолчанию
Re: Скрипты для начинающих

EmrisРебят здравствуйте я начинающий в этом деле,хотелось бы узнать вот какую вещь: Хочу увеличить кол - во существ в постройке. Как можно это сделать ?
Если речь идет про жилища на карте - то, увы, можно только обновить прирост, то есть, в случае, если его выкупили, добавить обычное количество существ. Для города есть функции SetObjectDwellingCreatures и GetObjectDwellingCreatures, описание которых есть в мануале.
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

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

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#94
Старый 11.08.2016, 19:46
  #94
^
Александр4444
📖
Регистрация: 11.08.2016
Сообщения: 1
Регистрация: 11.08.2016
Сообщения: 1
По умолчанию
Re: Скрипты для начинающих

Уважаемые мастера "RedHeavenHero" и "Ment" прошу вашей помощи! У меня 2 задачи:
-1- Создается карта для сетевой игры от 2х до 8ми игроков, возможны команды. Нужно выполнить следующее условие - когда пример игрок1 нападает на замок вражеского игрока2 и выигрывает битву, то данный замок должен превратится в груду развалин. Потом любой игрок который своим героем "заденет/войдет" эту груду развалин должен получить сообщение "желаете отстроить замок своей фракции за N количества ресурсов ?" и предлагается выбор "да" или "нет". При выборе ответа "да" с данного игрока списывается N ресурсов и появляется вместо груды развалин замок данного игрока самого начального уровня. Если ресурсов не хватает, то выдать сообщение "не хватает ресурсов". А то надоело контролировать замки чуждых фракций, и юнитов не стыкуеш и врагу отдавать опасно!
-2- (не совсем честно) В самой первой версии Героев 5 во фракции "людей" разрешалось переобучать юнитов без ограничений, лижбы золота хватало. В последующих версиях сделали максимальное ограничение в 14 юнитов в неделю, что меня сильно печалит((((! Нужно убрать это ограничение для всех игроков, кто играет фракцией "людей".
---- Это должно быть 2 отдельных скрипта или еще как реализовано, так чтобы я мог применять их по отдельности или вместе. Играть собираюсь на лицензии по домашней сети или на одном компьютере. Будет здорово если в такую модифицированную карту можно будет сыграть с другом по интернету.
---- По скольку я ценю время грамотных/опытных людей готов в разумных пределах оплатить так сказать "тех поддержку" за текущие задания. Как вариант можете указать кошелек Киви и сумму. В 4х героях где можно было составлять скрипты из готовых блоков сам разобрался, а здесь изучать долго и вопросов много. По скольку игрой интересуюсь давно, возможно еще будут вопросы/задания. Желательно для возможных пояснений встретится в скайпе или тимспике.
Александр4444 вне форума
Ответить с цитированием
#95
Старый 19.01.2017, 02:30
  #95
^
X-HEROI
 
Аватар для X-HEROI
📖
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Лампочка
Re: Скрипты для начинающих

Ребят, добрый день.
Прошу о помощи! С Героями знаком более 7 лет и вот решил заняться картостроением. Конкретно прошу помощи по скриптам.
Я понимаю, что в этой теме выкладывают уже готовые функции, но всё же хотелось бы немного пояснения, какая строчка, за что отвечает. Безусловно можно потратить часик и с помощью перечня функций и т.д. можно "расшифровать" код...
Вот такая вот есть идея. Что-то простенькое написать и сам могу, но тут нужен просто совет и небольшое наставление. Так вот: при загрузке карты герою должно выдаваться основное задание, как добраться до точки. Как это будет правильно реализовать? Т.е. чтобы он добрался до определённого региона на карте, а там уже выполнился квест.
Буду благодарен за помощь, и было бы совсем удачей, если можно будет пообщаться с бывалым скриптером.
X-HEROI вне форума
Ответить с цитированием
#96
Старый 19.01.2017, 13:54
  #96
^
Ment
 
Аватар для Ment
📖
Регистрация: 30.10.2009
Адрес: Национальный заповедник
Сообщения: 30674
Регистрация: 30.10.2009
Адрес: Национальный заповедник
Сообщения: 30674
По умолчанию
Re: Скрипты для начинающих

Проще всего создать регион размера 1x1 и написать триггер по входу в этот регион:

Trigger(REGION_ENTER_AND_STOP_TRIGGER,"имя региона","FName")

Где FName -- имя функции. А перед этим собственно что должна делать функция

function FName(heroname)
 if GetObjectOwner(heroname)==1 then
  SetObjectiveState("имя задания", OBJECTIVE_COMPLETED)
  Trigger(REGION_ENTER_AND_STOP_TRIGGER,"имя региона",nil)
 end;
end;

Внутри функции мы, во-первых, сделали проверку условия, что heroname принадлежит первому игроку (если игрок-человек первый, конечно). Во-вторых, если условие выполнено, засчитали задание выполненным и отменили действие триггера, чтобы он больше не вызывался.
Ment вне форума
Ответить с цитированием
#97
Старый 25.02.2017, 03:07
  #97
^
X-HEROI
 
Аватар для X-HEROI
📖
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Сообщение
Re: Скрипты для начинающих

Спасибо большое! Помогло и всё работает.
А вот сейчас попрошу громко не смеяться. Матом покрывать можно меня или другой лексикой, обзывательного характера. Даже стыдно писать вообще с такой мелочью...
Вот самый наипростейший скрипт, который каждый из вас с закрытыми глазами напишет, даже если разбудить средь ночи.
Герой входит в регион и ему вылетает сообщение с единственной кнопочкой "Да". MessageBox и не паримся. Но вот на дворе 2 часа носи, а я сижу и ломаю голову - что от меня хочет этот скриптер.
	function quest1message ()
	 MessageBox ("/Maps/SingleMission/Scenario 1/quest1.txt");
end;

Trigger(REGION_ENTER_AND_STOP_TRIGGER, "quest1rg", "quest1message" );
Вроде... всё элементарно... но вот. Одна программка говорит, что всё в порядке. Стандартный скриптер ругается на саму фунцию. А в игре герой останавливается каждый раз, как попадает в регион, но сообщения нет. Вроде и все мануалы проштрудировал... и перечни функций... и вот такой пролёт
Пару скринов:


__________________
Завтра - это всего лишь другое название для сегодня.
Завтра - это всего лишь другое название для сегодня.
X-HEROI вне форума
Ответить с цитированием
#98
Старый 25.02.2017, 03:46
  #98
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
По умолчанию
Re: Скрипты для начинающих

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

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

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#99
Старый 25.02.2017, 11:38
  #99
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
По умолчанию
Re: Скрипты для начинающих

	"/Maps/SingleMission/Scenario 1/quest1.txt"
Лучше используйте
	GetMapDataPath()..'quest1.txt'
А ещё лучше что-нибудь покороче (и писать меньше, и пространства для ошибок меньше):
	function MsgBox(text, cb)
  MessageBox(GetMapDataPath()..text..'.txt', cb);
end

MsgBox('quest1');
И стоит разобраться более точно, не вызывается функция-каллбэк или вызывается но не выводится сообщение. Консоль и отладочные сообщения print('bla-bla') первейший инструмент для этого.
Jack_of_shadows вне форума
Ответить с цитированием
#100
Старый 25.02.2017, 13:41
  #100
^
X-HEROI
 
Аватар для X-HEROI
📖
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
По умолчанию
Re: Скрипты для начинающих

Как минимум не совпадает путь текста - пропущена s в SingleMissions/.
Смеялся до посинения над такокой глупой ошибкой. Спасибо.

А ещё лучше что-нибудь покороче (и писать меньше, и пространства для ошибок меньше):

А можно немного всё расшифровать, пожалуйста? Прям вот по полочками и кажду частичку, если не трудно.
А насчёт print'a... Идея дельная, а самое главное - важная и полезная. Учту.
__________________
Завтра - это всего лишь другое название для сегодня.
Завтра - это всего лишь другое название для сегодня.
X-HEROI вне форума
Ответить с цитированием
#101
Старый 25.02.2017, 15:21
  #101
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
По умолчанию
Re: Скрипты для начинающих

А можно немного всё расшифровать, пожалуйста? Прям вот по полочками и кажду частичку, если не трудно.
Это общий подход для любого языка программирования - если вы используете какую-нибудь сложную конструкцию несколько раз (а MessageBox явно на карте будет не один), то можно всю повторяющуюся рутину вынести в отдельную функцию, а писать только то, что изменяется от раза к разу. На примере вашего
MessageBox ("/Maps/SingleMission/Scenario 1/quest1.txt");
Каждый раз в подобном случае вы будете повторять:
MessageBox - достаточно короткое название функции, но можно придумать и гораздо короче.
"/Maps/SingleMission/Scenario 1/" - путь у всех текстовых файлов вероятно будет один.
".txt" - расширение файла тоже не изменяется.
В результате всё, что будет повторятся, описывается один раз в новой функции, с удобным для вас и желательно коротким названием. В функцию передается только изменяющаяся часть - название файла. С помощью оператора ".." строчки склеиваются в одну. Второй параметр функции cb - аналогичен такому же второму параметру оригинального MessageBox (не буду объяснять его смысл, для этого есть документация). Второй параметр необязательный, можно его не указывать.
	-- функция-обёртка вокруг MessageBox. Помещается где-нибудь в начале файла:
function MsgBox(text, cb)
  MessageBox(GetMapDataPath()..text..'.txt', cb);
end

-- пример вызова сообщения, вместо MessageBox ("/Maps/SingleMission/Scenario 1/quest1.txt"); достаточно написать:
MsgBox('quest1');
Если вы критически осмотрите свой код, уверен найдете кучу похожих мест, где можно оптимизировать громоздкие конструкции.

P.S. Конечно, если планируется написать для карты 100 строк кода и всё, то можно на подобные советы не заморачиваться.
Jack_of_shadows вне форума
Ответить с цитированием
#102
Старый 25.02.2017, 15:44
  #102
^
X-HEROI
 
Аватар для X-HEROI
📖
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
По умолчанию
Re: Скрипты для начинающих

Вот. Теперь дошло, о чём идёт речь. Да... так ведь намного проще выходит... просто каждый раз указываем новое имя текстового файла, а сама функция вставляет его в нашу заготовку, описанной всего 1 словом: MsgBox, а после выполняется.
Второй параметр функции cb - аналогичен такому же второму параметру оригинального MessageBox (не буду объяснять его смысл, для этого есть документация). Второй параметр необязательный, можно его не указывать.

Второй параметр отвечает за вызов новой функции после нажатия "Ок" на сообщении. И верно, в руководствах сказано, что можно не писать его.
Хорошо, тогда следующий вопросик. "Каскадное задание". Допустим нам нужно захватить 3 разных шахты: лесопилку, рудную и серную. Как это будет правильней оформить? Задать 3 проверки и после каждой изменять статус задания или как? Или повесить триггер, который будет сверяться... например каждый день, есть ли у нас такая шахта?
__________________
Завтра - это всего лишь другое название для сегодня.
Завтра - это всего лишь другое название для сегодня.
X-HEROI вне форума
Ответить с цитированием
#103
Старый 25.02.2017, 16:01
  #103
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
По умолчанию
Re: Скрипты для начинающих

Если кроме игрока никто физически не сможет захватить шахты, то можно изменять статус по триггеру касания шахты. Если будут бегать компьютерные герои - тогда проверять раз в день или в отдельном потоке (функция startThread).
upd: хотя чего это я, не зависимо от компьютера можно проверять любым из трех вариантов, лишь бы корректно проверять кто именно захватил.
Jack_of_shadows вне форума
Ответить с цитированием
#104
Старый 27.02.2017, 14:53
  #104
^
X-HEROI
 
Аватар для X-HEROI
📖
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Регистрация: 15.02.2016
Адрес: Это Сочи, детка!
Сообщения: 7
Лампочка
Re: Скрипты для начинающих

Если будут бегать компьютерные герои - тогда проверять раз в день или в отдельном потоке (функция startThread).
Хм... Да, в отдельном потоке наверно удобней. И пусть он проверяет каждый день: захватил или нет. Спасибо.
Теперь пришла ещё одна смешная проблемка.
Простое такое задание:
- Зашёл в регион - получил задание на поиск артефакта и выполнил предыдущее.
- Взял артефакт и задание выполнилось.
Создал неактивное задание, которое не выводится изначально, на поиск артефактов. Потом просто его активирую.

	Trigger(REGION_ENTER_AND_STOP_TRIGGER, "quest1end", "quest1end_quest2start");
function quest1end_quest2start()
  SetObjectiveState("quest1info", OBJECTIVE_COMPLETED, PLAYER_1);
  MsgBox('quest1end');
  sleep('5');
  MsgBox('quest2start');
  SetObjectiveState("artifact1", OBJECTIVE_ACTIVE, PLAYER_1);
  Trigger(REGION_ENTER_AND_STOP_TRIGGER, "quest1end", nil);
end;
Вроде всё хорошо, но вот после того, как берём мы артефакт, сразу миссия выиграна. В чём проблема? В отсутствии других заданий, или что-то перехимичил в свойствах карты?
__________________
Завтра - это всего лишь другое название для сегодня.
Завтра - это всего лишь другое название для сегодня.
X-HEROI вне форума
Ответить с цитированием
#105
Старый 27.02.2017, 20:45
  #105
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
По умолчанию
Re: Скрипты для начинающих

Так как задание primary, возможно, что если оно было единственным, то автоматически засчитывается победа по выполнению. Обычно для этого создается какое-нибудь основное задание, которе висит с начала игры и до конца (к примеру не потерять главного героя).
Еще можно поиграться с флагом Ignore:
Ignore— при значении“true” не учитывается при проверке на выигрыш и поражение.
Jack_of_shadows вне форума
Ответить с цитированием
Ответ
Страница 7 из 28


Опции темы



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


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

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