Артефакты, возможность создать 3200 артов |
Здравствуйте, гость ( Вход | Регистрация )
Артефакты, возможность создать 3200 артов |
21 Mar 2010, 01:29
(Сообщение отредактировал feanor - 21 Mar 2010, 01:54)
Сообщение
#41
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Методом тыка починил разборку сборников. По видимому, надо изменять указатели на таблицу бонусов только по адресам 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; } } |
|
|
21 Mar 2010, 23:56
Сообщение
#42
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Вроде нет багов. Теперь надо расширить число читаемых строк из artevent и artraits
|
|
|
23 Mar 2010, 11:57
(Сообщение отредактировал Master Of Puppets - 23 Mar 2010, 11:57)
Сообщение
#43
|
|
Анти-Всë Сообщений: 2 989 Спасибо сказали: 2376 раз |
А может попроще как-нибудь? Например, помимо вышеперечисленных указателей, поменять ещё четыре, со смещением +280h от начала таблицы:
4E2D3Dh 4E2DD7h 4E2EACh 4E2F41h И всё тип-топ. Цитата(feanor @ 21 Mar 2010, 23:56) Теперь надо расширить число читаемых строк из artevent и artraits Я сделал. Могу сказать, как, если не найдёшь. Вообще, ключ ко всем таблицам, снятию ограничений и т.п. - воговское копирование массивов. -------------------- Circle of destruction, hammer comes crushing
Powerhouse of energy Whipping up a fury, dominating flurry We create the battery |
|
|
25 Mar 2010, 11:06
Сообщение
#44
|
|
Анти-Всë Сообщений: 2 989 Спасибо сказали: 2376 раз |
Для 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) -------------------- Circle of destruction, hammer comes crushing
Powerhouse of energy Whipping up a fury, dominating flurry We create the battery |
|
|
25 Mar 2010, 13:51
(Сообщение отредактировал feanor - 25 Mar 2010, 13:54)
Сообщение
#45
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Тьфу, и ведь почти все нашёл теперь придется что нить другое копать для восстановления душевного равновесия .
Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся |
|
|
25 Mar 2010, 18:01
Сообщение
#46
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Все работает.
Код #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 } |
|
|
25 Mar 2010, 18:14
Сообщение
#47
|
|
Etoprostostatus Сообщений: 8 527 Спасибо сказали: 15833 раза |
\\ char* dummyhint = "It is a very blank artifact.";
-------------------- Etoprostopodpis'
|
|
|
25 Mar 2010, 18:34
(Сообщение отредактировал feanor - 25 Mar 2010, 19:01)
Сообщение
#48
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Ну просто blank's уже есть, эти будут very blank.
|
|
|
25 Mar 2010, 20:31
(Сообщение отредактировал feanor - 26 Mar 2010, 00:05)
Сообщение
#49
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Возможно, я криворук и ФИО мои - Бхагаван Рабиндранатыч Шридрахан-Прашантов, но при расширении количества читаемых артефактов из текстовика необходимо, чтобы все они там были. Иначе работает очень нестабильно. Оно так и задумано?)
Придется, видимо, еще и количество строк из текстовиков выдирать Хотя какого чёрта? До текстовиков в лоде один хрен не добраться. Хотя какого чёрта? Просплюсь и сделаю конфиг. Или еще что-нить придумаю |
|
|
26 Mar 2010, 21:08
(Сообщение отредактировал feanor - 26 Mar 2010, 21:18)
Сообщение
#50
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
сделал расширение таблицы даваемых заклинаний. Теперь с нулевого артефакта и до обеда. Думаю над расширением свитча - места освободилось дофига, можно всяких свиткоподобных артефактов штук
Код 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: проверил, расширение свитча внаглую - работает. Теперь надо его аккуратно-аккуратно перенести. Вероятно, завтра. |
|
|
27 Mar 2010, 08:06
(Сообщение отредактировал Master Of Puppets - 27 Mar 2010, 08:07)
Сообщение
#51
|
|
Анти-Всë Сообщений: 2 989 Спасибо сказали: 2376 раз |
Цитата(feanor @ 25 Mar 2010, 13:51) Тьфу, и ведь почти все нашёл теперь придется что нить другое копать для восстановления душевного равновесия . Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся Несомненно. Хотя охота было бы самому научиться их писать, а то у меня даже нет понятия, в чём это делать, вернее - компилировать. -------------------- Circle of destruction, hammer comes crushing
Powerhouse of energy Whipping up a fury, dominating flurry We create the battery |
|
|
27 Mar 2010, 08:44
Сообщение
#52
|
|
Member Сообщений: 97 Спасибо сказали: 80 раз |
Цитата(feanor @ 25 Mar 2010, 20:31) Возможно, я криворук и ФИО мои - Бхагаван Рабиндранатыч Шридрахан-Прашантов, но при расширении количества читаемых артефактов из текстовика необходимо, чтобы все они там были. Иначе работает очень нестабильно. Оно так и задумано?) Придется, видимо, еще и количество строк из текстовиков выдирать Хотя какого чёрта? До текстовиков в лоде один хрен не добраться. Хотя какого чёрта? Просплюсь и сделаю конфиг. Или еще что-нить придумаю Есть такая теория не подтвержденная на артах, но проверенная на монстрах, что увеличение читаемых строк из файла - это не полное решение, т.к. память уже выделена, и при чтении большего количества строк затирается соседняя память, либо чтение нового текстовика затрет новые строки из твоего текстовика. Оптимальным я считаю можно самому выделить память под нужное количество, скопировать то что уже прочитано, а потом заполнить самому новые строки читая их из любого текстовика, можно даже из того же самого. ИМХО. |
|
|
27 Mar 2010, 11:01
(Сообщение отредактировал feanor - 27 Mar 2010, 11:58)
Сообщение
#53
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
2МоР: я все хочу написать ман по написанию дллок с нуля (начиная с установки кодблокса и заканчивая описанием какой-нить простенькой). И всё лень.
2Дьяк. Дык, я и делаю новую таблицу указателей, маллочу всё элементы и переписываю указатели на неё. Копировать, кста, не обязательно - на момент загрузки длл текстовики еще не прочитаны. |
|
|
27 Mar 2010, 14:49
(Сообщение отредактировал feanor - 27 Mar 2010, 15:03)
Сообщение
#54
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Вроде бы расширил кейсы. Некрасиво, но расширил. Теперь в таблице типов типы 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; |
|
|
27 Mar 2010, 19:22
(Сообщение отредактировал feanor - 27 Mar 2010, 19:24)
Сообщение
#55
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Только хотел выложить полный код и длл - наткнулся на баг. Четыре строки
*(int*)0x7059E2 = (int)(arteventtable); *(int*)0x705A68 = (int)(arteventtable); *(int*)0x705FC2 = (int)(arteventtable); *(int*)0x70613B = (int)(arteventtable); гробят воговские !!CA и !!CH. Вероятно, виновата только одна из них - но мне влом думать, какая. Добавлено ([mergetime]1269706512[/mergetime]): Впрочем.. Код+сама длл. Добавлено ([mergetime]1269706921[/mergetime]): Тьфу ж ты блин, совсем забыл о клятом Грохоте Титана, который угробил для тестов и забыл вернуть на место |
|
|
28 Mar 2010, 16:31
(Сообщение отредактировал feanor - 28 Mar 2010, 16:35)
Сообщение
#56
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
emerald-alpha.rar
относительно работает, если не смотреть на кривость обвязки (самих артефактов, описаний и пурги из юнитсхинтов в конфиге) В emerald.cfg хранится количество читаемых строк из artraits и artevents. Привязка заклятий и бонусов к артефактами пока осуществляется в самой длл - было лень что-либо придумывать. |
|
|
30 Mar 2010, 10:30
Сообщение
#57
|
|
Анти-Всë Сообщений: 2 989 Спасибо сказали: 2376 раз |
Надо было предупредить людей с момента регистрации, что доверять мне можно, а проверять - нужно.
Цитата Формат: кол-во артов*4+2. Опечатался. На самом деле - (кол-во артов+2)*4 или кол-во артов*4+8. Возможно, потому у тебя и некоторые глюки. -------------------- Circle of destruction, hammer comes crushing
Powerhouse of energy Whipping up a fury, dominating flurry We create the battery |
|
|
30 Mar 2010, 14:45
(Сообщение отредактировал feanor - 30 Mar 2010, 14:48)
Сообщение
#58
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Не, этот баг я словил вчера (не читалась последняя строка из текстовиков).
|
|
|
08 Apr 2010, 12:56
Сообщение
#59
|
|
Организатор лиги WCL Сообщений: 981 Спасибо сказали: 632 раза |
feanor, будь умницей, напиши пожалуйста строчку по виртуал-паскальному:
extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -------------------- Постоянно играю на рейтинг www.heroes-III.com в онлайне через сервер GameRanger - в HoMM3 SOD или WT. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил
|
|
|
08 Apr 2010, 13:39
Сообщение
#60
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Это точка входа в длл. Основная процедура в паскале, проще говоря.
|
|
|
Текстовая версия | Сейчас: 19 April 2024 - 11:34 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |