Полная версия этой страницы:
Артефакты
Docent Picolan
21 Mar 2008, 00:15
вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове:
Дъякон
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
ты имел ввиду мало..

но на наш век хватит
hippocamus
21 Mar 2008, 01:06
УРА!!!
Всё! Нужно доставать арты из Морровинда. Там есть весьма прикольные.
<Fenix>
21 Mar 2008, 11:05
Docent Picolan
21 Mar 2008, 15:38
попрошу не обсуждать кого почему и когда забанили. там дело тёмное
Вот ведь коварные колдуны, взломали все-таки...
Как изменить параметры нового арта, если !!UN:A ругается, мол, такого артефакта не бывает, в частности, его описание и название?
FakerNeo
21 Sep 2008, 03:27
Через UN:C, либо снимать ограничение на кол-во артов в ехе
sergroj
21 Sep 2008, 18:12
Проще через UN:C - для снятия надо расшираять таблицу и менять границу пары циклов. Но, конечно, UN:C изменит это в рамках всей игры, а не только карты.
MasterOfPuppets
15 Apr 2009, 22:52
Я в exe дуб дубом, но в этом скрипте, я так понял, происходит копирование блока памяти, относящегося к арту-167, в некое свободное место (видимо, предназначенное для z-переменных 800-1000) - как продолжение ряда. Сколько раз скопировал - столько и артов. Но в результате все "новые" артефакты надеваются на тот же слот, что и арт-167. Если в artraits.txt этот слот поменять, то он изменится и у всех "клонов".
Так как можно и можно ли индивидуально поменять слот "новому" артефакту?
Это единственное, что меня интересует. Название и описание можно и по кликам определять.
gamecreator
16 Apr 2009, 01:07
конечно можно. на основании уже существующих примеров ищешь оффсет в записи арта что соответствует слоту и пишешь туда свое
Хмм... могу выложить мои наработки, основанные на исследованиях Сергроя и Дьякона. Насколько все работает я уж и не помню, но раньше я этими функциями пользовался. Это кажется для ТЕ. Итак
Код
** определяем адрес переменной 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
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 - глючный. Его лучше опустить (но кадр в дефе - хоть пустой - конечно, обязателен).
Хммм... В принципе, не совсем верно, мне кажется.
!?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
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.
Нет, это было при полной неприкосновенности скрипта Дьякона.
1) z280-z294 используются для хранения параметров артефактов (стоимость, слот, класс и т.д.), а вот z295-z296 - уже и не помню для чего, кажется как раз для ссылок на название артефактов.
2) конечно в принципе не обязательно, просто мне так нравится.
MasterOfPuppets
21 Apr 2009, 12:39
Цитата
z280-z294 используются для хранения параметров артефактов (стоимость, слот, класс и т.д.),
Я это понял. Не понял другое.
В скрипте коммент: "x1 - номер арта (с 171 и до 239)". Почему всего 69? Следуя логике, 14-ти z-переменных должно хватить на 512*14/32=224 артефакта.
А-а-а-а, я вспомнил! Используется 15 (не 14) z-переменных (280-294), т.е. получается 512*15/32=240 артефактов.
Я таблицу артефактов перенес в новое место, поэтому 240 - это общее количество артов, т.е. начиная с 0 последним будет арт №239. Посчитал, что дополнительно около 70 артефактов хватит... А параметры старых артов (0-170) просто копируются в новую таблицу.
Kastore
21 Apr 2009, 16:33
[quote=Docent Picolan,21 Mar 2008, 01:15]
вот вам привет от дъякона, к сожалению проживающего ныне на банановом острове:
Дъякон
0:06:14 Данный скрипт позволяет добавить 3200 новых артов. Скрипт добавляет новый бланковый арт, св-ва которого можно задать при помощи ЕРМ. Но нельзя занимать переменные z800-z1000.
Так Дьякон, вроде нормальный чел был! За что его?
gamecreator
21 Apr 2009, 19:49
за разногласия с администрацией тсс... а то еще и нас попрут.
MasterOfPuppets
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; +знание
Цитата(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; +знание
Согласен

, но это не ошибочка, а немного усложненный код
ERMMASTER
24 Apr 2009, 03:00
Ребята! Если не жалко, немогли-бы вы поделиться графическими моделями новых артефактов?
MasterOfPuppets
24 Apr 2009, 15:43
Жа-а-а-алко!

Мод доделаю - кради сколько хочешь.
Цитата(Master Of Puppets @ 24 Apr 2009, 18:43)
Мод доделаю - кради сколько хочешь.
во дает...
ERMMASTER
24 Apr 2009, 16:51
Эх....
MasterOfPuppets
26 May 2009, 13:38
Я в печали. Мои мечты разрушаются. Мир полон отчаяния и скорби.
Скрипт нарушает работу всех комбо-артефактов (нет замков, при клике - вылет), и восстановить их после этого скрипта не получается через !!UN:A.
Чего сказать? ХЭЛП!
MasterOfPuppets
28 May 2009, 15:11
Причину выяснил. Оказывается, не стоит копировать таблицу первичных параметров.
Действительно из-за этого? Странно. Для комбо-артов своя таблица есть...
MasterOfPuppets
28 May 2009, 15:19
Да вот так и есть...

Сейчас я таблицу основных параметров артов, их названий и описаний уже вынес в отдельный файл (чтобы z-переменные не захламлять и не тормозить игру функцией копирования), но и при исконном варианте баг идёт из-за переадресации таблицы перв. навыков.
lisblackdancer
23 Aug 2009, 11:10
Люди создайте мне арт, ато я так ничё и не понял из этой темы

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

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

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

А ты не иди с одним крестьянином, и все будет нормально.
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
MasterOfPuppets
23 Mar 2010, 11:57
А может попроще как-нибудь? Например, помимо вышеперечисленных указателей, поменять ещё четыре, со смещением +280h от начала таблицы:
4E2D3Dh
4E2DD7h
4E2EACh
4E2F41h
И всё тип-топ.

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

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

теперь придется что нить другое копать для восстановления душевного равновесия

.
Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся
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.";
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: проверил, расширение свитча внаглую - работает. Теперь надо его аккуратно-аккуратно перенести. Вероятно, завтра.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.