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