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

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

В ответ пользователю Kavalar
Аватар пользователя
Kavalar
То есть что-то вроде, если мана героя уменьшилась проверяем стеки врага?

Появилась идея по идентификации заклинания, например извлекать до начала боя его наличие у героя в книжке, и считать аналитически с поправкой на SP и бонусы от школ сколько урона оно должно наносить. Потом просто провести сравнение, и если сошлось количество затрачиваемой маны и урон то записать. Как думаете может сработать?
Единственная проблема правда это учет резиста, и если существ еще можно проанализировать то как быть с геройскими бонусами, или бонусами от артефактов пока непонятно.:smile32:
1. Да, так.
2. Так тоже можно, но: на урон от заклинаний, как и на стоимость влияет очень много факторов, каждый из которых надо учитывать, чтобы адекватно оценить тип заклинания; урон от заклинания также сложно высчитать из-за округления до количества убитых существ. Еще есть факторы, которые никак не получится выявить: вроде знака огня, руны стихийной невосприимчивости, антимагии.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Аватар пользователя
я примерно похожий алгоритм придумал, правда пока отложил эту задачу на потом, но поделюсь своими мыслями:

"на бумаге" у меня конструкция примерно такая:
if(combatReadyPerson() == "имя нужного героя")
получить данные о существах врага через GetCreatures() и GetCreatureNumber()

потом нужно узнать, что ход героя кончился:
repeat
current_mana = GetUnitManaPoints("имя нужного героя")
until(isCreature(combatReadyPerson())

дальше смотрим, изменилось ли число маны и существ врага, на основе этого делаем вывод, было ли сотворено заклинание и какой от него был эффект

не уверен, насколько верны мои предположения, т.к. пока реально подзабил на эту задачу в пользу более понятных для себя вещей)
Нет войне.
local heroes = GetAllNames(0);
for i, hero in heroes do
print( i, hero );
end

При добавлении строк игра вылетает с ошибкой в чем может быть дело?
Аватар пользователя
landw1rt, не совсем понятно какие строки куда добавляете и в какой момент вылетает. Возможно функция GetAllNames() возвращает строку, а не таблицу. И ещё героев определённого игрока можно получить функцией GetPlayerHeroes(НОМЕР_ИГРОКА).
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
В ответ пользователю Jack_of_shadows
Jack_of_shadows
landw1rt, не совсем понятно какие строки куда добавляете и в какой момент вылетает. Возможно функция GetAllNames() возвращает строку, а не таблицу. И ещё героев определённого игрока можно получить функцией GetPlayerHeroes(НОМЕР_ИГРОКА).

Добавляю указанный фрагмент в тело скрипта с целью проверить незанятость региона. Методом итераций определил, что вылет из игры происходит после внесения данного фрагмента.

С функцией length то же самое.
GetAllNames() при печать в консоли выдает перечень живых героев, а вот после for начинаются проблемы.
Мне и нужно-то посчитать количество значений, выдаваемых GetAllNames()
Аватар пользователя
landw1rt, данная версия оператора for предназначена для обхода таблиц, а у вас функция возвращает строку. Воспользуйтесь просто GetPlayerHeroes():

local hero_cnt = 0;
for i = PLAYER_1, PLAYER_8 do
hero_cnt = hero_cnt + length(GetPlayerHeroes(i));
end

Код не проверял, мог ошибиться.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
В ответ пользователю Jack_of_shadows
Jack_of_shadows
landw1rt, данная версия оператора for предназначена для обхода таблиц, а у вас функция возвращает строку. Воспользуйтесь просто GetPlayerHeroes():

local hero_cnt = 0;
for i = PLAYER_1, PLAYER_8 do
hero_cnt = hero_cnt + length(GetPlayerHeroes(i));
end

Код не проверял, мог ошибиться.

