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

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

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

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 511
Последнее редактирование модератором:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
674
Благодарности
655
Баллы
245
Можно сделать так, чтобы при обращении к Npc, диалога не открывалось, а npc просто ответил SVM фразой?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
Любой урон типа DAM_FLY, а это големы, тролли, драконы...
Вообще-то у ледяного голема прописан урон DAM_BLUNT, видимо, в качестве компенсации за использование им заклинания заморозки.
Можно сделать так, чтобы при обращении к Npc, диалога не открывалось, а npc просто ответил SVM фразой?
Можно, смотри функцию B_Say_Overlay, которая основана на функции AI_OutputSVM_Overlay.
 
Последнее редактирование:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
674
Благодарности
655
Баллы
245
ледяного голема прописан урон DAM_BLUNT
Да и черт с ним :) Главное что разобрался с константами :)

смотри функцию B_Say_Overlay,

Как это можно использовать...

instance DIA_TEST_Start(C_Info)
{
npc = Test;
condition = DIA_X;
information = DIA_X_Info;
};


func int DIA_X()
{
return TRUE;
};


func void DIA_X_Info()
{
AI_OutputSVM_Overlay(self,other,"$WEATHER");
AI_StopProcessInfos(self);
};

...таким образом чтобы окно диалога не показывалось вообще?
 

Вложения

  • img01.png
    img01.png
    1,3 MB · Просмотры: 95
Последнее редактирование модератором:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
Можно сделать так, чтобы при обращении к Npc, диалога не открывалось, а npc просто ответил SVM фразой?
Возможно, это подойдёт:
Код:
instance ORG_860_Renyu_GetLost(C_Info)
{
   npc = Org_860_Renyu;
   nr = 1;
   condition = ORG_860_Renyu_GetLost_Condition;
   information = ORG_860_Renyu_GetLost_Info;
   permanent = 1;
   important = 1;
};


func int ORG_860_Renyu_GetLost_Condition()
{
   if(Npc_IsInState(self,ZS_Talk))
   {
     return TRUE;
   };
};

func void ORG_860_Renyu_GetLost_Info()
{
   AI_Output(self,other,"Org_860_Renyu_GetLost_Info_06_00");   //Проваливай!
   AI_StopProcessInfos(self);
};

Если не подойдёт, то можно добавить исключение в функцию-обработчик восприятия PERC_ASSESSTALK - B_AssessTalk. Как вариант, можно назначать своему неписю альтернативный обработчик восприятия PERC_ASSESSTALK в его состоянии ИИ.
 
Последнее редактирование:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
674
Благодарности
655
Баллы
245
Я так понимаю - весь фокус в этой строчке?

if(Npc_IsInState(self,ZS_Talk)) { return TRUE; };

Только что-то не совсем пойму как это работает.

Если Npc находится в состоянии разговора, то диалог начинается... и должно появится окно диалога?!?

Если не подойдёт
Нет все подошло. Все работает.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
то диалог начинается... и должно появится окно диалога?!?
Вот это не помню. Работает это так. ГГ кликает на неписе. У того срабатывает восприятие PERC_ASSESSTALK и обработчик переводит его в состояние ZS_Talk. После этого стартует InfoManager и проверяются условия появления опций диалогов. Первой проверяется данная инстанция, и стартует соответствующий диалог с выводом субтитров произнесённой фразы, после чего InfoManager закрывается. В теории, ничего лишнего не должно вылезать на экран. :oops:
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
А зачем диалог создавать? Когда можно просто в восприятии у конкретных нпс( по аивару например) это делать.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
674
Благодарности
655
Баллы
245
Класс C_Item.

Я так понимаю, что значение свойства count[5] привязано к значению свойства value.

Чтобы вы не указали в count[5] всегда будет использоваться значение стоимости.

instance Belt(C_ITEM)
{
name = "Тестовый ремень";
value = 18;
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_BELT | ITEM_MULTI;
change_atr[0] = ATR_STRENGTH;
change_value[0] = 5;
change_atr[1] = ATR_DEXTERITY;
change_value[1] = 5;
cond_atr[0] = ATR_MANA_MAX;
cond_value[0] = 100;
text[0] = "Строка 1";
text[1] = "Строка 2";
text[2] = "Строка 3";
text[3] = "Строка 4";
text[4] = "Строка 5";
text[5] = "Строка 6";
count[0] = 1;
count[1] = 2;
count[2] = 3;
count[3] = 4;
count[4] = 5;
count[5] = 6;
visual = "ItMI_Belt_06.3ds";
};
 

