Доделал и оттестил скрипт кристального дракона. Теперь сопротивление героя работает, а кристаллы прибавляются, даже если драконы стоят на гарнизонах и в шахтах.
ZVSE
;Кристальный дракон.
!#MA : F133/31050 I133/42066 X133/d+131056;Делаем кристального дракона неживым и неподверженным боевому духу и страху и изменяем его AI Value и Fight Value.
;Настройка описания для кристального дракона.
!?PI;Триггер на пост-инструкцию.
!!VRz754 : S^Голем. Сопротивление магии 50%. Производит кристаллы.^;Записываем описание кристального дракона в переменную.
!!UN : G1/133/2/z754;Установить описание для кристального дракона.
;Убираем гномье сопротивление.
!?MR2;Когда срабатывает гномье сопротивление.
!!MR : M?y-1;Запоминаем, у кого срабатывает сопротивление.
!!MR&y-1=133 : Fd-20;Если сопротивление сработало у кристальных драконов, убираем природный шанс на его срабатывание.
;Добавляем сопротивление, как у големов.
!?MR1;При срабатывании големового сопротивления.
!!MR : M?y-1 D?y-2;Запоминаем, у кого срабатывает сопротивлениеи его урон.
!!VRy-2 : Sy-2:2;Делим запомненный урон на 2.
!!MR&y-1=133 : Fy-2;Если сопротивление сработало у кристальных драконов, изменяем урон на новое, (уменьшенное в 2 раза) значение.
;Прибавка кристаллов по новой формуле.
!#TM65 : S8/999/7/255;Таймер каждому игроку на первый день каждой недели, начиная со второй.
!?TM65;При срабатывании таймера.
!!VRv6000 : S0;Очищаем переменную для счёта кол-ва кристальных драконов в шахтах и гарнизонах.
!!VRv6001 : S0;Очищаем переменную для счёта общего кол-ва кристальных драконов.
!!FU9003 : P;Вызываем функцию счёта кристальных драконов у героев текущего игрока.
!!FU9006 : P;Вызываем функцию счёта кристальных драконов в городах текущего игрока.
!!FU9009 : P;Вызываем функцию счёта кристальных драконов в шахтах текущего игрока.
!!FU9012 : P;Вызываем функцию счёта кристальных драконов в гарнизонах текущего игрока.
!!OW&v6001>0 : R-1/4/d-3;Забираем 3 кристалла у игрока, если у него есть кристальные драконы в городах или у героев.
!!VRv6001 : Sv6001+v6000;Прибавляем переменную для счёта кол-ва кристальных драконов в шахтах и гарнизонах к переменной для счёта общего кол-ва кристальных драконов.
!!FU9001 : Pv6001/?v6001;Вызываем функцию, вычисляющую целочисленный квадратный корень из числа кристальных драконов (с округлением вниз).
!!VRv6001 : Sv6001*5:2;Умножаем целочисленный квадратный корень из числа кристальных драконов на 2,5.
!!OW : R-1/4/dv6001;Прибавляем кристаллы за кристальных драконов.
;Функции счёта кристальных драконов в гарнизонах текущего игрока.
!?FU9012;Функция подготовки к счёту кристальных драконов в гарнизонах текущего игрока.
!!OW : C?y1;Считываем цвет игрока.
!!VRv6002 : S-1;Подготавливаем x-координату к поиску координат гарнизонов.
!!UN : U33/-1/?y2;Считаем количество гарнизонов на карте.
!!DO9013/1/y2/1 : Py1/33;Запускаем цикл, находящий и проверяющий все гарнизоны на карте.
!!VRv6002 : S-1;Подготавливаем x-координату к поиску координат гарнизонов.
!!UN : U219/-1/?y2;Считаем количество гарнизонов на карте.
!!DO9013/1/y2/1 : Py1/219;Запускаем цикл, находящий и проверяющий все гарнизоны на карте.
!?FU9013;Функция поиска и проверки гарнизона.
!!UN : Ux2/-1/-1/6002;Находим координаты гарнизона.
!!GRv6002/v6003/v6004 : O?y1;Считываем цвет владельца гарнизона.
!!DO9014/0/6/1&y1=x1 : P;Если владелец гарнизона - текущий игрок, запускаем цикл, считающий кристальных драконов в охране этого гарнизона.
!?FU9014;Функция вычисления кол-ва кристальных драконов в слоте охраны гарнизона.
!!GRv6002/v6003/v6004 : Gx16/?y1/?y2;Считываем информацию о типе существ в слоте охраны гарнизона и их количестве.
!!VRv6000&y1=133 : Sv6000+y2;Если существа - кристальные драконы, то прибавляем их количество к переменной для счёта кол-ва драконов в шахтах и гарнизонах.
;Функции счёта кристальных драконов в шахтах текущего игрока.
!?FU9009;Функция подготовки к счёту кристальных драконов в шахтах текущего игрока.
!!OW : C?y1;Считываем цвет игрока.
!!VRv6002 : S-1;Подготавливаем x-координату к поиску координат шахт.
!!UN : U53/-1/?y2;Считаем количество шахт на карте.
!!DO9010/1/y2/1 : Py1/53;Запускаем цикл, находящий и проверяющий все шахты на карте.
!!VRv6002 : S-1;Подготавливаем x-координату к поиску координат шахт.
!!UN : U220/-1/?y2;Считаем количество шахт на карте.
!!DO9010/1/y2/1 : Py1/220;Запускаем цикл, находящий и проверяющий все шахты на карте.
!?FU9010;Функция поиска и проверки шахты.
!!UN : Ux2/-1/-1/6002;Находим координаты шахты.
!!MNv6002/v6003/v6004 : O?y1;Считываем цвет владельца шахты.
!!DO9011/0/6/1&y1=x1 : P;Если владелец шахты - текущий игрок, запускаем цикл, считающий кристальных драконов в охране этой шахты.
!?FU9011;Функция вычисления кол-ва кристальных драконов в слоте охраны шахты.
!!MNv6002/v6003/v6004 : Mx16/?y1/?y2;Считываем информацию о типе существ в слоте охраны шахты и их количестве.
!!VRv6000&y1=133 : Sv6000+y2;Если существа - кристальные драконы, то прибавляем их количество к переменной для счёта кол-ва драконов в шахтах и гарнизонах.
;Функции счёта кристальных драконов в городах текущего игрока.
!?FU9006;Функция подготовки к счёту кристальных драконов в городах текущего игрока.
!!OW : C?y1;Считываем цвет игрока.
!!UN : U98/-1/?y2;Считаем количество городов на карте.
!!VRy2 : Sy2-1;Считаем номер последнего города.
!!DO9007/0/y2/1 : Py1;Запускаем цикл, проверяющий все города на карте.
!?FU9007;Функция определения хозяина города и проверки слотов его гарнизона или армии гарнизонного героя.
!!CA0/x16 : O?y1;Узнаём цвет хозяина города.
!!CA0/x16 : H0/?y2;Проверяем, нет ли героя на гарнизоне города, если есть, запоминаем его номер.
!!DO9008/0/6/1&x1=y1/y2<0 : Px16;Если хозяин города - текущий игрок, и на гарнизоне городе нет героя, запускаем цикл, считающий кристальных драконов в городе.
!!DO9005/0/6/1&x1=y1/y2>=0 : Py2;Если хозяин города - текущий игрок, и на гарнизоне города городе есть герой, запускаем цикл, считающий кристальных драконов в армии этого героя.
!?FU9008;Функция вычисления кол-ва кристальных драконов в слоте гарнизона города.
!!CA0/x1 : M2/x16/?y1/?y2;Считываем информацию о типе существ в слоте гарнизона города и их количестве.
!!VRv6001&y1=133 : Sv6001+y2;Если существа - кристальные драконы, то прибавляем их количество к переменной для счёта общего кол-ва драконов.
;Функции вычисления кол-ва кристальных драконов у героев текущего игрока.
!?FU9003;Функция составления списка героев игрока.
!!OW : O-1/?y9/?y1/?y2/?y3/?y4/?y5/?y6/?y7/?y8;Записываем номера активных героев игрока в переменные.
!!DO9004/1/y9/1 : Py1/y2/y3/y4/y5/y6/y7/y8;Запускаем цикл, проверяющий героев игрока.
!?FU9004;Функция проверки слотов армии героя.
!!DO9005/0/6/1 : Pxx16;Запускаем цикл, проверяющий количество кристальных драконов в слотах армии героя.
!?FU9005;Функция вычисления кол-ва кристальных драконов в слоте армии героя.
!!HEx1 : C0/x16/?y1/?y2;Считываем информацию о типе существ в слоте армии героя и их количестве.
!!VRv6001&y1=133 : Sv6001+y2;Если существа - кристальные драконы, то прибавляем их количество к переменной для счёта общего кол-ва драконов.
;Функции вычисления целочисленного квадратного корня числа (с округлением вниз).
!?FU9001;Функция настройки и запуска цикла вычисления целочисленного квадратного корня числа.
!!VRy1 : Sx1+2;
!!DO9002/1/y1/2 : Py1/?y1/x1;Настраиваем первую разность и запускаем цикл, вычисляющий целочисленный квадратный корень числа.
!!VRx2 : Sy1;Возвращаем значение целочисленного квадратного корня.
!?FU9002;Функция шага вычисления целочисленного квадратного корня числа.
!!VRx3 : Sx3-x16;Отнимаем текущее нечётное число от текущей разности, что даёт новую текущую разность.
!!VRx2&x3<0 : Sx16:2;Если текущая разность отрицательна, записываем половину текущего нечётного числа (с округлением вниз) в переменную возвращаемого значения.
!!VRx16&x3<0 : Sx1;Если текущая разность отрицательна, завершаем цикл.