Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Артефакты
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды > Скрипты
Страницы: 1, 2
Docent Picolan
вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове: 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>
3200? Не слишком много?
Docent Picolan
ты имел ввиду мало.. biggrin.gif но на наш век хватит smile.gif
hippocamus
УРА!!!
Всё! Нужно доставать арты из Морровинда. Там есть весьма прикольные.
<Fenix>
smile.gif
Docent Picolan
попрошу не обсуждать кого почему и когда забанили. там дело тёмное smile.gif
FBX
Вот ведь коварные колдуны, взломали все-таки...
major
Как изменить параметры нового арта, если !!UN:A ругается, мол, такого артефакта не бывает, в частности, его описание и название?
FakerNeo
Через UN:C, либо снимать ограничение на кол-во артов в ехе
sergroj
Проще через UN:C - для снятия надо расшираять таблицу и менять границу пары циклов. Но, конечно, UN:C изменит это в рамках всей игры, а не только карты.
MasterOfPuppets
Я в exe дуб дубом, но в этом скрипте, я так понял, происходит копирование блока памяти, относящегося к арту-167, в некое свободное место (видимо, предназначенное для z-переменных 800-1000) - как продолжение ряда. Сколько раз скопировал - столько и артов. Но в результате все "новые" артефакты надеваются на тот же слот, что и арт-167. Если в artraits.txt этот слот поменять, то он изменится и у всех "клонов".
Так как можно и можно ли индивидуально поменять слот "новому" артефакту?
Это единственное, что меня интересует. Название и описание можно и по кликам определять.
gamecreator
конечно можно. на основании уже существующих примеров ищешь оффсет в записи арта что соответствует слоту и пишешь туда свое
major
Хмм... могу выложить мои наработки, основанные на исследованиях Сергроя и Дьякона. Насколько все работает я уж и не помню, но раньше я этими функциями пользовался. Это кажется для ТЕ. Итак

