Фух, блин. Наконец-то я решил эту хрень. Cлава ЭРЕ и Берсеркеру!
Перепробовав кучу комбинаций из !?BG, !?BG1 и !?FU77007 (всё никак не удавалось корректно получить ходящую сторону) довёл код до следующего безобразия:
*Особые свойства Назгула - наращивает ХП каждый раз, как противник струсит.
!?BA52&999; битва в присутствии человека
!!VRz2:S@ERT[15]@; секция Battle Log
!!VRz1:S^0^;
!!UN:N5/1/1/2; очистить счётчик лога
!?FU@Battle: Before Action@;
!!IF:V2/0; сбросить флаг 2
!!VRz2:S@ERT[15]@; секция ини
!!UN:N6/1/1/2; прочесть
!!VRy1:Vz1;
!!FU@Функция[18]@:P2/?v1; получить кол-во строк
!!FU|v1=y1/v1=0:E; если не изменилось
!!VRz1:M3/v1;
!!UN:N5/1/1/2; записать кол-во строк для последующих действий
!!VRv1:-1; отнять 1 для корректности
!!VRz2:S@ERT[16]@; получить хозяина стека из ини
!!UN:N6/1/1/2;
!!VRv3:Vz1;
!!FU@Функция[18]@:P0/v1/10; получить последнюю строку в логе
!!VRz10:U@ERT[409]@; есть ли в строке слово "панике"
!!IF&1:V2/1; если есть - установить флаг 2
!!VRz10:U@ERT[410]@; есть ли слово "страхе"
!!if&-1/-2:E; выход, если ни того, ни другого
!!VRz10:U@ERT[407]@; есть ли в строке слово "следующего"
!!FU&-1:E;
!!VRv1:-1;
!!FU@Функция[18]@:P0/v1/10; получить предпоследнюю строку в логе
!!VRz10:U@ERT[409]@; есть ли в строке слово "панике"
!!IF&1:V2/1; если есть - установить флаг 2
!!VRz10:U@ERT[410]@; есть ли слово "страхе"
!!FU&-1/-2:E;
!!en;
!!VRv1&v3=1:C0/21; запустить цикл по стекам стороны, противоположной струсившему стеку: v1 - начало, v2 - конечное значение
!!VRv1&v3=0:C21/42;
!!BMv1:T?y1 N>0; получить тип и кол-во существ в стеке
!!if&y1=128/1; если Назгул и стек не мёртв
!!SN:P@ERT[411]@; проиграем звук
!!BMv1:V50 Hd1; прибавим очко жизни, проиграем анимацию
!!VRz-1:S@ERT[408]@;
!!BU:Mz-1; добавить сообщение в лог битвы
!!en; 17
!!VRv1:+1; следующий стек
!!SN&v1<v2:G28; если конечное значение цикла не достигнуто - прыжок на строку 12
!?FU@Battle: Before Action@; этот триггер должен идти обязательно ПОСЛЕ первого Before Action
!!SN:X?y1/?y2;
!!BMy1:I?y2;
!!VRz2:S@ERT[16]@;
!!VRz1:M3/y2;
!!UN:N5/1/1/2; записать ходящую сторону в ИНИ
*Функция ShadowTheAge для чтения строк из лога битвы
*Использование:
*x1 - действие: 0 - чтение, 1 - запись, 2 - подсчитать количество строк лога, 3 - очистить лог
*х2 - номер строки в логе от 0.
*x3 - номер z переменной куда/откуда читать.
!?FU@Функция[18]@;
!!UN:C5613845/4/?y1;
!!VRy1:+672;
!!UN:Cy1/4/?y2;
!!VRy2:+88;
!!VRy3:Sy2+4;
!!UN:Cy2/4/?y4 Cy3/4/?y5;
!!UN&x1=3:Cy3/4/y4;
!!VRx2&x1=2:Sy5-y4:4;
!!FU&x1>1:E;
!!VRy6:Sx2*4+y4;
!!FU&y6>=y5:E;
!!UN:Cy6/4/?y7;
!!VRy7:+4;
!!UN:Cy7/4/?y8;
!!VRy9:Sx3*512+9597416;
!!DO@Функция[19]@/0/511/1:Py8/y9/x1;
!?FU@Функция[19]@;
!!VRy1&x3=0:Sx1+x16;
!!VRy2&x3=0:Sx2+x16;
!!VRy1&x3=1:Sx2+x16;
!!VRy2&x3=1:Sx1+x16;
!!UN:Cy1/1/?y3;
!!UN:Cy2/1/y3;
!!VRx16&y3=0:S600;
Оттестировал сотни раз - вроде не глючит. При попытках использования разновидностей BG были такие траблы, как наращивание ХП твоим Назгулом при панике твоего же отряда. Или одноразовое наращивание при панике "по цепочке".
Если видны какие-то недочёты или есть предложения по оптимизации - пожалуйста, сообщите.
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery