Взаимодействие между НПЦ и другими персонажами
Для взаимодействия между персонажами используется метод – 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 игровых минут.