Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

DF2 :: ФОРУМЫ _ Скрипты _ Артефакты

Автор: Docent Picolan 21 Mar 2008, 00:15

вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове: biggrin.gif

Дъякон
0:06:14 Данный скрипт позволяет добавить 3200 новых артов. Скрипт добавляет новый бланковый арт, св-ва которого можно задать при помощи ЕРМ. Но нельзя занимать переменные z800-z1000.

Код
ZVSE
_WARNING_#1=IMPORTANT! This file is not in a plain text format. NEVER use any editor except ERM_S for making any kind of changes!
ERMS_PoweredBy=ERM Scripter v. 2004.10.5.945
ERMS_ScriptDate=20.3(March).2008
!?PI;
!!FU1:P;
!!FU3:Px1; x1 - номер добавляемого арта с 170 и до 3370
!?FU1;
!!VRy1:S8088992;
!!VRy2:S10007016;
!!DO2/1/5440/1:Py1/y2;
!?FU2;
!!UN:Cx1/1/?y1;
!!UN:Cx2/1/y1;
!!VRx1:+1;
!!VRx2:+1;

!?FU3;
!!UN:C6687592/4/10007016;
!!VRy1:S8094336;
!!VRy2:Sx1*32+10007016;
!!DO4/1/50/1:Py1/y2;
!?FU4;
!!UN:Cx1/1/?y1;
!!UN:Cx2/1/y1;
!!VRx1:+1;
!!VRx2:+1;

Чтобы отобразить арт - необходимо добавить его изображение в деф артов

Скрипт работает под ТЕ. Но можно переделать чтоб работал и под ВОГ. Все в Ваших руках

0:07:05 З.Ы. Естественно номера функций в скрипте нужно подправить, чтоб не было конфликта с скриптами ВОГ

Добавлено ([mergetime]1206047722[/mergetime]):
PSS: Не обращайте внимание на описание добавляемых артов. Описание берется с арта №167. Но арт добавляется абсолютно новый/Описание можно после изменить

Автор: <Fenix> 21 Mar 2008, 00:20

3200? Не слишком много?

Автор: Docent Picolan 21 Mar 2008, 00:22

ты имел ввиду мало.. biggrin.gif но на наш век хватит smile.gif

Автор: hippocamus 21 Mar 2008, 01:06

УРА!!!
Всё! Нужно доставать арты из Морровинда. Там есть весьма прикольные.

Автор: <Fenix> 21 Mar 2008, 11:05

smile.gif

Автор: Docent Picolan 21 Mar 2008, 15:38

попрошу не обсуждать кого почему и когда забанили. там дело тёмное smile.gif

Автор: FBX 20 Aug 2008, 12:55

Вот ведь коварные колдуны, взломали все-таки...

Автор: major 17 Sep 2008, 14:00

Как изменить параметры нового арта, если !!UN:A ругается, мол, такого артефакта не бывает, в частности, его описание и название?

Автор: FakerNeo 21 Sep 2008, 03:27

Через UN:C, либо снимать ограничение на кол-во артов в ехе

Автор: sergroj 21 Sep 2008, 18:12

Проще через UN:C - для снятия надо расшираять таблицу и менять границу пары циклов. Но, конечно, UN:C изменит это в рамках всей игры, а не только карты.

Автор: Master Of Puppets 15 Apr 2009, 22:52

Я в exe дуб дубом, но в этом скрипте, я так понял, происходит копирование блока памяти, относящегося к арту-167, в некое свободное место (видимо, предназначенное для z-переменных 800-1000) - как продолжение ряда. Сколько раз скопировал - столько и артов. Но в результате все "новые" артефакты надеваются на тот же слот, что и арт-167. Если в artraits.txt этот слот поменять, то он изменится и у всех "клонов".
Так как можно и можно ли индивидуально поменять слот "новому" артефакту?
Это единственное, что меня интересует. Название и описание можно и по кликам определять.

Автор: gamecreator 16 Apr 2009, 01:07

конечно можно. на основании уже существующих примеров ищешь оффсет в записи арта что соответствует слоту и пишешь туда свое

Автор: major 16 Apr 2009, 17:59

Хмм... могу выложить мои наработки, основанные на исследованиях Сергроя и Дьякона. Насколько все работает я уж и не помню, но раньше я этими функциями пользовался. Это кажется для ТЕ. Итак

Код
** определяем адрес переменной z1
!#UN:A0/9/?y10; [backup Z var number]
!#UN&y10<0:A0/9/?z-1; [backup string (3.59)]
!#UN:A0/9/1; [art0.Name = z1]
!#UN:C6687592/4/?y1; [get artifacts array address]
!#UN:Cy1/4/?v4138; [get art0.Name which is z1 address. Name goes first in art info, so y1 points to art0.Name]
[v4138 holds address of z1 now]
!#UN&y10>=0:A0/9/y10; [resture Z var number]
!#UN&y10<0:A0/9/z-1; [restore string (3.59)]

