• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в оценке работ на конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

Не стесняюсь спросить....

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
В убивающем скрипте менять значение специальной переменной. И где нужно, ее проверять. Или в массиве признаков выделить ячейку, в которую убивающий скрипт ставит признак "это я убил, а не ГГ". Чего уж проще?

А дополнительные переменные можно ли добавлять к оркам/монстрам? Как бы все переменные прописаны в движке.

Т.к. у меня будут n число орков и монстров с дополнительной переменной, а часть без. Как на такое отреагирует движок? (он же ведёт свой массив данных по всем NPC/оркам/монстрам)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
Но как игру заставить видеть, что был убит монстр/орк именно скриптом, а не ГГ?
Гм, а как скрипт решает, что должен кого-то убить? Приведи пример. А то у меня такое ощущение, что мы разговариваем на разных языках. ;)
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Гм, а как скрипт решает, что должен кого-то убить? Приведи пример. А то у меня такое ощущение, что мы разговариваем на разных языках. ;)

Достаточно указать проверку, if(victim.guild = далее указываем гильдию) - а т.к. судя по Spacer игра делит персонажей в игре на ГГ и NPC (орки/монстры/люди), то в триггере указать реакцию на NPC. - в теории должно сработать.

Проверку на гильдию прописывать в Trigger-Script в сам скрипт.

У меня ещё 9 квестов перед этой реализацией, т.е. уже рядом и нужно заранее узнавать как решить найденные в теории подводные камни.

На данную реализацию барьера меня подтолкнула мысль, когда решалась проблема реакции людей на волкодава (когда он защищает ГГ от атакующего его человека)
 
Последнее редактирование:

BlackWolf

Участник форума
Регистрация
9 Авг 2016
Сообщения
14
Благодарности
5
Баллы
160
Если монстра или орка убивает скрипт, нужно чтобы была проверка (кто убил монстра/орка, ГГ или скрипт)? (саму проверку нужно добавить в скриптовую зацикленную функцию Trigger-Script (ZEN) и далее в ней прописать, если умер этот орк/монстр и его убил скрипт возрождается орк/монстр на определённой точке (waypoint))

А т.к. у меня каждый орк и монстр со своим порядковым номером, то достаточно просто прописать проверку всем монстрам и оркам которые за забором в Минентале используются.

Но как игру заставить видеть, что был убит монстр/орк именно скриптом, а не ГГ? (проверка ведь в игре есть, если у монстра/орка число HP > 0)
Ну да все верно. Собственно в самом скрипте нельзя прописать такое условие, "Убил скрипт или ГГ" Просто создать переменную, например ORKKILL если скрипт сработал, то переходит в TRUE, если ГГ убил то она остается FALSE.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Зачем? Есть же массив aivar.

Только этот массив не позволил контролировать всех монстров и орков. Пример:

у ГГ повысился уровень:

Если орк1 имеет > 0 HP ему добавить к максимуму HP и к HP n единиц здоровья и n единиц силы
Если орк2 имеет > 0 HP ему добавить к максимуму HP и к HP n единиц здоровья и n единиц силы
и т.д.

Т.к. массив aivar мне не даёт названия под которыми он хранит данные об каждом NPC. Смысл мне об нём вспоминать.

Об этом с MaGoth был разговор. Полный контроль массив мне не даёт т.к. в игре нету нормальной СУБД.

Если тебе нужно, чтобы диалог стартовал не в момент открывания двери, а в начале взаимодействия с ней, описанные выше возможности не пригодятся. Кроме них есть параметр conditionFunc. Здесь прописывается название скриптовой функции типа int, разрешающей взаимодействие с объектом. Если она возвращает TRUE, взаимодействовать с объектом можно, если FALSE - нельзя. Функция вызывается как раз в самом начале взаимодействия с объектом, вернее, вызов предшествует этому взаимодействию.

Пришлось перевести на обычный язык "скриптовой функции типа int" когда был взят за пример постамент с книгой. - можно с примером указывать ссылку, а то немного гадания получается.
 
Последнее редактирование:

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Только этот массив не позволил контролировать всех монстров и орков. Пример:

у ГГ повысился уровень:

Если орк1 имеет > 0 HP ему добавить к максимуму HP и к HP n единиц здоровья и n единиц силы
Если орк2 имеет > 0 HP ему добавить к максимуму HP и к HP n единиц здоровья и n единиц силы
и т.д.

Т.к. массив aivar мне не даёт названия под которыми он хранит данные об каждом NPC. Смысл мне об нём вспоминать.

Об этом с MaGoth был разговор. Полный контроль массив мне не даёт т.к. в игре нету нормальной СУБД.

В игре не нужна "нормальная СУБД". Есть массив aivar и его для решения этой задачи более чем достаточно.

Почитайте, наконец, что такое этот aivar. Тогда узнаете, что он находится в самом персонаже. И нет такой проблемы, как "не даёт названия под которыми он хранит данные об каждом NPC". Если лень, продолжайте страдать по поводу "невозможности" решить эту задачу "в таком ужасном движке".
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
В игре не нужна "нормальная СУБД". Есть массив aivar и его для решения этой задачи более чем достаточно.

Почитайте, наконец, что такое этот aivar. Тогда узнаете, что он находится в самом персонаже. И нет такой проблемы, как "не даёт названия под которыми он хранит данные об каждом NPC". Если лень, продолжайте страдать по поводу "невозможности" решить эту задачу "в таком ужасном движке".

Если настолько много знаешь опиши примером как с использованием aivar ты можешь добавить следующие параметры: ATR_STRENGTH, ATR_DEXTERITY, ATR_HITPOINTS_MAX, ATR_HITPOINTS при условии, изменять параметры только живым существам (исключая людей) при каждом повышении уровня ГГ.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Если настолько много знаешь опиши примером как с использованием aivar ты можешь добавить следующие параметры: ATR_STRENGTH, ATR_DEXTERITY, ATR_HITPOINTS_MAX, ATR_HITPOINTS при условии, изменять параметры только живым существам (исключая людей) при каждом повышении уровня ГГ.

Тебе надо было добавить признак "убит скриптом"? Зачем тебе для этого ATR_STRENGTH, ATR_DEXTERITY, ATR_HITPOINTS_MAX, ATR_HITPOINTS?
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Тебе надо было добавить признак "убит скриптом"? Зачем тебе для этого ATR_STRENGTH, ATR_DEXTERITY, ATR_HITPOINTS_MAX, ATR_HITPOINTS?

Снова убегаешь от ответа.
ATR_STRENGTH, ATR_DEXTERITY, ATR_HITPOINTS_MAX, ATR_HITPOINTS мне нужны были для того, чтобы с повышением уровня ГГ и росли его противники, а aivar не позволил выполнять условия т.к. для проверки нужно:

B_RaiseAttribute(наименование NPC/орка/монстра,ATR_STRENGTH,число на сколько изменение);

Но мне наименование NPC/орка/монстра движок не выдаёт под которыми он хранит данные, чтобы через скрипты мне менять данные орка/монстра.

Ну да все верно. Собственно в самом скрипте нельзя прописать такое условие, "Убил скрипт или ГГ" Просто создать переменную, например ORKKILL если скрипт сработал, то переходит в TRUE, если ГГ убил то она остается FALSE.

Т.е. мне придётся заводить для каждого за забором свою переменную (около 500 новых переменных для хранения показания - убит скриптом/ГГ/живой) - т.е. нужно будет 3 состояния хранить.
 

BlackWolf

Участник форума
Регистрация
9 Авг 2016
Сообщения
14
Благодарности
5
Баллы
160
Снова убегаешь от ответа.
ATR_STRENGTH, ATR_DEXTERITY, ATR_HITPOINTS_MAX, ATR_HITPOINTS мне нужны были для того, чтобы с повышением уровня ГГ и росли его противники, а aivar не позволил выполнять условия т.к. для проверки нужно:

B_RaiseAttribute(наименование NPC/орка/монстра,ATR_STRENGTH,число на сколько изменение);

Но мне наименование NPC/орка/монстра движок не выдаёт под которыми он хранит данные, чтобы через скрипты мне менять данные орка/монстра.



Т.е. мне придётся заводить для каждого за забором свою переменную (около 500 новых переменных для хранения показания - убит скриптом/ГГ/живой) - т.е. нужно будет 3 состояния хранить.
Ну, почему, 3 переменные на 3 состояния. Мне довольно трудно сориентироваться, если я не вижу ваших скриптов. Но думаю это работает по принципу торговли с Гораксом по заданию Лютеро. Хотя я возможно могу ошибаться.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Ну, почему, 3 переменные на 3 состояния. Мне довольно трудно сориентироваться, если я не вижу ваших скриптов. Но думаю это работает по принципу торговли с Гораксом по заданию Лютеро. Хотя я возможно могу ошибаться.

вот пример на основе одного монстра:

func void B_RaiseAttribute1(var C_Npc oth,var int attrib,var int points)
{
if(attrib == ATR_STRENGTH)
{
oth.attribute[ATR_STRENGTH] = oth.attribute[ATR_STRENGTH] + points;
};
if(attrib == ATR_DEXTERITY)
{
oth.attribute[ATR_DEXTERITY] = oth.attribute[ATR_DEXTERITY] + points;
};
if(attrib == ATR_HITPOINTS)
{
oth.attribute[ATR_HITPOINTS] = oth.attribute[ATR_HITPOINTS] + points;
};
if(attrib == ATR_HITPOINTS_MAX)
{
oth.attribute[ATR_HITPOINTS_MAX] = oth.attribute[ATR_HITPOINTS_MAX] + points;
};
};

func void Wolfplus()
{
var int wolfHM;
var int wolfH;
wolfHM = n;
wolfH = wolfHM * n;
if(LEVA >= 101)
{
wolfHM = 0;
};
if(YWolf1.attribute[ATR_HITPOINTS] > 0)
{
B_RaiseAttribute1(YWolf1,ATR_STRENGTH,wolfHM);
B_RaiseAttribute1(YWolf1,ATR_DEXTERITY,wolfHM);
B_RaiseAttribute1(YWolf1,ATR_HITPOINTS_MAX,wolfH);
B_RaiseAttribute1(YWolf1,ATR_HITPOINTS,wolfH);
};

Если убит скриптом = возродить = 1
Если живой = 0
Если убит ГГ = 2 (чтобы избежать глюков со стороны движка)

Число на которое у меня изменяется специально скрыто, поставлено n (чтобы контролировать параметры всех орков и монстров уже скриптовая масса около 800 кб выходит, когда в Минентале добавлены будут орки и монстры - скриптовая масса ещё вырастет)

P.S. Если полную версию мода делать - какая скриптовая масса для управления параметрами орков и монстров уже не загадываю (она будет мегабайты весить или даже до 20 мегабайт)
 
Последнее редактирование:

BlackWolf

Участник форума
Регистрация
9 Авг 2016
Сообщения
14
Благодарности
5
Баллы
160
В игре не нужна "нормальная СУБД". Есть массив aivar и его для решения этой задачи более чем достаточно.

Почитайте, наконец, что такое этот aivar. Тогда узнаете, что он находится в самом персонаже. И нет такой проблемы, как "не даёт названия под которыми он хранит данные об каждом NPC". Если лень, продолжайте страдать по поводу "невозможности" решить эту задачу "в таком ужасном движке".
Кстати, я не подумал про изменение поведения орков. Возможно молодой человек прав, и действительно вместо переменных следует использовать функцию изменения AIVAR, в некоторых функциях вместо рутины именно используется изменение поведения.
aivar- дословно переводится "варианты искусственного интеллекта" Хотя я думаю вы это знаете.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Кстати, я не подумал про изменение поведения орков. Возможно молодой человек прав, и действительно вместо переменных следует использовать функцию изменения AIVAR, в некоторых функциях вместо рутины именно используется изменение поведения.
aivar- дословно переводится "варианты искусственного интеллекта" Хотя я думаю вы это знаете.

Может кто-то мне пояснит как состояние (убит скриптом, убит ГГ, жив) связано с поведением орков? (логической связи не вижу)

NONE_997_bobik.aivar[AIV_PARTYMEMBER] = TRUE; - всё равно требует наименование NPC...

Если задействовать triggerTarget = всё работает, если двери не имеют ограничения на определённый ключ - открываете дверь и получаете разговор.
Если задействовать conditionFunc = диалог за дверью работает, но дверь не может быть открыта.

Теперь осталось понять, как заставить снова дверь работать.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
Пришлось перевести на обычный язык "скриптовой функции типа int" когда был взят за пример постамент с книгой. - можно с примером указывать ссылку, а то немного гадания получается.
То есть, тебя это словосочетание заставляет гадать о его смысле?

Достаточно указать проверку, if(victim.guild = далее указываем гильдию) - а т.к. судя по Spacer игра делит персонажей в игре на ГГ и NPC (орки/монстры/люди), то в триггере указать реакцию на NPC. - в теории должно сработать.
И где здесь ответ на это:
Гм, а как скрипт решает, что должен кого-то убить? Приведи пример.

Только этот массив не позволил контролировать всех монстров и орков. Пример:

у ГГ повысился уровень:

Если орк1 имеет > 0 HP ему добавить к максимуму HP и к HP n единиц здоровья и n единиц силы
Если орк2 имеет > 0 HP ему добавить к максимуму HP и к HP n единиц здоровья и n единиц силы
и т.д.
Автолевелинг, что ли? Если да, то это проще организовать через функции ИИ, например, через функцию активации восприятий. Как только монстр оказывается в зоне действия ИИ, его статы приводятся в соответствии с уровнем ГГ в специальной функции. И наделять всех монстров уникальными id при таком подходе совершенно не обязательно.

Теперь осталось понять, как заставить снова дверь работать.
Для начала нужно немного подумать. Чтобы с дверью можно было взаимодействовать, кондишн-функция должна возвращать... Ну, догадался?
 
Последнее редактирование модератором:

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
То есть, тебя это словосочетание заставляет гадать о его смысле?


И где здесь ответ на это:



Автолевелинг, что ли? Если да, то это проще организовать через функции ИИ, например, через функцию активации восприятий. Как только монстр оказывается в зоне действия ИИ, его статы приводятся в соответствии с уровнем ГГ в специальной функции. И наделять всех монстров уникальными id при таком подходе совершенно не обязательно.


Для начала нужно немного подумать. Чтобы с дверью можно было взаимодействовать, кондишн-функция должна возвращать... Ну, догадался?

Int = т.е. число - а как может функция состоять из одного числа?

Когда по плану подойду до реализации, тогда в моде это можно будет увидеть. Пока пару набросков мне дали (после надо будет попытаться всё соединить вместе).

Автоуровень надёжно когда сразу срабатывает т.к. движок у готики отличается любым капризом и если реализовывать через зону действия ГГ - жди любого бага.

Должна возвращать значение ложь или правда, но это ещё компилятору объясни (чтобы его заскоки преодолеть).

Т.к. на:

if((Wld_IsTime(7,30,22,0)) && (olddoor == 0))
{
olddoor = 1;
AI_GotoWP(a_nov_9119,"WOROTO08");
Npc_ExchangeRoutine(a_nov_9119,"GOBL");
};
if((Wld_IsTime(21,30,8,0)) && (olddoor == 0))
{
olddoor = 1;
AI_GotoWP(a_nov_9118,"WOROTO08");
Npc_ExchangeRoutine(a_nov_9118,"GOBL");
};
if(Npc_HasItems(hero,ItKe_Min_01) >= 1)
{
return TRUE;
};
if(Npc_HasItems(hero,ItKe_Min_01) == 0)
{
return FALSE;
};

компилятору подавай (красным выделено) места в которых ему подавай ещё ;

Ошибки нету, компилятору что-то своё подавай...

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

Или дверь не работает или компилятору подавай ; бесконечное число
 
Последнее редактирование:

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Int = т.е. число - а как может функция состоять из одного числа?

Ты вообще о программировании представление имеешь?

Кроме того, прекрати скакать с одного вопроса на другой. Тебе сначала надо было организовать открывание дверей. Потом ты про это благополучно забыл. Вдруг загорелся идеей убивания скриптом, утверждая, что контроль этого не реализовать. Когда тебе указали на то, как это элементарно сделат, ты переключился на автолевелинг. Ну и как "вишенка на торте" это непонимание, что означает "функция типа int". Ты полагаешь, что здесь людям заняться нечем?

Попробуй для начала сделать что-нибудь элементарное. И почитай уроки скриптинга.

PS; А "рабочая дверь" в Готике реализуется элементарно. И никаких сложностей тут нет. Говорю это потому, что сам это сделал. В 5 минут. Причем, персонаж у меня это проделывал даже не в диалоге, а в обычном расписании. Насчет диалога через дверь, не пробовал (просто мне это не нужно), но, полагаю, минут за 10 сделать можно. По крайней мере проверить работоспособность такой конструкции. Надо только не флудить на фолруме, а что-то попытаться сделать самому.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Ты вообще о программировании представление имеешь?

Кроме того, прекрати скакать с одного вопроса на другой. Тебе сначала надо было организовать открывание дверей. Потом ты про это благополучно забыл. Вдруг загорелся идеей убивания скриптом, утверждая, что контроль этого не реализовать. Когда тебе указали на то, как это элементарно сделат, ты переключился на автолевелинг. Ну и как "вишенка на торте" это непонимание, что означает "функция типа int". Ты полагаешь, что здесь людям заняться нечем?

Попробуй для начала сделать что-нибудь элементарное. И почитай уроки скриптинга.

PS; А "рабочая дверь" в Готике реализуется элементарно. И никаких сложностей тут нет. Говорю это потому, что сам это сделал. В 5 минут. Причем, персонаж у меня это проделывал даже не в диалоге, а в обычном расписании. Насчет диалога через дверь, не пробовал (просто мне это не нужно), но, полагаю, минут за 10 сделать можно. По крайней мере проверить работоспособность такой конструкции. Надо только не флудить на фолруме, а что-то попытаться сделать самому.

Целое, целочисленный тип данных (англ. Integer), в информатике — один из простейших и самых распространённых типов данных в языках программирования. Служит для представления целых чисел. - Основу сначала изучи, после меня носом просьба тыкать.

Мне сказали "скриптовой функции типа int" а раз скриптовая функция возвращающая TRUE или FALSE (1 или 0) = значит мы имеем число.

Ну так реализуй и после скажешь, у тебя будет работать или нет?

У меня работает, если тупо открыть дверь и идёт диалог. Если закрытая дверь через triggerTarget не работает, работает conditionFunc (но дверь после этого перестаёт работать, а компилятор не даёт возвращать состояние "Примечание: Скриптовая функция возвращающая TRUE или FALSE (1 или 0).")

Согласно немецкому форуму forum.worldofplayers.de и evt_monastery_secretlibrary_s1.d - мне нужно знать переменную, чтобы ей возвращать значение 1 или 0.

А теперь снова возвращаемся, кто описал какую переменную использует движок когда работает с запертыми дверями? (От меня игра требует, укажи переменную которую использует движок игры. А она у меня есть? Кто-то за 15 лет её описал?)

Если conditionFunc оставлять пустой, то движок автоматически использует переменную которой присваивает значение 1 или 0. Чтобы реализовать разговор с закрытыми дверями и чтобы после двери работали, мне нужно название переменной которую использует по умолчанию движок игры при работе с любыми закрытыми дверями.

Вот и ясно, почему у тебя скриптёров нету (сам толком не понимаешь всего и других поучаешь)

Вот когда у меня будет 10-15 скриптёров, тогда и будет всё делаться не заранее.
 
Последнее редактирование:

BlackWolf

Участник форума
Регистрация
9 Авг 2016
Сообщения
14
Благодарности
5
Баллы
160
Может кто-то мне пояснит как состояние (убит скриптом, убит ГГ, жив) связано с поведением орков? (логической связи не вижу)

NONE_997_bobik.aivar[AIV_PARTYMEMBER] = TRUE; - всё равно требует наименование NPC...

Если задействовать triggerTarget = всё работает, если двери не имеют ограничения на определённый ключ - открываете дверь и получаете разговор.
Если задействовать conditionFunc = диалог за дверью работает, но дверь не может быть открыта.

Теперь осталось понять, как заставить снова дверь работать.
Сажите, за что у вас отвечает строчка aivar[AIV_PARTYMEMBER] = TRUE Что это значит?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
А теперь снова возвращаемся, кто описал какую переменную использует движок когда работает с запертыми дверями? (От меня игра требует, укажи переменную которую использует движок игры. А она у меня есть? Кто-то за 15 лет её описал?)
Начинаю сомневаться в своей адекватности. Или в твоей. :eek:

У меня работает, если тупо открыть дверь и идёт диалог. Если закрытая дверь через triggerTarget не работает, работает conditionFunc (но дверь после этого перестаёт работать, а компилятор не даёт возвращать состояние "Примечание: Скриптовая функция возвращающая TRUE или FALSE (1 или 0).")
Делаешь так:
Код:
var int HeroTriedTheDoor;

func int MySuperDoor_ConditionFunc()
     if(диалог не состоялся)
     {
          HeroTriedTheDoor = TRUE;  // Значение переменной проверяется в условии диалога.
          return FALSE;
     };
     return TRUE;
};
 
Сверху Снизу