Код
** определяем адрес переменной 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; +знание
MasterOfPuppets
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
Хммм... В принципе, не совсем верно, мне кажется.
!?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/*номер слота*;
MasterOfPuppets
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
1) z280-z294 используются для хранения параметров артефактов (стоимость, слот, класс и т.д.), а вот z295-z296 - уже и не помню для чего, кажется как раз для ссылок на название артефактов.
2) конечно в принципе не обязательно, просто мне так нравится.
MasterOfPuppets
Цитата
z280-z294 используются для хранения параметров артефактов (стоимость, слот, класс и т.д.),

Я это понял. Не понял другое.
В скрипте коммент: "x1 - номер арта (с 171 и до 239)". Почему всего 69? Следуя логике, 14-ти z-переменных должно хватить на 512*14/32=224 артефакта.
major
А-а-а-а, я вспомнил! Используется 15 (не 14) z-переменных (280-294), т.е. получается 512*15/32=240 артефактов.
Я таблицу артефактов перенес в новое место, поэтому 240 - это общее количество артов, т.е. начиная с 0 последним будет арт №239. Посчитал, что дополнительно около 70 артефактов хватит... А параметры старых артов (0-170) просто копируются в новую таблицу.
Kastore
[quote=Docent Picolan,21 Mar 2008, 01:15]
вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове: biggrin.gif

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

Так Дьякон, вроде нормальный чел был! За что его?
gamecreator
за разногласия с администрацией тсс... а то еще и нас попрут.
MasterOfPuppets
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
Цитата(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
Ребята! Если не жалко, немогли-бы вы поделиться графическими моделями новых артефактов?
MasterOfPuppets
Жа-а-а-алко!
Мод доделаю - кради сколько хочешь.
major
Цитата(Master Of Puppets @ 24 Apr 2009, 18:43)
Мод доделаю - кради сколько хочешь.

shum_lol.gif shum_lol.gif shum_lol.gif
во дает...
ERMMASTER
Эх.... sad.gif
MasterOfPuppets
Я в печали. Мои мечты разрушаются. Мир полон отчаяния и скорби.
Скрипт нарушает работу всех комбо-артефактов (нет замков, при клике - вылет), и восстановить их после этого скрипта не получается через !!UN:A.
Чего сказать? ХЭЛП!
MasterOfPuppets
Причину выяснил. Оказывается, не стоит копировать таблицу первичных параметров.
major
Действительно из-за этого? Странно. Для комбо-артов своя таблица есть...
MasterOfPuppets
Да вот так и есть... wink.gif
Сейчас я таблицу основных параметров артов, их названий и описаний уже вынес в отдельный файл (чтобы z-переменные не захламлять и не тормозить игру функцией копирования), но и при исконном варианте баг идёт из-за переадресации таблицы перв. навыков.
lisblackdancer
Люди создайте мне арт, ато я так ничё и не понял из этой темы blink.gif картинка как у арта 1 (свиток заклинания), он ничё не должен давать, просто подсказку по клику правой кнопкой мыши... лежит в отделе для других артов.

Добавлено ([mergetime]1251015013[/mergetime]):
ещё если можно как проверить, есть ли у героя этот арт, и как его дать/убрать у героя...
MasterOfPuppets
Люди заняты своими делами. Объяснять всё по порядку у них времени нет (да и сомнительная это трата времени). Попробуй разобраться сам.
P.S. Почему-то я не пришёл на этот форум с криками "ААА! Хэлп! Люди, сделайте всё за меня, а потом объясните, как вы это сделали".
lisblackdancer
я создал арт (из пустого арта вога) но вот как добавить свойства? (увел. вторичных навыков)

Добавлено ([mergetime]1251024205[/mergetime]):
и первичных
major
Триггеры !?AE0 и !?AE1
lisblackdancer
Блин как отменить неделю монстров? sad.gif я иду с крестьянином 1 и больше никем, тут неделя монстров, мне 50 троглодитов перегораживают дорогу... жесть blink.gif
Alex-EEE
Цитата(lisblackdancer @ 23 Aug 2009, 18:10)
Блин как отменить неделю монстров? sad.gif я иду с крестьянином 1 и больше никем, тут неделя монстров, мне 50 троглодитов перегораживают дорогу... жесть blink.gif

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

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

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

Сборники, впрочем, по-прежнему, ломаются, но при клике на арт уже ничего не падает.
feanor
Методом тыка починил разборку сборников. По видимому, надо изменять указатели на таблицу бонусов только по адресам 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
Вроде нет багов. Теперь надо расширить число читаемых строк из artevent и artraits sad.gif
MasterOfPuppets
А может попроще как-нибудь? Например, помимо вышеперечисленных указателей, поменять ещё четыре, со смещением +280h от начала таблицы:

4E2D3Dh
4E2DD7h
4E2EACh
4E2F41h

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

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

Я сделал. Могу сказать, как, если не найдёшь.
Вообще, ключ ко всем таблицам, снятию ограничений и т.п. - воговское копирование массивов.
MasterOfPuppets
Для 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
Тьфу, и ведь почти все нашёл sad.gif теперь придется что нить другое копать для восстановления душевного равновесия gigi.gif.

Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся biggrin.gif
feanor
Все работает.
Код
#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
\\ char* dummyhint = "It is a very blank artifact.";

smile.gif
feanor
Ну просто blank's уже есть, эти будут very blank.
feanor
Возможно, я криворук и ФИО мои - Бхагаван Рабиндранатыч Шридрахан-Прашантов, но при расширении количества читаемых артефактов из текстовика необходимо, чтобы все они там были. Иначе работает очень нестабильно. Оно так и задумано?)
Придется, видимо, еще и количество строк из текстовиков выдирать
Хотя какого чёрта? До текстовиков в лоде один хрен не добраться.
Хотя какого чёрта? Просплюсь и сделаю конфиг. Или еще что-нить придумаю
feanor
сделал расширение таблицы даваемых заклинаний. Теперь с нулевого артефакта и до обеда. Думаю над расширением свитча - места освободилось дофига, можно всяких свиткоподобных артефактов штук двадцать стопяцот запихнуть..
Код
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: проверил, расширение свитча внаглую - работает. Теперь надо его аккуратно-аккуратно перенести. Вероятно, завтра.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.