** пример заполнение артефактами 171-177
** используются переменные z280-z296
!?PI;
!!VRv4139:S280 -1 *512 +v4138;
!!VRv4140:S295 -1 *512 +v4138;
!!FU9126:P;
* x1 - номер арта (с 171 и до 239), x2 - ссылка название, x3 - стоимость
* x4 - позиция на теле (0-рюкзак, 1-голова, 2-плечи, 3-шея, 4-правая рука
* 5-левая рука, 6-торс, 7-кольцо, 8-ноги, 9-разное)
* x5 - класс артефакта (1-грааль, 2-сокровище, 4-малый, 8-великий, 16-реликвия)
* x6 - ссылка описание, x7 - номер сборного артефакта (>12)
* x8 - часть сборного артефакта №>12, x9 - дает ли заклинание (0-нет, 1-да)
** пояснение z940 - имя артефакта 171, z941 - описание 171, z942 - имя артефакта 172, z943 - описание 172 и т.д.
!!VRy-1:S940 -1 *512 +v4138;
!!VRy-2:S941 -1 *512 +v4138;
!!FU9128:P171/y-1/5000/1/4/y-2/-1/-1/1;
!!VRy-1:S942 -1 *512 +v4138;
!!VRy-2:S943 -1 *512 +v4138;
!!FU9128:P172/y-1/5000/6/4/y-2/-1/-1/0;
!!VRy-1:S944 -1 *512 +v4138;
!!VRy-2:S945 -1 *512 +v4138;
!!FU9128:P173/y-1/5000/4/4/y-2/-1/-1/0;
!!VRy-1:S946 -1 *512 +v4138;
!!VRy-2:S947 -1 *512 +v4138;
!!FU9128:P174/y-1/5000/5/4/y-2/-1/-1/0;
!!VRy-1:S948 -1 *512 +v4138;
!!VRy-2:S949 -1 *512 +v4138;
!!FU9128:P175/y-1/5000/2/4/y-2/-1/-1/0;
!!VRy-1:S950 -1 *512 +v4138;
!!VRy-2:S951 -1 *512 +v4138;
!!FU9128:P176/y-1/5000/8/4/y-2/-1/-1/0;
!!VRy-1:S952 -1 *512 +v4138;
!!VRy-2:S953 -1 *512 +v4138;
!!FU9128:P177/y-1/5000/4/16/y-2/-1/-1/0;
* x1= + к атаке, x2= + к защите, x3= + к силе магии, x4= + к знанию
!!FU9129:P161/0/0/2/2; параметры артефактов
!!FU9129:P162/0/2/0/0;
!!FU9129:P163/5/0/0/0;
!!FU9129:P164/0/3/0/0;
!!FU9129:P165/0/0/0/3;
!!FU9129:P166/0/0/3/0;
!!UN:C6687592/4/v4139; z280-z294
!!UN:C5123366/4/v4140; z295-z296
!!UN:C5123569/4/v4140;
!!UN:C5123733/4/v4140;
!!UN:C5123964/4/v4140;

!?FU9126;
!!VRy1:S8088992;
!!VRy2:Sv4139;
!!DO9127/1/5472/1:Py1/y2;
!!VRy1:S8094552;
!!VRy2:Sv4140;
!!DO9127/1/684/1:Py1/y2;

!?FU9127;
!!UN:Cx1/1/?y1;
!!UN:Cx2/1/y1;
!!VRx1:+1;
!!VRx2:+1;

!?FU9128;
!!VRy2:Sx1*32+v4139;
!!UN:Cy2/4/x2; ссылка название
!!VRy2:Sx1*32+v4139+4;
!!UN:Cy2/4/x3; стоимость
!!VRy2:Sx1*32+v4139+8;
!!UN:Cy2/4/x4; позиция на теле
!!VRy2:Sx1*32+v4139+12;
!!UN:Cy2/4/x5; класс артефакта
!!VRy2:Sx1*32+v4139+16;
!!UN:Cy2/4/x6; ссылка описание
!!VRy2:Sx1*32+v4139+20;
!!UN:Cy2/4/x7; номер сборного артефакта
!!VRy2:Sx1*32+v4139+24;
!!UN:Cy2/4/x8; часть сборного артефакта №
!!VRy2:Sx1*32+v4139+28;
!!UN:Cy2/4/x9; дает ли заклинание

!?FU9129; функция артефактов
!!VRy1:S8094552;
!!VRy2:Sx1*4+y1;
!!UN:Cy2/1/x2; +атака
!!VRy2:Sx1*4+y1+1;
!!UN:Cy2/1/x3; +защита
!!VRy2:Sx1*4+y1+2;
!!UN:Cy2/1/x4; +сила магии
!!VRy2:Sx1*4+y1+3;
!!UN:Cy2/1/x5; +знание

Автор: Master Of Puppets 18 Apr 2009, 07:39

maior - я вот так сделал (если слот Брони в Artraits.txt не менялся):

Код
!?PI;
!!DO29502/1/5440/1:P8088992/10007016;
!!FU29503:P#1 P#2 P#3...; - номера добавляемых артов

!?FU29502;
!!UN:Cx1/1/?y1;
!!UN:Cx2/1/y1;
!!VRx1:+1;
!!VRx2:+1;

!?FU29503;
!!UN:C6687592/4/10007016;
!!VRy1:S8094336;
!!VRy2:Sx1*32+10007016;
!!DO29504/1/50/1:Py1/y2/x1;

