Взаимодействие между НПЦ и
другими персонажами
Для взаимодействия между персонажами используется метод –
Critter::SendMessage.
В параметрах функции необходимо указать:
- Уникальный номер сообщения. Номер сообщения устанавливается по
усмотрению разработчика скрипта и используется для идентификации
этого сообщения.
- Передаваемое значение. Например, ID персонажа, которого следует
атаковать.
- Кому отсылается сообщение.
Когда персонаж принимает сообщение, у него происходит событие
CRITTER_EVENT_MESSAGE.
При инициализации персонажа необходимо задать функцию,
срабатываемую при данном событии, в ней необходимо выполнять
ответные действия. Сообщение принимается в момент его отправки.
При организации сложной ситуации, в которой участвует множество
персонажей и у каждого есть своя роль, используйте поле Critter::NpcRole.
Пример написания скрипта с использованием функции Critter::SendMessage.
В этом примере организован диалог между двумя НПЦ, который будет
происходить каждый день ровно в 12 часов.
#include
"_macros.fos"
#define NUM_OF_MSG
(300) // Номер сообщения
#define ROLE_NPCA
(150)
#define ROLE_NPCB
(151)
string[]
DialogsForNpcA = {"О!
Привет.","Как
дела?","А чего
так?","Уууу...",
"Да уж,
бывает...", "Ну ладно, пойду
я."};
string[]
DialogsForNpcB = {"Привет.","Ой,
плохи мои дела. Совсем плохи.",
"Да опять в казино
все свои деньги продул.","","",
"Пока."};
bool
DialogsProcess = false;
void
_CritterAInit(
Critter& npc,
bool firstTime)
{
}
void
_CritterBInit(
Critter& npc,
bool firstTime)
{
}
{
if(num !=
NUM_OF_MSG) return;
DialogsProcess = true;
}
uint e_StartDialog(uint[]@ values)
{
if(not
valid(npcA)) return 0;
if(npcA.StatBase[
ST_VAR1]
== -1)
return 20*60;
return
12*60*60;
}
uint e_SayDialog(uint[]@ values)
{
if(not
valid(npc)) return 0;
if(not
DialogsProcess) return 0;
{
DialogsProcess=false;
return 0;
}
string[]@
dialogs;
if(npc.StatBase[
ST_NPC_ROLE]
== ROLE_NPCA) @dialogs = @DialogsForNpcA;
else
if(npc.StatBase[
ST_NPC_ROLE]
== ROLE_NPCB) @dialogs = @DialogsForNpcB;
else
return 0;
if(uint(npc.StatBase[ST_VAR0]) >=
dialogs.
length())
return 0;
return
REAL_SECOND(4);
}
При этом, диалог между НПЦ будет выглядеть так:
A: О! Привет.
B: Привет.
A: Как дела?
B: Ой, плохи мои дела. Совсем плохи.
A: А чего так?
B: Да опять в казино все свои деньги продул.
A: Уууу...
A: Да уж, бывает...
A: Ну ладно, пойду я.
B: Пока.
Диалог будет происходить при условии, что:
- НПЦ видят друг друга;
- Во время начала диалога контекст обоих НПЦ будет свободен;
Если во время начала диалога оба NPC будут мертвы или будут
выполнять запланированные действия, то начало диалога будет
отложено на 20 игровых минут.