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

Сообщения от Скрипты для начинающих

В ответ пользователю Ment
Аватар пользователя
10 лет назад
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))
Какие есть идеи? :)
10 лет назад
Ребят здравствуйте я начинающий в этом деле,хотелось бы узнать вот какую вещь: Хочу увеличить кол - во существ в постройке. Как можно это сделать ?
В ответ пользователю Emris
Аватар пользователя
10 лет назад
Emris
Ребят здравствуйте я начинающий в этом деле,хотелось бы узнать вот какую вещь: Хочу увеличить кол - во существ в постройке. Как можно это сделать ?
Если речь идет про жилища на карте - то, увы, можно только обновить прирост, то есть, в случае, если его выкупили, добавить обычное количество существ. Для города есть функции SetObjectDwellingCreatures и GetObjectDwellingCreatures, описание которых есть в мануале.
10 лет назад
Уважаемые мастера "RedHeavenHero" и "Ment" прошу вашей помощи! У меня 2 задачи:
-1- Создается карта для сетевой игры от 2х до 8ми игроков, возможны команды. Нужно выполнить следующее условие - когда пример игрок1 нападает на замок вражеского игрока2 и выигрывает битву, то данный замок должен превратится в груду развалин. Потом любой игрок который своим героем "заденет/войдет" эту груду развалин должен получить сообщение "желаете отстроить замок своей фракции за N количества ресурсов ?" и предлагается выбор "да" или "нет". При выборе ответа "да" с данного игрока списывается N ресурсов и появляется вместо груды развалин замок данного игрока самого начального уровня. Если ресурсов не хватает, то выдать сообщение "не хватает ресурсов". А то надоело контролировать замки чуждых фракций, и юнитов не стыкуеш и врагу отдавать опасно!
-2- (не совсем честно) В самой первой версии Героев 5 во фракции "людей" разрешалось переобучать юнитов без ограничений, лижбы золота хватало. В последующих версиях сделали максимальное ограничение в 14 юнитов в неделю, что меня сильно печалит((((! Нужно убрать это ограничение для всех игроков, кто играет фракцией "людей".
---- Это должно быть 2 отдельных скрипта или еще как реализовано, так чтобы я мог применять их по отдельности или вместе. Играть собираюсь на лицензии по домашней сети или на одном компьютере. Будет здорово если в такую модифицированную карту можно будет сыграть с другом по интернету.
---- По скольку я ценю время грамотных/опытных людей готов в разумных пределах оплатить так сказать "тех поддержку" за текущие задания. Как вариант можете указать кошелек Киви и сумму. В 4х героях где можно было составлять скрипты из готовых блоков сам разобрался, а здесь изучать долго и вопросов много. По скольку игрой интересуюсь давно, возможно еще будут вопросы/задания. Желательно для возможных пояснений встретится в скайпе или тимспике.
В ответ пользователю Александр4444
Аватар пользователя
9 лет назад
Ребят, добрый день.
Прошу о помощи! С Героями знаком более 7 лет и вот решил заняться картостроением. Конкретно прошу помощи по скриптам.
Я понимаю, что в этой теме выкладывают уже готовые функции, но всё же хотелось бы немного пояснения, какая строчка, за что отвечает. Безусловно можно потратить часик и с помощью перечня функций и т.д. можно "расшифровать" код...
Вот такая вот есть идея. Что-то простенькое написать и сам могу, но тут нужен просто совет и небольшое наставление. Так вот: при загрузке карты герою должно выдаваться основное задание, как добраться до точки. Как это будет правильно реализовать? Т.е. чтобы он добрался до определённого региона на карте, а там уже выполнился квест.
Буду благодарен за помощь, и было бы совсем удачей, если можно будет пообщаться с бывалым скриптером.
Аватар пользователя
9 лет назад
Проще всего создать регион размера 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
Аватар пользователя
9 лет назад
Спасибо большое! Помогло и всё работает.
А вот сейчас попрошу громко не смеяться. Матом покрывать можно меня или другой лексикой, обзывательного характера. Даже стыдно писать вообще с такой мелочью...
Вот самый наипростейший скрипт, который каждый из вас с закрытыми глазами напишет, даже если разбудить средь ночи.
Герой входит в регион и ему вылетает сообщение с единственной кнопочкой "Да". MessageBox и не паримся. Но вот на дворе 2 часа носи, а я сижу и ломаю голову - что от меня хочет этот скриптер.
function quest1message ()
MessageBox ("/Maps/SingleMission/Scenario 1/quest1.txt");
end;

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


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

MsgBox('quest1');
И стоит разобраться более точно, не вызывается функция-каллбэк или вызывается но не выводится сообщение. Консоль и отладочные сообщения print('bla-bla') первейший инструмент для этого.
Аватар пользователя
9 лет назад
Как минимум не совпадает путь текста - пропущена s в SingleMissions/.
Смеялся до посинения над такокой глупой ошибкой. Спасибо.
А ещё лучше что-нибудь покороче (и писать меньше, и пространства для ошибок меньше):
А можно немного всё расшифровать, пожалуйста? Прям вот по полочками и кажду частичку, если не трудно.
А насчёт print'a... Идея дельная, а самое главное - важная и полезная. Учту.
Аватар пользователя
9 лет назад
А можно немного всё расшифровать, пожалуйста? Прям вот по полочками и кажду частичку, если не трудно.
Это общий подход для любого языка программирования - если вы используете какую-нибудь сложную конструкцию несколько раз (а 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 строк кода и всё, то можно на подобные советы не заморачиваться.
Аватар пользователя
9 лет назад
Вот. Теперь дошло, о чём идёт речь. Да... так ведь намного проще выходит... просто каждый раз указываем новое имя текстового файла, а сама функция вставляет его в нашу заготовку, описанной всего 1 словом: MsgBox, а после выполняется.
Второй параметр функции cb - аналогичен такому же второму параметру оригинального MessageBox (не буду объяснять его смысл, для этого есть документация). Второй параметр необязательный, можно его не указывать.
Второй параметр отвечает за вызов новой функции после нажатия "Ок" на сообщении. И верно, в руководствах сказано, что можно не писать его.
Хорошо, тогда следующий вопросик. "Каскадное задание". Допустим нам нужно захватить 3 разных шахты: лесопилку, рудную и серную. Как это будет правильней оформить? Задать 3 проверки и после каждой изменять статус задания или как? Или повесить триггер, который будет сверяться... например каждый день, есть ли у нас такая шахта?
Аватар пользователя
9 лет назад
Если кроме игрока никто физически не сможет захватить шахты, то можно изменять статус по триггеру касания шахты. Если будут бегать компьютерные герои - тогда проверять раз в день или в отдельном потоке (функция startThread).
upd: хотя чего это я, не зависимо от компьютера можно проверять любым из трех вариантов, лишь бы корректно проверять кто именно захватил.
Аватар пользователя
9 лет назад
Если будут бегать компьютерные герои - тогда проверять раз в день или в отдельном потоке (функция 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;
Вроде всё хорошо, но вот после того, как берём мы артефакт, сразу миссия выиграна. В чём проблема? В отсутствии других заданий, или что-то перехимичил в свойствах карты?
Аватар пользователя
9 лет назад
Так как задание primary, возможно, что если оно было единственным, то автоматически засчитывается победа по выполнению. Обычно для этого создается какое-нибудь основное задание, которе висит с начала игры и до конца (к примеру не потерять главного героя).
Еще можно поиграться с флагом Ignore:
Ignore— при значении“true” не учитывается при проверке на выигрыш и поражение.

Статистика

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

Сейчас на сайте 5 пользователей 1412 гостей