!?FU29504;
!!UN:Cx1/1/?y1;
!!UN:Cx2/1/y1;
!!UN&y1=6/x3=*номер арта*:Cx2/1/*номер слота*;
!!VRx1:+1;
!!VRx2:+1;

Если менялся, то и y1, ес-сно, должна равняться другому значению слота.
Номер 171 - глючный. Его лучше опустить (но кадр в дефе - хоть пустой - конечно, обязателен).

Автор: major 18 Apr 2009, 11:34

Хммм... В принципе, не совсем верно, мне кажется.
!?FU29504 - побайтовое копирование параметров артефакта (167). У тебя, как я понял, если в нем будет значение 6 (т.е. торс), то ты меняешь на свое. А если там будет 4-байтовое значение адреса, ну к примеру, 00 6E AA 06, то последнее число тоже поменяется на твое значение, - а далее глюки и баги. Может быть так и происходит с артом 171.

Кстати, меня всегда интересовало, почему происходит копирование 50 байт в цикле !!DO4/1/50/1:Py1/y2; Ведь параметры артефакта заполняют собой 32 байта.
Можно даже посчитать - z-переменная - 512 байт, зарезервировано 200 z-переменных, т.е. 102400 байт. Как сказано ранее, можно добавить 3200 артов, т.е. на 1 арт придется 102400/3200=32 байта.
Это же подтверждает практика. Поэтому все же лучше поменять цикл на !!DO4/1/32/1:Py1/y2;
Ну и наконец для позиции на теле, исходя из моей функции, смещение составляет 8 байт, поэтому, MOP, в твоем примере попробуй поменять
!!UN&y1=6/x3=*номер арта*:Cx2/1/*номер слота*;
на
!!UN&x16=9/x3=*номер арта*:Cx2/1/*номер слота*;

Автор: Master Of Puppets 19 Apr 2009, 10:52

major - да, твой скрипт лучше, и я им сейчас пользуюсь. Арт-171 не глючит. Свой вариант я только из отчаяния сделал.
Кстати, придумал способ, чтобы не юзать кучу z-переменных для описаний артов (если артов много). На случай кликов использую такой код:

!?CM2&$Place$>1/$Place$<45;
!!VRy2:S$Place$-2;
!!VRy2&$Place$>39:S$Place$-21;
!!HE-1:A1/?y1/y2;
!!FU&y1<171:E;
!!VRy3:Sy1+1830;
!!VRz940:S@ArtMop[0]@;
!!VRz941:Sy3;
!!VRy-1:S940 -1 *512 +v4138;
!!VRy-2:S941 -1 *512 +v4138;
!!VRy2:Sy1*32+v4139;
!!UN:Cy2/4/y-1;
!!VRy2:Sy1*32+v4139+16;
!!UN:Cy2/4/y-2;

При получении артефакта в каком-либо объекте поступаю так же. Поэтому использую всего две z-переменных для всех артов.
Однако, у меня есть два вопроса по твоему скрипту:
1)Для чего в нём используются z280-z296? Можно обойтись без них?
2)Для чего делать параметры артов (+1 к Атаке и т.д.) через UN:C, если !?AE вроде нормально работает с новыми артефактами?

Добавлено ([mergetime]1240127533[/mergetime]):

Цитата
Может быть так и происходит с артом 171.

Нет, это было при полной неприкосновенности скрипта Дьякона.

Автор: major 19 Apr 2009, 11:37

1) z280-z294 используются для хранения параметров артефактов (стоимость, слот, класс и т.д.), а вот z295-z296 - уже и не помню для чего, кажется как раз для ссылок на название артефактов.
2) конечно в принципе не обязательно, просто мне так нравится.

Автор: Master Of Puppets 21 Apr 2009, 12:39

Цитата
z280-z294 используются для хранения параметров артефактов (стоимость, слот, класс и т.д.),

Я это понял. Не понял другое.
В скрипте коммент: "x1 - номер арта (с 171 и до 239)". Почему всего 69? Следуя логике, 14-ти z-переменных должно хватить на 512*14/32=224 артефакта.

Автор: major 21 Apr 2009, 16:23

А-а-а-а, я вспомнил! Используется 15 (не 14) z-переменных (280-294), т.е. получается 512*15/32=240 артефактов.
Я таблицу артефактов перенес в новое место, поэтому 240 - это общее количество артов, т.е. начиная с 0 последним будет арт №239. Посчитал, что дополнительно около 70 артефактов хватит... А параметры старых артов (0-170) просто копируются в новую таблицу.

Автор: Kastore the Warlock 21 Apr 2009, 16:33

[quote=Docent Picolan,21 Mar 2008, 01:15]
вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове: biggrin.gif

Дъякон
0:06:14 Данный скрипт позволяет добавить 3200 новых артов. Скрипт добавляет новый бланковый арт, св-ва которого можно задать при помощи ЕРМ. Но нельзя занимать переменные z800-z1000.

Так Дьякон, вроде нормальный чел был! За что его?

Автор: gamecreator 21 Apr 2009, 19:49

за разногласия с администрацией тсс... а то еще и нас попрут.

Автор: Master Of Puppets 23 Apr 2009, 05:12

major - ясно.
Кстати, через UN:C параметры артам действительно лучше задавать. Главным образом для HE:F с пятым параметром.
Только одну ошибочку заметил:

Цитата
!?FU9129; функция артефактов
!!VRy1:S8094552;
!!VRy2:Sx1*4+y1;
!!UN:Cy2/1/x2; +атака
!!VRy2:Sx1*4+y1+1;
!!UN:Cy2/1/x3; +защита
!!VRy2:Sx1*4+y1+2;
!!UN:Cy2/1/x4; +сила магии
!!VRy2:Sx1*4+y1+3;
!!UN:Cy2/1/x5; +знание

Смещение ведь на деле - один байт, так что:
Цитата
!?FU9129; функция артефактов
!!VRy1:S8094552;
!!VRy2:Sx1*4+y1;
!!UN:Cy2/1/x2; +атака
!!VRy2:+1;
!!UN:Cy2/1/x3; +защита
!!VRy2:+1;
!!UN:Cy2/1/x4; +сила магии
!!VRy2:+1;
!!UN:Cy2/1/x5; +знание

Автор: major 23 Apr 2009, 12:28

Цитата(Master Of Puppets @ 23 Apr 2009, 08:12)
Смещение ведь на деле - один байт, так что:
Цитата
!?FU9129; функция артефактов
!!VRy1:S8094552;
!!VRy2:Sx1*4+y1;
!!UN:Cy2/1/x2; +атака
!!VRy2:+1;
!!UN:Cy2/1/x3; +защита
!!VRy2:+1;
!!UN:Cy2/1/x4; +сила магии
!!VRy2:+1;
!!UN:Cy2/1/x5; +знание


Согласен yes.gif , но это не ошибочка, а немного усложненный код spiteful.gif

Автор: ERMMASTER 24 Apr 2009, 03:00

Ребята! Если не жалко, немогли-бы вы поделиться графическими моделями новых артефактов?

Автор: Master Of Puppets 24 Apr 2009, 15:43

Жа-а-а-алко!
Мод доделаю - кради сколько хочешь.

Автор: major 24 Apr 2009, 15:51

Цитата(Master Of Puppets @ 24 Apr 2009, 18:43)
Мод доделаю - кради сколько хочешь.

shum_lol.gif shum_lol.gif shum_lol.gif
во дает...

Автор: ERMMASTER 24 Apr 2009, 16:51

Эх.... sad.gif

Автор: Master Of Puppets 26 May 2009, 13:38

Я в печали. Мои мечты разрушаются. Мир полон отчаяния и скорби.
Скрипт нарушает работу всех комбо-артефактов (нет замков, при клике - вылет), и восстановить их после этого скрипта не получается через !!UN:A.
Чего сказать? ХЭЛП!

Автор: Master Of Puppets 28 May 2009, 15:11

Причину выяснил. Оказывается, не стоит копировать таблицу первичных параметров.

Автор: major 28 May 2009, 15:16

Действительно из-за этого? Странно. Для комбо-артов своя таблица есть...

Автор: Master Of Puppets 28 May 2009, 15:19

Да вот так и есть... wink.gif
Сейчас я таблицу основных параметров артов, их названий и описаний уже вынес в отдельный файл (чтобы z-переменные не захламлять и не тормозить игру функцией копирования), но и при исконном варианте баг идёт из-за переадресации таблицы перв. навыков.

Автор: lisblackdancer 23 Aug 2009, 11:10

Люди создайте мне арт, ато я так ничё и не понял из этой темы blink.gif картинка как у арта 1 (свиток заклинания), он ничё не должен давать, просто подсказку по клику правой кнопкой мыши... лежит в отделе для других артов.

Добавлено ([mergetime]1251015013[/mergetime]):
ещё если можно как проверить, есть ли у героя этот арт, и как его дать/убрать у героя...

Автор: Master Of Puppets 23 Aug 2009, 11:27

Люди заняты своими делами. Объяснять всё по порядку у них времени нет (да и сомнительная это трата времени). Попробуй разобраться сам.
P.S. Почему-то я не пришёл на этот форум с криками "ААА! Хэлп! Люди, сделайте всё за меня, а потом объясните, как вы это сделали".

Автор: lisblackdancer 23 Aug 2009, 13:43

я создал арт (из пустого арта вога) но вот как добавить свойства? (увел. вторичных навыков)

Добавлено ([mergetime]1251024205[/mergetime]):
и первичных

Автор: major 23 Aug 2009, 13:58

Триггеры !?AE0 и !?AE1

Автор: lisblackdancer 23 Aug 2009, 17:10

Блин как отменить неделю монстров? sad.gif я иду с крестьянином 1 и больше никем, тут неделя монстров, мне 50 троглодитов перегораживают дорогу... жесть blink.gif

Автор: Alex-EEE 23 Aug 2009, 17:49

Цитата(lisblackdancer @ 23 Aug 2009, 18:10)
Блин как отменить неделю монстров? sad.gif я иду с крестьянином 1 и больше никем, тут неделя монстров, мне 50 троглодитов перегораживают дорогу... жесть blink.gif

А ты не иди с одним крестьянином, и все будет нормально.

Автор: lisblackdancer 23 Aug 2009, 18:24

а мне надо с одним... вообще мне надо чтоб герой ходил с 1 мечником, 1 алебардщиком и 1 копейщиком. Но такая армия не может победить монатров, самопоявляющихся в начале каждой недели

Автор: feanor 20 Mar 2010, 18:07

И у меня полезли проблемы с комбо-артефактами..

Переписывал код на С -
- при непереносе таблицы первичных параметров эти самые параметры добавляются абсолютно рандомно. Ну это ожидаемо, да. А неожиданно то, что каждый новый добавленный артефакт считается сборником, разбирающимся как Альянс Ангелов.
- при переносе - ломаются сборники, при снятии нового артефакта с куклы - вылет.

Я подозреваю, что надо либо менять не все указатели, либо наоборот, какой-то был не замечен отладчиком.

Автор: feanor 21 Mar 2010, 01:03

Так. Проблема с сборником решена - надо было инитить соответствующие два поля структуры не нулями, а минус единицами.

Сборники, впрочем, по-прежнему, ломаются, но при клике на арт уже ничего не падает.

Автор: feanor 21 Mar 2010, 01:29

Методом тыка починил разборку сборников. По видимому, надо изменять указатели на таблицу бонусов только по адресам 0x4E2DF1 и 0x4E2F7C, а 0x4E2D26 и 0x4E2E95 - не трогать.

условно рабочий код. Условно - потому что час ночи и завтра стопудов найдутся еще баги.

Код
//-----artifacts------------
#define ART_NUM 5000


typedef struct
{
   char *name;
   int cost;
   int slot;
   int rank;
   char *desc;
   int partof;
   int wholeart;
   int spellflag;
} ART_RECORD;

typedef struct
{
   char att;
   char def;
   char knw;
   char spp;
}ART_BONUS;



char* t = "------";
ART_RECORD newtable[ART_NUM];
ART_BONUS newbtable[ART_NUM];
void CreateNewArtTable()
{
               memcpy(newbtable,(void*)0x7B8358,4*170);

//изначальная функция
               *(int*)0x660B68 = (int)(newtable);

//UN:A фикс
               *(int*)0x7324BD = (int)ART_NUM;

//для загрузки параметров из текстовиков сразу в новую таблицу
               *(int*)0x44CB32 = (int)(newtable);
               *(int*)0x44CD1E = (int)(newtable);
               *(int*)0x44CD6C = (int)(newtable);

//хз зачем, но жрать не просит
               *(int*)0x44CCDF = 0x1C+(int)(newtable);
               *(int*)0x44CCFA = 0x1D+(int)(newtable);
               *(int*)0x716F8D = 0x18+(int)(newtable);

               *(int*)0x716F9E = 0x18+(int)(newtable);
               *(int*)0x716FAE = 0x14+(int)(newtable);
               *(int*)0x716FBF = 0x14+(int)(newtable);

               *(int*)0x717117 = 0x14+(int)(newtable);
               *(int*)0x717146 = 0x18+(int)(newtable);
               *(int*)0x754A42 = (int)(newtable);

//даём таблицу бонусов. Охтунг, баги и чернокнижество.
            //  *(int*)0x4E2D26  = (int)(newbtable);      //при комм. этого указателя учет бонусов - норм, замки на сборных - норм, клик на сб - вылет.
               *(int*)0x4E2DF1 = (int)(newbtable);
               //*(int*)0x4E2E95 = (int)(newbtable);
               *(int*)0x4E2F7C = (int)(newbtable);
               /*memcpy(newbtable,(void*)0x7B8358,4*170);*/

