IPB

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Артефакты, возможность создать 3200 артов
feanor
сообщение 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;
               }
}

Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 21 Mar 2010, 23:56
Сообщение #42

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Вроде нет багов. Теперь надо расширить число читаемых строк из artevent и artraits sad.gif
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 23 Mar 2010, 11:57 (Сообщение отредактировал Master Of Puppets - 23 Mar 2010, 11:57)
Сообщение #43

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2376 раз




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

4E2D3Dh
4E2DD7h
4E2EACh
4E2F41h

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

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

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


--------------------
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 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



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 25 Mar 2010, 13:51 (Сообщение отредактировал feanor - 25 Mar 2010, 13:54)
Сообщение #45

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




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

Впрочем, огромное спасибо, если надо будет что в длл зашить - обращайся biggrin.gif
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 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
}



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 25 Mar 2010, 18:14
Сообщение #47

Etoprostostatus
Сообщений: 8 527
Спасибо сказали: 15833 раза




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

smile.gif


--------------------
Etoprostopodpis'
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 25 Mar 2010, 18:34 (Сообщение отредактировал feanor - 25 Mar 2010, 19:01)
Сообщение #48

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Ну просто blank's уже есть, эти будут very blank.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 25 Mar 2010, 20:31 (Сообщение отредактировал feanor - 26 Mar 2010, 00:05)
Сообщение #49

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Возможно, я криворук и ФИО мои - Бхагаван Рабиндранатыч Шридрахан-Прашантов, но при расширении количества читаемых артефактов из текстовика необходимо, чтобы все они там были. Иначе работает очень нестабильно. Оно так и задумано?)
Придется, видимо, еще и количество строк из текстовиков выдирать
Хотя какого чёрта? До текстовиков в лоде один хрен не добраться.
Хотя какого чёрта? Просплюсь и сделаю конфиг. Или еще что-нить придумаю
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 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: проверил, расширение свитча внаглую - работает. Теперь надо его аккуратно-аккуратно перенести. Вероятно, завтра.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 27 Mar 2010, 08:06 (Сообщение отредактировал Master Of Puppets - 27 Mar 2010, 08:07)
Сообщение #51

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2376 раз




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

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

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


--------------------
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery

Go to the top of the pageAdd Nick
 
+Quote Post
Дьяк
сообщение 27 Mar 2010, 08:44
Сообщение #52

Member
Сообщений: 97
Спасибо сказали: 80 раз




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

Есть такая теория не подтвержденная на артах, но проверенная на монстрах, что увеличение читаемых строк из файла - это не полное решение, т.к. память уже выделена, и при чтении большего количества строк затирается соседняя память, либо чтение нового текстовика затрет новые строки из твоего текстовика. Оптимальным я считаю можно самому выделить память под нужное количество, скопировать то что уже прочитано, а потом заполнить самому новые строки читая их из любого текстовика, можно даже из того же самого. ИМХО.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 27 Mar 2010, 11:01 (Сообщение отредактировал feanor - 27 Mar 2010, 11:58)
Сообщение #53

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




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

2Дьяк. Дык, я и делаю новую таблицу указателей, маллочу всё элементы и переписываю указатели на неё. Копировать, кста, не обязательно - на момент загрузки длл текстовики еще не прочитаны.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 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;


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 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]):
Тьфу ж ты блин, совсем забыл о клятом Грохоте Титана, который угробил для тестов и забыл вернуть на место sad.gif
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 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.
Привязка заклятий и бонусов к артефактами пока осуществляется в самой длл - было лень что-либо придумывать.
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 30 Mar 2010, 10:30
Сообщение #57

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2376 раз




Надо было предупредить людей с момента регистрации, что доверять мне можно, а проверять - нужно. gigi.gif
Цитата
Формат: кол-во артов*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

Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 30 Mar 2010, 14:45 (Сообщение отредактировал feanor - 30 Mar 2010, 14:48)
Сообщение #58

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Не, этот баг я словил вчера (не читалась последняя строка из текстовиков).
Go to the top of the pageAdd Nick
 
+Quote Post
SAG19330184
сообщение 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. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 08 Apr 2010, 13:39
Сообщение #60

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Это точка входа в длл. Основная процедура в паскале, проще говоря.
Go to the top of the pageAdd Nick
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 19 April 2024 - 11:34
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика