Для начала код, потом пояснения.
Код
!?FU20100; Custom data Extended
!!HE-1&x1=-1:N?x1; Если герой указан как -1, то получить его номер
!!VRy1:Sx1*1170; 1170 байтов на героя - это смещение
!!VRy2&x2<19/x2>=0:Sx2*8+68753305; Смещение одетых артефактов
!!VRy2&x2>=19:Sx2-19*8+68753472; Смещение артефактов в рюкзаке
!!VRy2&x2>=0:+y1; Прибавляем смещение героя - получаем нужный адрес
!!VRy2&x2=-1:S6916828; Если тип артефакта -1 то все предыдущее лишнее, получаем прямой адрес
!!VRy2&x3>=2:-4; Новая фишка, Чтение/запись артефакта, находится на 4 байта "левее"
!!UN|x3=0/x3=2:Cy2/4/?x4; Считываем
!!UN|x3=1/x3=3:Cy2/4/x4; ...или записываем
!?AE0&v7016=0; Реакция на снятие артефакта (НЕ вручную)
!!FU20100:P-1/v999/0/?y1; Получаем Custom data
!!FU20103:P-1/v998/y1/v999/-1/v999;
!?AE1&v7016=0; Одевание артефакта (НЕ вручную)
!!FU20100:P-1/-1/0/?y1;
!!FU20103:P1/v998/y1/v999/-1/-1;
!?CM2; Работаем с артефактами на экране героя
!!CM:H?y1/?y99S?y2/I?y3; Получаем кучу данных о щелчке - куда, как, че за герой?
!!VRv7016|y2=13/y2=10:S0; Если имеет место mouse up, то переводим состояние обратно, в режим ожидания
!!FU|y3<2/y3>44/y2=13:E; Выход если щелкнули не туда или не так, как нужно
!!VRy3:-2; Некоторые операции, в результате которых мы получим в y3 щелкнутый слот в формате AP
!!VRy3&y3>=38:-19;
!!FU20101:Py1/y2/y3; Вызов функции обработки щелчка - x1 - Герой, x2 - тип щелчка (12/14), y3 - слот в формате AP
!?CM3; Тоже самое, только сложнее. Экран встречи героев.
!!CM:H?y1/?y2S?y3/I?y4; Также получаем героев, щелкнутый слот и тип щелчка
!!VRv7016|y3=13/y3=10:S0; Перевод состояния в режим ожидания
!!FU&y4>=65/y4<=88|y4<27/y4>98:E; Выход если щелчок не туда
!!FU&y3=13:E; Или неправильный тип
!!VRy5:S0; Дальше идет ряд преобразований, цель которых - получить в y6 номер артефакта в формате AP
!!VRy5&y4>45/y4<65:S1;
!!VRy5&y4>93/y4<99:S1;
!!VRy6&y5=0/y4<=45:Sy4-27;
!!VRy6&y5=1/y4<=64:Sy4-46;
!!VRy6&y5=0/y4>45:Sy4-70;
!!VRy6&y5=1/y4>64:Sy4-75;
!!FU20101&y5=0:Py1/y3/y6; Вызов нужной функции обработки, в зависимости от зелкнутого героя
!!FU20101&y5=1:Py2/y3/y6;
!?FU20101; Функция обработки щелчка мыши на артефактах
!!VRv7016:S1; Переходим в режим контроля (триггеры AE не вызываются)
!!FU&x2=12/x3>18:E; Если щелчок левой кнопкой на рюкзаке то уходим - ведь мы ничего не одевали/снимали
!!VRy1:Sx3;
!!FU20100:Px1/y1/0/?y10Px1/y1/2/?y11Px1/-1/0/?y12Px1/-1/2/?y13; Получение всех данных об артефактах - как о том, что в руке, так и о том, что в слоте
!!FU20103&x2=14:P0/y11/y10/y1/x1/y1; Если у нас "информационный щелчок" (правой кнопкой), то передать управление пользовательской функции
!!FU&x2=14:E; Все, информационный щелчок обработан. Далее идет обработка одевания/снятия артефакта
!!FU20103&y13=-1/y11>-1:P-1/y11/y10/y1/x1/y1; Если в руках пусто, а в слоте есть арт, то мы этот арт вынимаем (передаем управление пользовательской функции)
!!FU&y13=-1:E; и уходим
!!UN:Ay13/2/?y2; С этого момента и далее: У нас есть артефакт в руках. Проверяем куда его можно вставить (формат P2)
!!FU20102:Py2/y1/?y3; Функция проверки равенства слотов P2 и AP
!!FU&y3=0:E; Выходим если артефакт не подходит в слот
!!FU20103&y11>=0:P-1/y11/y10/y1/x1/y1; Если в слоте что-то было, то это что-то мы вытаскиваем (Контроль пользовательской функции)
!!FU20103:P1/y13/y12/y1/x1/-1; Ну и в любом случае вставляем артефакт из рук (Контроль пользовательской функции)
!?FU20102; Функция проверки равенства слотов P2 и AP. Чисто математическая.
!!VRx3:S0; Комментировать не буду, работает правильно и ладно. Вряд ли тут нужно будет что-то менять.
!!VRx1:-1;
!!VRx3&x1=x2/x1<=6:S1;
!!VRx1:+1;
!!VRx3&x1=x2/x2>=7/x2<=9:S1;
!!VRx3&x1=9/x2>=10/x2<=12:S1;
!!VRx3&x1=9/x2=18:S1;
!!VRx1:+3;
!!VRx3&x1=x2/x2>=13/x2<=17:S1;
!?FU20103; Передача контроля пользовательской функции
!!VRy-100:Sx3; Устанавливаем переменную y-100 на Custom Data текущего артефакта
!!FU20105:Px1/x2/x3/x4/x5; Выхываем пользовательскую функцию
!!FU20100&y-100<>x3:Px5/x6/1/y-100; Если y-100 изменилась, обновляем Custom Data
!!HE-1&x1=-1:N?x1; Если герой указан как -1, то получить его номер
!!VRy1:Sx1*1170; 1170 байтов на героя - это смещение
!!VRy2&x2<19/x2>=0:Sx2*8+68753305; Смещение одетых артефактов
!!VRy2&x2>=19:Sx2-19*8+68753472; Смещение артефактов в рюкзаке
!!VRy2&x2>=0:+y1; Прибавляем смещение героя - получаем нужный адрес
!!VRy2&x2=-1:S6916828; Если тип артефакта -1 то все предыдущее лишнее, получаем прямой адрес
!!VRy2&x3>=2:-4; Новая фишка, Чтение/запись артефакта, находится на 4 байта "левее"
!!UN|x3=0/x3=2:Cy2/4/?x4; Считываем
!!UN|x3=1/x3=3:Cy2/4/x4; ...или записываем
!?AE0&v7016=0; Реакция на снятие артефакта (НЕ вручную)
!!FU20100:P-1/v999/0/?y1; Получаем Custom data
!!FU20103:P-1/v998/y1/v999/-1/v999;
!?AE1&v7016=0; Одевание артефакта (НЕ вручную)
!!FU20100:P-1/-1/0/?y1;
!!FU20103:P1/v998/y1/v999/-1/-1;
!?CM2; Работаем с артефактами на экране героя
!!CM:H?y1/?y99S?y2/I?y3; Получаем кучу данных о щелчке - куда, как, че за герой?
!!VRv7016|y2=13/y2=10:S0; Если имеет место mouse up, то переводим состояние обратно, в режим ожидания
!!FU|y3<2/y3>44/y2=13:E; Выход если щелкнули не туда или не так, как нужно
!!VRy3:-2; Некоторые операции, в результате которых мы получим в y3 щелкнутый слот в формате AP
!!VRy3&y3>=38:-19;
!!FU20101:Py1/y2/y3; Вызов функции обработки щелчка - x1 - Герой, x2 - тип щелчка (12/14), y3 - слот в формате AP
!?CM3; Тоже самое, только сложнее. Экран встречи героев.
!!CM:H?y1/?y2S?y3/I?y4; Также получаем героев, щелкнутый слот и тип щелчка
!!VRv7016|y3=13/y3=10:S0; Перевод состояния в режим ожидания
!!FU&y4>=65/y4<=88|y4<27/y4>98:E; Выход если щелчок не туда
!!FU&y3=13:E; Или неправильный тип
!!VRy5:S0; Дальше идет ряд преобразований, цель которых - получить в y6 номер артефакта в формате AP
!!VRy5&y4>45/y4<65:S1;
!!VRy5&y4>93/y4<99:S1;
!!VRy6&y5=0/y4<=45:Sy4-27;
!!VRy6&y5=1/y4<=64:Sy4-46;
!!VRy6&y5=0/y4>45:Sy4-70;
!!VRy6&y5=1/y4>64:Sy4-75;
!!FU20101&y5=0:Py1/y3/y6; Вызов нужной функции обработки, в зависимости от зелкнутого героя
!!FU20101&y5=1:Py2/y3/y6;
!?FU20101; Функция обработки щелчка мыши на артефактах
!!VRv7016:S1; Переходим в режим контроля (триггеры AE не вызываются)
!!FU&x2=12/x3>18:E; Если щелчок левой кнопкой на рюкзаке то уходим - ведь мы ничего не одевали/снимали
!!VRy1:Sx3;
!!FU20100:Px1/y1/0/?y10Px1/y1/2/?y11Px1/-1/0/?y12Px1/-1/2/?y13; Получение всех данных об артефактах - как о том, что в руке, так и о том, что в слоте
!!FU20103&x2=14:P0/y11/y10/y1/x1/y1; Если у нас "информационный щелчок" (правой кнопкой), то передать управление пользовательской функции
!!FU&x2=14:E; Все, информационный щелчок обработан. Далее идет обработка одевания/снятия артефакта
!!FU20103&y13=-1/y11>-1:P-1/y11/y10/y1/x1/y1; Если в руках пусто, а в слоте есть арт, то мы этот арт вынимаем (передаем управление пользовательской функции)
!!FU&y13=-1:E; и уходим
!!UN:Ay13/2/?y2; С этого момента и далее: У нас есть артефакт в руках. Проверяем куда его можно вставить (формат P2)
!!FU20102:Py2/y1/?y3; Функция проверки равенства слотов P2 и AP
!!FU&y3=0:E; Выходим если артефакт не подходит в слот
!!FU20103&y11>=0:P-1/y11/y10/y1/x1/y1; Если в слоте что-то было, то это что-то мы вытаскиваем (Контроль пользовательской функции)
!!FU20103:P1/y13/y12/y1/x1/-1; Ну и в любом случае вставляем артефакт из рук (Контроль пользовательской функции)
!?FU20102; Функция проверки равенства слотов P2 и AP. Чисто математическая.
!!VRx3:S0; Комментировать не буду, работает правильно и ладно. Вряд ли тут нужно будет что-то менять.
!!VRx1:-1;
!!VRx3&x1=x2/x1<=6:S1;
!!VRx1:+1;
!!VRx3&x1=x2/x2>=7/x2<=9:S1;
!!VRx3&x1=9/x2>=10/x2<=12:S1;
!!VRx3&x1=9/x2=18:S1;
!!VRx1:+3;
!!VRx3&x1=x2/x2>=13/x2<=17:S1;
!?FU20103; Передача контроля пользовательской функции
!!VRy-100:Sx3; Устанавливаем переменную y-100 на Custom Data текущего артефакта
!!FU20105:Px1/x2/x3/x4/x5; Выхываем пользовательскую функцию
!!FU20100&y-100<>x3:Px5/x6/1/y-100; Если y-100 изменилась, обновляем Custom Data
Итак, теперь возможности.
Во-первых, как и прежде, Custom data Extended.
!!FU20100:Px1/x2/x3/x4;
x1 - Номер героя (-1 - текущий)
x2 - Номер артефакта (формат AP) -1 - тот, что в руках
x3 - действие
** 0 - Считывание Custom Data
** 1 - Запись Custom data
** 2 - Считывание номера артефакта
** 3 - Запись номера артефакта
x4 - значение (для x3=0 и x3=2 должно быть "?...", то есть считывание)
Примечание: Для свитка, в Custom Data хранится номер заклинания. Смена этого номера ведет к изменению заклинания
Как мы видим, здесь прибавилась возможность работать не только с данными артефакта, но и с самими артефактами.
Во-вторых, новая возможность. Даже несколько. Когда происходят действия с артефактами, вызывается функция 20105, которую должен описать пользователь. Эту функцию рекомендуется использовать вместо !?AE так как:
Во-первых, она не вызывается шесть раз при смене артефакта Экономит время процессора. Во-вторых, она позволяет работать с Custom data напрямую. Ну и в третьих, она еще может использоватся для создания хинтов по артефактам (при щелчке правой кнопкой мыши)
Функция вызывается со следующими параметрами:
х1 - Действие с артефактом
** -1 - Снятие артефакта
** 0 - Всплывающее сообщение
** 1 - Одевание артефакта
х2 - Номер артефакта
х3 - Custom data артефакта.
Примечание. Также, переменная y-100 устанавливается в Custom data артефакта. Изменение переменной y-100 внутри этой функции влечет за собой изменение Custom data.
x4 - Слот артефакта (формат AP)
х5 - номер героя-владельца (используйте его при обращении !!HE, так как значение -1 будет глючить при вызове на экране встречи героев)
Итак, для чего это надо?
Вспомним скрипт Living Scroll. Там при щелчке правой кнопкой мыши на свитке выдавался нестандартный текст. Однако реализация этого текста была достаточно длинной. Теперь же это можно уместить в 2-3 строчки:
!?FU20105&x1=0/x2=162; Показ сообщения для меча номер 162
!!CM:R0; Отменяем стандартную реакцию
!!IF:Q1/31/x3/4^Этот меч увеличивает вашу атаку на %X3^; Отображаем динамический нестандартный текст.
ВСЕ!!! При щелчке правой кнопкой на меч будет отображатся нестандартный текст. Подразумевается, что Custom data меча хранит бонус к атаке. Работает на экране героя и встречи героев.
Это еще не все. Реализация бонуса для меча также теперь умещается в три строчки!
!?FU20105&x1<>0/x2=162; НЕ показ сообщения, действие с артефактом ном. 162
!!VRy1:Sx3*x1; Бонус к атаке. Если меч снимаем, будет отрицательным.
!!HEx5:Fdy1/d/d/d; Плюсуем герою.
ВСЕ!!! Работает также на экране героя и встречи героев.
Напоминаю, что чтобы сменить Custom data внутри функции !?FU20105, достаточно просто поменять переменную y-100.
Теперь по повду скрипта с пузырем дракона.
Теперь нет ничего проще! Гляди:
Код
!?CM2; Щелчок на экране героя
!!FU20100:P-1/-1/2/?y1; Что за арт у нас в руках?
!!FU&y1<>127:E; Не пузырек дракона? Сваливаем.
* Тут проверка куда мы щелкнули. Если щелкнули не на существо или не на нужное существо тоже сваливаем.
* Здесь мы делаем что-то с существом
!!FU20100:P-1/-1/3/-1; Убираем артефакт нафик
!!UN:R5/0/0; Восстанавливаем курсор на обычный
!!FU20100:P-1/-1/2/?y1; Что за арт у нас в руках?
!!FU&y1<>127:E; Не пузырек дракона? Сваливаем.
* Тут проверка куда мы щелкнули. Если щелкнули не на существо или не на нужное существо тоже сваливаем.
* Здесь мы делаем что-то с существом
!!FU20100:P-1/-1/3/-1; Убираем артефакт нафик
!!UN:R5/0/0; Восстанавливаем курсор на обычный
Все.
З.Ы. Тестировалось только под WOG 3.58 и то недолго. Времени 5 часов, лягу ка я спать, если кто поможет протестировать буду благодарен, иначе сам завтра после работы.
З.З.Ы. Система использует v7016, для длительного хранения.