//инит новых артов
               for(int i=170; i!=ART_NUM; i++)
               {
                   newtable[i].slot=1;
                   newtable[i].desc=t;
                   newtable[i].name=t;
                   newtable[i].partof=-1;
                   newtable[i].wholeart=-1;
                   newtable[i].cost=1000;
                   newtable[i].rank=16;

                   newbtable[i].att=0;
                   newbtable[i].def=0;
                   newbtable[i].knw=0;
                   newbtable[i].spp=0;
               }
}


Автор: feanor 21 Mar 2010, 23:56

Вроде нет багов. Теперь надо расширить число читаемых строк из artevent и artraits sad.gif

Автор: Master Of Puppets 23 Mar 2010, 11:57

А может попроще как-нибудь? Например, помимо вышеперечисленных указателей, поменять ещё четыре, со смещением +280h от начала таблицы:

4E2D3Dh
4E2DD7h
4E2EACh
4E2F41h

И всё тип-топ. smile.gif

Цитата(feanor @ 21 Mar 2010, 23:56)
Теперь надо расширить число читаемых строк из artevent и artraits sad.gif

Я сделал. Могу сказать, как, если не найдёшь.
Вообще, ключ ко всем таблицам, снятию ограничений и т.п. - воговское копирование массивов.

Автор: Master Of Puppets 25 Mar 2010, 11:06

Для artraits.txt - 0x44CCA8 и 0x44CACA. Формат: кол-во артов*4+2.
Для artevent.txt - 0x49DD90. Формат: кол-во артов*4.
ВОГ изменяет вышеуказанные данные своими, которые в exe стоят по адресам 325200h, 32520Ch и 325248h. Можно изменить их и там, но я предпочитаю модифицировать СОД напрямую в экзешнике, деактивируя вог-копирования, от которых в дизассемблере только непонятки.
Для artevent.txt ещё нужно расширить таблицу ссылок на строки, а то пойдёт затирание памяти *death*. В начале этой таблицы четыре байта, отвечающие за какое-то смещение при текущем поднятии артефакта, дальше - собственно ссылки. Указатели есть и на то, и на другое (в скобках - адреса воговских данных в exe):

49DD9A (325218)
7059E2
705A32
705A68
705FC2
70613B

остальные: +4

49F2E7 (325224)
49F51E (325230)
49F5DA (32523C)

Автор: feanor 25 Mar 2010, 13:51

Тьфу, и ведь почти все нашёл sad.gif теперь придется что нить другое копать для восстановления душевного равновесия gigi.gif.

Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся biggrin.gif

Автор: feanor 25 Mar 2010, 18:01

Все работает.

Код
#include "main.h"
//#include "stdio.h"

//-----artifacts------------
#define ART_NUM 5000

#define SLOT_GRAIL 0
#define SLOT_HEAD 1
#define SLOT_SHOULDERS 2
#define SLOT_NECK 3
#define SLOT_HAND 16671
#define SLOT_RHAND 4
#define SLOT_LHAND 5
#define SLOT_TORSO 6
#define SLOT_RING 7
#define SLOT_RRING 1339
#define SLOT_LRING 65
#define SLOT_LEGS 8
#define SLOT_MISC 9
#define SLOT_WM1 10
#define SLOT_WM2 11
#define SLOT_WM3 12
#define SLOT_WM4 13
#define SLOT_BOOK 14
#define SLOT_MISC1 1334
#define SLOT_MISC2 21732
#define SLOT_MISC3 117033
#define SLOT_MISC4 35338
#define SLOT_MISC5 21748

typedef struct
{
   char *name;
   int cost;
   int slot;
   int rank;
   char *desc;
   int partof;
   int combonum;
   int spellflag;
} ART_RECORD;

typedef struct
{
   char att;
   char def;
   char knw;
   char spp;
}ART_BONUS;


char* dummyhint = "It is a very blank artifact.";

ART_RECORD newtable[ART_NUM];
ART_BONUS newbtable[ART_NUM];
char* arteventtable[ART_NUM+1]; //
void CreateNewArtTable()
{


//изначальная функция (c) Дьякон
               *(int*)0x660B68 = (int)(newtable);

//UN:A фикс
               *(int*)0x7324BD = (int)ART_NUM;

//для загрузки параметров из текстовиков сразу в новую таблицу
               *(int*)0x44CB32 = (int)(newtable);
               *(int*)0x44CD1E = (int)(newtable);
               *(int*)0x44CD6C = (int)(newtable);

//хз зачем, но жрать не просит
               *(int*)0x44CCDF = 0x1C+(int)(newtable);
               *(int*)0x44CCFA = 0x1D+(int)(newtable);
               *(int*)0x716F8D = 0x18+(int)(newtable);

               *(int*)0x716F9E = 0x18+(int)(newtable);
               *(int*)0x716FAE = 0x14+(int)(newtable);
               *(int*)0x716FBF = 0x14+(int)(newtable);

               *(int*)0x717117 = 0x14+(int)(newtable);
               *(int*)0x717146 = 0x18+(int)(newtable);
               *(int*)0x754A42 = (int)(newtable);

//даём таблицу бонусов. Охтунг, баги и чернокнижество. Адреса (с) major
               memcpy(newbtable,(void*)0x7B8358,4*170);
            //  *(int*)0x4E2D26  = (int)(newbtable);      //при комм. этого указателя учет бонусов - норм, замки на сборных - норм, клик на сб - вылет.
               *(int*)0x4E2DF1 = (int)(newbtable);
               //*(int*)0x4E2E95 = (int)(newbtable);
               *(int*)0x4E2F7C = (int)(newbtable);
               /*memcpy(newbtable,(void*)0x7B8358,4*170);*/

//.txt reading (c) MoP

               *(int*)0x49F2E7 = 4+(int)(arteventtable);
               *(int*)0x49F51E = 4+(int)(arteventtable);
               *(int*)0x49F5DA = 4+(int)(arteventtable);
               *(int*)0x49DD9A = (int)(arteventtable);
               *(int*)0x7059E2 = (int)(arteventtable);
               *(int*)0x705A68 = (int)(arteventtable);
               *(int*)0x705FC2 = (int)(arteventtable);
               *(int*)0x70613B = (int)(arteventtable);

               *(int*)0x44CCA8 = (int)(ART_NUM*4+2);
               *(int*)0x44CACA = (int)(ART_NUM*4+2);
               *(int*)0x49DD90 = (int)(ART_NUM*4);

//инит новых артов

               for(int i=1; i!=ART_NUM+1; i++)
               {
                   arteventtable[i] = (char*)malloc(255);
               }

               for(int i=170; i!=ART_NUM; i++)
               {
                   newtable[i].slot=0;
                   newtable[i].desc=dummyhint;
                   newtable[i].name=dummyhint;
                   newtable[i].partof=-1;
                   newtable[i].combonum=-1;
                   newtable[i].cost=1000;
                   newtable[i].rank=16;

                   newbtable[i].att=0;
                   newbtable[i].def=0;
                   newbtable[i].knw=0;
                   newbtable[i].spp=0;
               }
}
//-----------------------------
extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
   switch (fdwReason)
   {
       case DLL_PROCESS_ATTACH:
           {
           CreateNewArtTable();
           }
           break;

       case DLL_PROCESS_DETACH:
           {
               for(int i=1; i!=ART_NUM+1; i++)
               {
                   free(arteventtable[i]);
               }
           }
           // FreeNewArtTable();
           // detach from process
           break;

       case DLL_THREAD_ATTACH:
           // attach to thread
           break;

       case DLL_THREAD_DETACH:
           // detach from thread
           break;
   }
   return TRUE; // succesful
}


Автор: etoprostoya 25 Mar 2010, 18:14

\\ char* dummyhint = "It is a very blank artifact.";

smile.gif

Автор: feanor 25 Mar 2010, 18:34

Ну просто blank's уже есть, эти будут very blank.

Автор: feanor 25 Mar 2010, 20:31