Вложения

  • img03.png
    img03.png
    894,1 KB · Просмотры: 138

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
Понятно. Я почему-то думал, что нулевое значение не выводится. :oops:
 

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
674
Благодарности
655
Баллы
245
Класс C_Npc - свойство damage

damage[DAM_INDEX_FLY] = 1000;

При значении в 1000, наносится урон приблизительно равный 1/10 от 1000, т.е. около 100 HP.

Интересно по какой формуле рассчитывается урон.
 
Последнее редактирование:

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Он забыл наверное, что на такую ересь айвары лучше не использовать, а применить их там где без них действительно нельзя.. ::)
Ну альтернатива аиварам уже придумана, только теперь есть 100 стандартных слотов аиваров
+ 1000 дополнительных.

Код:
//For AST only.
const int NPC_IsActive = 10;
Hlp_SetAIVar(self,NPC_IsActive,TRUE); //Задает значение аивара npc self TRUE
Hlp_GetAIVar(self,NPS_IsActive); //Возвращает значение аивара.
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
Ну альтернатива аиварам уже придумана, только теперь есть 100 стандартных слотов аиваров
+ 1000 дополнительных.
До астов еще дожить надо, а айвары нужны уже вчера.. :p
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
Гм, мне кажется, проблема нехватки аиваров несколько надумана. В Г1, например, массив имеет размерность всего 50. Но и из них, если разобраться, около трети не используются или могут быть легко высвобождены для использования в других целях. В Г2 разрабы пошли по пути создания универсальных алгоритмов, работающих и для людей, и для монстров (глупость, на мой взгляд, приводящая к неоправданному усложнению алгоритмов). Поэтому, им пришлось разделить индексы аиваров. Каждый непись имеет переменные, предназначенные только для людей и только для монстров, соответственно, у монстров не используются человеческие переменные, а у людей - монстрячие. И при желании, сриптер может использовать их в своих целях.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Да конечно, вообще даже в готоаивары, можно без расширений записывать огромное количество данных используя их как битовые поля, тогда в один аивар по 16 значений можно писать, так что проблема реально надумана, но больше аиваров это не меньше аиваров, они очь упрощают работу.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
Кстати, да. Но я, к сожалению, пока не въехал, как правильно работать с битовыми операциями из скриптов, как изменить значение определённого бита в переменной, и как прочитать его. Буду благодарен за разъяснения. Но это потом.

А пока всех с Новым Годом! *dance2*
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
Кстати, да. Но я, к сожалению, пока не въехал, как правильно работать с битовыми операциями из скриптов, как изменить значение определённого бита в переменной, и как прочитать его. Буду благодарен за разъяснения. Но это потом.
Достаточно знать таблицы истинности для И, ИЛИ, НЕ.
INT состоит из 32-ух бит и в двоичном виде выглядит так
00000000000000000000000000000000 bin min
11111111111111111111111111111111 bin max
в шестнадцатиричном так
00000000 hex min
FFFFFFFF hex max
Для нас знак не имеет значения.
Нумеруются биты справа налево с 0 до 31. Их можно использовать по отдельности и группами. К примеру будем использовать бит 15 (по счету он 16-ый). Договоримся, если бит установлен, значит произошло какое-то действие, например, ГГ убил хотя бы одного горожанина.
var int state; //флаги состояния ГГ, где бит 15 отвечает за убийство горожанина

Запишем маску для флага
00000000000000001000000000000000 bin
00008000 hex
32768 dec
Записывать флаги в виде целых чисел не удобно. Есть такая операция побитовый сдвиг влево и вправо. Например,
1<<15 сдвинет бит 0 установленный в 1 влево на 15 разрядов, так как нам нужно. То есть число
00000000000000000000000000000001 bin
после это операции сдвига станет
00000000000000001000000000000000 bin
таким образом нам удобно записывать бит так
const int killerFlag = 1<<15;
Помнишь GS к такому виду приводит некоторые инты флаговые.

Инициализация в начале ГГ не убийца
state = state & ~killerFlag; //бит 15 сбрасываем в 0, остальные биты не затрагиваем

ГГ убил горожанина
state = state | killerFlag; //бит 15 устанавливаем в 1, остальные биты не затрагиваем

Проверяем, убил ли ГГ горожанина
if(state && killerFlag)
{
//да, убил таки
}
else
{
//не убивал
};

По другому
if(!(state && killerFlag))
{
//не убивал
}
else
{
//убил
};

Немножко двоичной арифметики, и все готово.

Не путай главное логические операции сравнения
! || &&
и логические операции над битами
~ | &

С новым годом! :)
 
Последнее редактирование:
Сверху Снизу