Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ERM Artifact Manager
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды > Скрипты
ShadowTheAge
Обновление: Добавил комментарии. Предлагаю модераторам сменить название темы на "ERM Artifact Manager", ибо теперь одиночная функция для работы с Custom data выросла в небольшую систему, в которой пользовательские данные артефакта лишь одна из ее функций.

Для начала код, потом пояснения.

Код
!?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


Итак, теперь возможности.
Во-первых, как и прежде, 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 так как:
Во-первых, она не вызывается шесть раз при смене артефакта laugh.gif Экономит время процессора. Во-вторых, она позволяет работать с 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; Восстанавливаем курсор на обычный


Все.
З.Ы. Тестировалось только под WOG 3.58 и то недолго. Времени 5 часов, лягу ка я спать, если кто поможет протестировать буду благодарен, иначе сам завтра после работы.
З.З.Ы. Система использует v7016, для длительного хранения.
Bes
pray.gif
классно, именно этого мне и не хватало, когда заделывал дыры в скрипте "Пузырёк с кровью Дракона (улучш.)"
good.gif

Одно уточнение про это...
Цитата
Если считывать данные в триггере !?AE (определять действие арта в момент одевания/снятия), то помните, что когда снимаешь артефакт, то нужно проверять данные артефакта в слоте (!!FU20100:P-1/v999/0/?v#)
Этот триггре вроде не срабатывает когда кладёшь(вынимаешь) арт из рюкзака.
unsure.gif
ShadowTheAge
Ну, эта "софтверная" проблема решаема. Просто я вчера закончил исследования и создание тестовой карты к полвторого утра (см. время сообщения), поэтому мне было уже очень лениво делать что-либо еще.

А вообще стоит сделать примочку - !?АЕ триггер, который, будучи поставленным прежде других !?АЕ триггеров устанавливает переменную (например v997) на пользовательскую переменную текущего рабочего артефакта - сведет на нет все проблемы с одеванием/снятие артефактов.

Сейчас я на работе, приду домой сделаю если спать не завалюсь.
Bes
Цитата
Ну, эта "софтверная" проблема решаема
Так всё же, как это исправить, может всё же покажете способ ввиде примочки к вашей ф-ции... sorry.gif (очень надо)
Миханик
насколько я понимаю, это должно выглядеть так:
Код
ZVSE
!?AE0;
!!FU20100:P-1/v999/0/?v997;
!?AE1;
!!FU20100:P-1/-1/0/?v997;
здесь учитывается, что
Цитата(ShadowTheAge @ 15 Sep 2007, 01:39)
когда снимаешь артефакт, то нужно проверять данные артефакта в слоте (!!FU20100:P-1/v999/0/?v#), а если одеваешь - то в руках (!!FU20100:P-1/-1/0/v#).
да, и ещё никто не гарантирует, что v997 не используется в каком-нибудь триггере !?AE как временная переменная.
ShadowTheAge
С ижу с мобильника длинный текст написать не могу. Рам есть еще один нюанс. Решение пришлю только вечером даже ночью. Нюанс связан с заменой одного арта на другой. А для чего тебе? Для пузырька дракона?
Миханик
Цитата(ShadowTheAge @ 24 Sep 2007, 17:24)
Там есть еще один нюанс. (...) Нюанс связан с заменой одного арта на другой.
в смысле, эту?
Цитата(Erm Help) smile.gif
If you change one artifact to another, it produces some extra triggers call. Here it is:
   1. AE0 (prev)
   2. AE1 (prev)
   3. AE0 (prev)
   4. AE1 (new)
   5. AE0 (new)
   6. AE1 (new)
а что здесь заковырного? ничего не вижу, кроме того что и так есть.
***
ага. ясно. конечно, так гораздо проще. я просто имел ввиду, что новых проблем не создаётся, но убирание старой проблемы - это, конечно, большой +.
Bes
Для пузырька драконаДля него, родимого yes.gif

Просто я там вроде всё учёл, а вот ситуацию когда кладётся левый арт на пузырёк в рюкзаке, то здесь у меня, к сожалению, никак не выходило следить за этим... хотя пузырёк на пузырёк таким способом положить у игрока уже не получится (это я смог запретить)

А так бы я через эту ф-цию, при подъёме левого арта записывал бы что-то, что не давало бы потом ложить на пузырёк в рюкзаке...

LineAger, я пока не смотрел ваш вариант ,но как найду время сразу проверю и отпишусь, спасибо!
ShadowTheAge
Ну, только учитывая что при некоторых вызовах AE артефакт находится в руках, а при других в слоте. В общем факт, что не пашет laugh.gif Тестовую карту если посмотреть то видно, что замена одного меча на другой дает хлюк laugh.gif)
ShadowTheAge
Имеется обновлние. Большое. См. первый пост.
ShadowTheAge
Еще раз обновил. Убрал баг с нажатием артефактом на кнопку выхода и любыми опреациями на экране встречи героев (в обоих случаях статус системы не восстанавливался, то есть все подобраные и автоодетые после этого артефакты не вызывали реакции)

Добавил комментарии если кому-то нужно будет модифицировать или просто понять как работает.
MasterOfPuppets
Адреса структур, используемые ShadowTheAge в FU20100, на самом деле динамические и разнятся даже между ТЕ и ЭРОй.
Оптимизировал, добавив привязку к указателю. В результате скрипт стал пригоден для любой версии, даже без UN:V. :-)

!?FU20100;
!!UN:C6933756/4/?y100;
!!VRy100:+3201;
!!VRy100&x2>18:+15;
!!HE-1&x1=-1:N?x1;
!!VRy1:Sx1*1170;
!!VRy2:Sx2*8+y100;
!!VRy2&x2>-1:+y1;
!!VRy2&x2=-1:S6916828;
!!VRy2&x3>1:-4;
!!UN|x3=0/x3=2:Cy2/4/?x4;
!!UN|x3=1/x3=3:Cy2/4/x4;
MasterOfPuppets
Указатель на начало структуры игроков использовал потому, что так и не нашёл нормального указателя на начало геройских структур, зато таблица игроков всегда идёт перед ними. Есть, правда, "странные" указатели (вроде 00A4AAF4h или 027F9970h), указывающие в ТЕ на одного героя, а на ЭРЕ - на другого на одной и той же карте.
SAG19330184
может кто нибудь кинуть в меня адресами стартовых героев?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.