Возможно, я криворук и ФИО мои - Бхагаван Рабиндранатыч Шридрахан-Прашантов, но при расширении количества читаемых артефактов из текстовика необходимо, чтобы все они там были. Иначе работает очень нестабильно. Оно так и задумано?)
Придется, видимо, еще и количество строк из текстовиков выдирать
Хотя какого чёрта? До текстовиков в лоде один хрен не добраться.
Хотя какого чёрта? Просплюсь и сделаю конфиг. Или еще что-нить придумаю

Автор: feanor 26 Mar 2010, 21:08

сделал расширение таблицы даваемых заклинаний. Теперь с нулевого артефакта и до обеда. Думаю над расширением свитча - места освободилось дофига, можно всяких свиткоподобных артефактов штук двадцать стопяцот запихнуть..

Код
memset(artspelltable,8,ART_NUM);
memcpy(artspelltable+86,(void*)0x4D9800,49);
*(char*)0x4D95DC = 0x06;
*(int*)0x4D95DD = 0x90909090;
 *(int*)0x4D95EB = (int)artspelltable;


Добавлено ([mergetime]1269626932[/mergetime]):
Added: проверил, расширение свитча внаглую - работает. Теперь надо его аккуратно-аккуратно перенести. Вероятно, завтра.

Автор: Master Of Puppets 27 Mar 2010, 08:06

Цитата(feanor @ 25 Mar 2010, 13:51)
Тьфу, и ведь почти все нашёл sad.gif теперь придется что нить другое копать для восстановления душевного равновесия gigi.gif.

Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся biggrin.gif

Несомненно. yes.gif Хотя охота было бы самому научиться их писать, а то у меня даже нет понятия, в чём это делать, вернее - компилировать.

Автор: Дьяк 27 Mar 2010, 08:44

Цитата(feanor @ 25 Mar 2010, 20:31)
Возможно, я криворук и ФИО мои - Бхагаван Рабиндранатыч Шридрахан-Прашантов, но при расширении количества читаемых артефактов из текстовика необходимо, чтобы все они там были. Иначе работает очень нестабильно. Оно так и задумано?)
Придется, видимо, еще и количество строк из текстовиков выдирать
Хотя какого чёрта? До текстовиков в лоде один хрен не добраться.
Хотя какого чёрта? Просплюсь и сделаю конфиг. Или еще что-нить придумаю

Есть такая теория не подтвержденная на артах, но проверенная на монстрах, что увеличение читаемых строк из файла - это не полное решение, т.к. память уже выделена, и при чтении большего количества строк затирается соседняя память, либо чтение нового текстовика затрет новые строки из твоего текстовика. Оптимальным я считаю можно самому выделить память под нужное количество, скопировать то что уже прочитано, а потом заполнить самому новые строки читая их из любого текстовика, можно даже из того же самого. ИМХО.

Автор: feanor 27 Mar 2010, 11:01

2МоР: я все хочу написать ман по написанию дллок с нуля (начиная с установки кодблокса и заканчивая описанием какой-нить простенькой). И всё лень.

2Дьяк. Дык, я и делаю новую таблицу указателей, маллочу всё элементы и переписываю указатели на неё. Копировать, кста, не обязательно - на момент загрузки длл текстовики еще не прочитаны.

Автор: feanor 27 Mar 2010, 14:49

Вроде бы расширил кейсы. Некрасиво, но расширил. Теперь в таблице типов типы 0x80 - 0xFF дают заклинания 0-127. Планирую когда-нить припаять еще "все заклинания 1-2-3-4 уровней" и просто "все заклинания".

Код
char  artspelltable[ART_NUM]; //
int artspellswitch[256];

char _magic[22] = {0x6A,0x01,0x6A,0x09, 0x8D,0x4D,0xE4,0xB8,0xA0,0x67,0x4E,0x00,0xFF,0xD0,0xB8,0x9D,0x97,0x4D,0x00,0xFF,
0xE0,0x90};
//машкод кейса, ответственного за добавление заклинания артефакту.
char new_cases[22*128];
//коды для новых кейсов

...
//новые кейсы
               memset(new_cases, 0x90, 22*128);
               for(unsigned char i=0; i!=128; i++)
               {
                   memcpy(new_cases+i*22,_magic,22);
                   new_cases[i*22+3]=i;
                   artspellswitch[i+0x80]=i*22+(int)(new_cases);
               }
               memcpy((void*)artspellswitch,(void*)0x4D97DC,4*9);
               *(int*)0x4D95F2 = (int)artspellswitch;

Автор: feanor 27 Mar 2010, 19:22

Только хотел выложить полный код и длл - наткнулся на баг. Четыре строки
*(int*)0x7059E2 = (int)(arteventtable);
*(int*)0x705A68 = (int)(arteventtable);
*(int*)0x705FC2 = (int)(arteventtable);
*(int*)0x70613B = (int)(arteventtable);
гробят воговские !!CA и !!CH. Вероятно, виновата только одна из них - но мне влом думать, какая.

Добавлено ([mergetime]1269706512[/mergetime]):
Впрочем..
http://waper.ru/file/1288984/emeraldLib-0.01.rar

Добавлено ([mergetime]1269706921[/mergetime]):
Тьфу ж ты блин, совсем забыл о клятом Грохоте Титана, который угробил для тестов и забыл вернуть на место sad.gif

Автор: feanor 28 Mar 2010, 16:31