Спасибо!
Аватар пользователя
решил потестить эти боевые скрипты, сразу столкнулся с непонятной проблемой - создаю скрипт, привязываю его к герою, но в игре в бою он не работает, в консоли при этом ошибка: "attempt to perform ariphmetic on a string value", причем абсолютно неважно, что в скрипте написано, даже на пустой файл так ругается. может кто подсказать, как это пофиксить?
Нет войне.
Аватар пользователя
Gerter, вы на всякий случай покажите, как скрипт прикрепляете к герою, должно быть примерно так:
SetHeroCombatScript(ИМЯ_ГЕРОЯ, '/combat_script.xdb#xpointer(/Script)');
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
Аватар пользователя
да, так и прикрепляю, но дело было в расположении файла - перенес его из имя_карты/Maps/SingleMissions в просто имя_карты/ и все заработало

Добавлено через 7 часов 0 минут
как работает функция combatReadyPerson()?

код:
function Start()
...
currentUnit = combatReadyPerson()
if(IsHero(currentUnit)) then
...

не работает, т.к. currentUnit всегда принимает нулевое значение, хотя по идее combatReadyPerson() должна возвращать строку с именем юнита в начале атб
Нет войне.
Аватар пользователя
по идее combatReadyPerson() должна возвращать строку с именем юнита в начале атб
есть подозрение, что в функции start() она работать не будет, поскольку
The combat will only begin after this function finishes its work.
Стоит попробовать вызывать её из всяких UnitMove().
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
Аватар пользователя
благодарю, да в AttackerHeroMove(), например, функция работает. тут меня руководство от Новика немного сбило с толку, в нем подобной информации нет, а функции типа UnitMove() имеют другую сигнатуру и работают только для AI(на деле это не так)
Нет войне.
Аватар пользователя
Здравствуйте. Такой вопрос. Хочу, чтобы при тыкании на хижину ведьмы всплывало сообщение, открывался туман войны в конкретной точке, и добавлялась второстепенная задача. Вот функция...

function ActQgoldenArmada ()
MessageBox("/Maps/SingleMissions/rework (4)/golden.txt");
OpenCircleFog(206,6,0,15,PLAYER_1);
sleep(2);
MoveCamera(206,6,0,30,1,2,1,1);

Trigger(OBJECT_TOUCH_TRIGGER, "Qgolden", nil );
end;

Trigger(OBJECT_TOUCH_TRIGGER, "Qgolden", "ActQgoldenArmada" );

Она работает, но, как активировать второстепенную задачу? Она должна быть уже создана на карте, но скрыта или как? Так же мне нужна именно второстепенная задача, а не основная. Для неё другая команда, не нужна? Вроде всё. Заранее спасибо за пояснения.
Автор карт:
Долина расхитителей
Выбор мира
В ответ пользователю OrnsteinDragonslayer
Аватар пользователя
OrnsteinDragonslayer
Здравствуйте. Такой вопрос. Хочу, чтобы при тыкании на хижину ведьмы всплывало сообщение, открывался туман войны в конкретной точке, и добавлялась второстепенная задача. Вот функция...

function ActQgoldenArmada ()
MessageBox("/Maps/SingleMissions/rework (4)/golden.txt");
OpenCircleFog(206,6,0,15,PLAYER_1);
sleep(2);
MoveCamera(206,6,0,30,1,2,1,1);

Trigger(OBJECT_TOUCH_TRIGGER, "Qgolden", nil );
end;

Trigger(OBJECT_TOUCH_TRIGGER, "Qgolden", "ActQgoldenArmada" );

Она работает, но, как активировать второстепенную задачу? Она должна быть уже создана на карте, но скрыта или как? Так же мне нужна именно второстепенная задача, а не основная. Для неё другая команда, не нужна? Вроде всё. Заранее спасибо за пояснения.

SetObjectiveState();
В руководстве попробуйте найти сейчас точно не вспомню
Кампания в разработке:
Название не придумал
Выполнено 5%
В ответ пользователю DarkLordax
Аватар пользователя
DarkLordax
SetObjectiveState();
В руководстве попробуйте найти сейчас точно не вспомню
Я к тому, что этот СетОбжектив реализовывать как отдельную функцию, или можно и в эту пихнуть?
Автор карт:
Долина расхитителей
Выбор мира

Статистика

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

Сейчас на сайте 9 пользователей 1289 гостей