http://waper.ru/file/1289964/emerald-alpha.rar
относительно работает, если не смотреть на кривость обвязки (самих артефактов, описаний и пурги из юнитсхинтов в конфиге)

В emerald.cfg хранится количество читаемых строк из artraits и artevents.
Привязка заклятий и бонусов к артефактами пока осуществляется в самой длл - было лень что-либо придумывать.

Автор: Master Of Puppets 30 Mar 2010, 10:30

Надо было предупредить людей с момента регистрации, что доверять мне можно, а проверять - нужно. gigi.gif

Цитата
Формат: кол-во артов*4+2.

Опечатался. На самом деле - (кол-во артов+2)*4 или кол-во артов*4+8.
Возможно, потому у тебя и некоторые глюки.

Автор: feanor 30 Mar 2010, 14:45

Не, этот баг я словил вчера (не читалась последняя строка из текстовиков).

Автор: SAG19330184 08 Apr 2010, 12:56

feanor, будь умницей, напиши пожалуйста строчку по виртуал-паскальному:
extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

Автор: feanor 08 Apr 2010, 13:39

Это точка входа в длл. Основная процедура в паскале, проще говоря.

Автор: feanor 09 May 2010, 21:17

http://slil.ru/29104939

собственно, кой-что докрутил. Мелочи в основном.
_________readme.txt__________
emerald.dll -- 0.03

Позволяет использовать артефакты с номерами, большими 170 (до 5000. Кому надо больше - ну..можете перекомпилировать. Извращенцы!11)
Позволяет привязывать к ним заклятья и бонусы первичных навыков.

В архиве есть состряпанный на горячую руку пример.

Установка:
1. Убедитесь, что у вас установлена Era. Предпочтительно - версии не ниже 1.6.
2. Положите emerald.dll в папку плагинов Эры (/EraPlugins/, как правило) и emerald.cfg в папку /Data/. Если вы хотите проверить работоспособность - положите h3wog.lod с расширенным artifact.def в /Data/
3. Запишите дополнительные строки в файлы описания артефактов (artraits и artevents)
4. Запишите их число в emerald.cfg. Охтунг! Если строк будет меньше, чем записано в конфиге - игра просто не запустится.
5. njoy!

нидваниполтора. О привязке заклинаний и первичных бонусов.
DLL экспортирует функцию ExtArtProperties(int num, char spell, char att, char def, char knw, char spp)
num - номер артефакта;
spell - номер заклинания в спецтаблице (для привязки какого-то конкретного заклинания используйте ID = номер заклинания + 128)
att, def, knw, spp - значения первичных навыков

Автор: feanor 09 May 2010, 23:09

После привязки заклятья к арту потребуется включить его через UN:A<номер>/8/1;

Второй параметр для ExtArtProperties, окромя 128-255 (что? в Героях нет 127 заклинаний? это вы так думаете.):

Цитата(Master Of Puppets @ 03 Feb 2010, 13:40)
Типы значений в таблице:
0 - дать все заклинания Огня
1 - дать все заклинания Воздуха
2 - дать все заклинания Воды
3 - дать все заклинания Земли
4 - дать заклинания "Вызвать Корабль" и "затопить Корабль"
5 - дать все заклинания 5-го уровня
6 - Дать "Армагеддон"
7 - Дать "Гром Титанов"
8 - ничего

__________________________
Кстати вот да.
Гриты и копирайты:

сабж может быть использован в любом моде, целиком или по частям. Для Мутномода - скидки.
Огромнейший респект Дьякону, major'у и Master of Puppets (в порядке алфавита biggrin.gif ), компиляцией трудов которых, по сути, сей сабж и является.

Автор: feanor 30 Jun 2010, 12:04

Таблица запрета артефактов на карте - [699538h]+4E224h.
Алсо, что-то там иногда мелькает с [699538h]+4E2B4h.

Автор: Master Of Puppets 30 Jul 2010, 10:07

Цитата(feanor @ 09 May 2010, 21:17)
до 5000. Кому надо больше - ну..можете перекомпилировать. Извращенцы!11)

Кхм...
Цитата(ERM-help)
Свитки имеют номер артефакта 1001+s, где s - номер заклинания

В дополнение: Книга Заклинаний имеет номер 1000 в определённых действиях.
Я поэтому и остановился на лимите в 1000 (0-999) артов.
Но это так, пустяки. Всё равно столько артов когда ещё наделают...

Автор: feanor 30 Jul 2010, 10:25

угу, я знаю. Только мне тоже представить ситуацию с >1000 артов в одном моде было сложно.

Хотя не невозможно. Скажем, генерацию системы вещей аля ММ "в лоб"

Автор: Master Of Puppets 30 Jul 2010, 11:52

Последние штрихи:

ВСЕ реальные указатели на таблицу артефактов:

44CB32
44CCDF +28
44CCFA +29
44CD1E
44CD6C
660B68
716F8D +24
716F9E +24
716FAE +20
716FBF +20
717117 +20
717146 +24
754A42

Считывание в таблицу признака GivesSpell:
44CCE6 mov eax,L0063B998; <- адрес таблицы, в которой находятся номера артефактов, дающих заклинания.
44CCF3 cmp eax,L0063B9BC; <- адрес, на котором заканчивается считывание.

Автор: wtfwtf 12 Apr 2011, 23:49

А перезалить длл-ку может кто-нибудь?

Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)