Current time: 22.08.2017, 00:24 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Вопросы по моддингу
» (обсуждаем моддинг здесь)
Author Message
Arseniy Offline

Posts: 123
Post: #46

MOP, feanor, спасибо!
Теперь понятно, почему последние три поля поля пустые в ida.

У меня появилась новая интересная идея.
Можно ли добавить несколько новых почв в герои (так, чтобы у замка, оплота и сопряжения у каждого была своя трава, например)?
И можно ли менять почву на клетках карты уже во время игры?
И какой формат у клеток почвы? То есть, в редакторе карт сделать почву размером 1 на X сделать невозможно, минимальный размер по любому направлению 2. Если менять вручную, это будет также?
Я припоминаю, что в какой-то карте вога по-моему были квадраты почвы 1х1, расставленные в шахматном порядке.
И что на деле происходит в тех клетках, где рисунок почвы идет по диагонали? Внутри там одно значение или два?


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
(This post was last modified: 01.04.2014 18:09 by Arseniy.)
01.04.2014 17:54
Find all posts by this user Quote this message in a reply
gamecreator Offline
Administrators

Posts: 7113
Post: #47

Это всё легко и просто можно узнать из ЕРМ-справки. Форматы -> Типы и подтипы почв.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
01.04.2014 20:21
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #48

Quote:Это всё легко и просто можно узнать из ЕРМ-справки. Форматы -> Типы и подтипы почв.
Спасибо.)
Узнать можно многое, но совсем не все. Адресов памяти и организации в ней там нет.


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
02.04.2014 19:38
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #49

1) Подскажите, как поправить Horde Growth. Оказалось, что этот параметр в CRTRAITS.TXT не влияет на игру. О_о
2) Как можно изменить параметры вторичных навыков?
3) Началась игра, загрузилась карта. Как получить ее адрес, адрес клетки на карте?


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
(This post was last modified: 05.04.2014 07:38 by Arseniy.)
04.04.2014 21:20
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 485
Post: #50

Quote:Можно ли добавить несколько новых почв в герои (так, чтобы у замка, оплота и сопряжения у каждого была своя трава, например)?
Предположим, нет.

Quote:И можно ли менять почву на клетках карты уже во время игры?
Да.

Quote:И какой формат у клеток почвы? То есть, в редакторе карт сделать почву размером 1 на X сделать невозможно, минимальный размер по любому направлению 2. Если менять вручную, это будет также?
Нет.

Quote:И что на деле происходит в тех клетках, где рисунок почвы идет по диагонали? Внутри там одно значение или два?
Нет. Одно, конечно, в дефы глянь.

//------------------------------------------------------
Quote:2) Как можно изменить параметры вторичных навыков?
Если без подробностей - вот здесь адреса http://forum.df2.ru/index.php?showtopic=6139

Quote:3) Началась игра, загрузилась карта. Как получить ее адрес, адрес клетки на карте?
У тебя чтоль чужих исходников нет?
09.04.2014 03:58
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #51

Quote:У тебя чтоль чужих исходников нет?
Исходников? О_о
Каких?
У меня есть дизассемблированная база под IDA, но во-первых, что-либо найти в ней очень затруднительно, если не знаешь базового адреса, где искать (то есть подходит только, чтобы что-то уточнять), во-вторых, как я понимаю, карта создается в динамической памяти и в иде ее быть не может.
За ответы спасибо, ссылка
Quote:http://forum.df2.ru/index.php?showtopic=6139
очень годная.


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
09.04.2014 22:02
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 485
Post: #52

Quote:Исходников? О_о
Каких?
WoG, сергроевская база, HD где-то был, декомпилят по сергрожевской базе.

Quote:У меня есть дизассемблированная база под IDA, но во-первых, что-либо найти в ней очень затруднительно, если не знаешь базового адреса, где искать (то есть подходит только, чтобы что-то уточнять
если это готовая - по названиям ищи

Quote:во-вторых, как я понимаю, карта создается в динамической памяти и в иде ее быть не может.
вкладку Structs нажми в сергробазе.




Энивей:

Quote:3) Началась игра, загрузилась карта. Как получить ее адрес, адрес клетки на карте?

Адвенчаменеджер
Code:
#define o_AdvMgr (*(_AdvMgr_**)0x6992B8)
В нем
Code:
..
_GameMap_* map; //+92 (десятичное)
..

Или

Игроменеджер
Code:
#define o_GameMgr (*(_GameMgr_**)0x699538)

В нем:
Code:
..
  _MapHeader_ map_header; // +1F86Ch
  _GameMap_ Map; // +1FB70h
..

Теперь:

Code:
NOALIGN struct _GameMap_ : public _Struct_
{
  // Список шаблонов объектов карты.
  _List_<_Template_> Templates; // +0
  // Список объектов на карте.
  _List_<_Object_> Objects; // +16
  
  _byte_ f20[128]; // +32
  
  // Список лагерей героя на карте.
  _List_<_PlaceHolder_> PlaceHolders; // +160
  
  _byte_ fB0[32]; // +176
  
  // Адрес 3-мерного массива [L][Y][X], хранящего свойства объекта каждой клетки карты.
  _MapItem_* items; // +208
  // Размер карты (по-горизонтали и по-вертикали).
  _int_ size; // +212
  // Есть ли у карты подземный уровень.
  _bool8_ has_underground; // +216
  
  _byte_ fD9[3715]; // +217
  
  
  //normal
  // Получение клетки по координатам (из массива items).
  inline _MapItem_* GetItem(_int_ x, _int_ y, _int_ z)
  {
     return CALL_4(_MapItem_*, __thiscall, 0x4086D0, this, x, y, z);
  }
};

Или, если надо чистую UN:C реализацию - вот исходник этой 0x4086D0

Code:
//----- (004086D0) --------------------------------------------------------
int __thiscall GetMapItemPoByXY(int this, int a2, int a3, int a4)
{
  return *(_DWORD *)(this + 208) + 38 * (a2 + *(_DWORD *)(this + 212) * (a3 + a4 * *(_DWORD *)(this + 212)));
}

Теперь сама _MapItem_


Code:
NOALIGN struct _MapItem_ : public _Struct_
{
_dword_  setup; //+0
_byte_  land; // +4
_byte_  land_type;//+5
_byte_  river;//+6
_byte_  river_type;//+7
_byte_  road;//+8
_byte_  road_type;//+9
_word_  field_0A;//+10
_byte_  mirror;//+12
_byte_  attrib;//+13
_word_  field_0E_bits;//+14
_word_  field_10;//+16
_dword_  draw;//+18
_dword_  draw_end;//+22
_dword_  draw_end_2;//+26

_dword_  object_type;//+30

_word_  os_type; //+34
_word_  draw_num;//+36
}


Quote:1) Подскажите, как поправить Horde Growth. Оказалось, что этот параметр в CRTRAITS.TXT не влияет на игру. О_о

Code:
// 642E30: using guessed type int HordeBuildings[4];
..
// 6887F0: using guessed type _HordeBuildingData_ TownHordeBuildings[18];
Code:
00000000 _HordeBuildingData_ struc ; (sizeof=0x10)
00000000 Monster             dd ?
00000004 Count               dw ?                                    ; base 10
00000006 Level               dw ?                                    ; base 10
00000008 UpgMonster          dd ?
0000000C UpgCount            dw ?                                    ; = Level + 7
0000000E UpgLevel            dw ?                                    ; base 10
00000010 _HordeBuildingData_ ends
(This post was last modified: 09.04.2014 23:05 by feanor.)
09.04.2014 22:53
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #53

Огромное спасибо!
Буду разбираться.

UPDATE: Hordes заработали. Правда для чего нужно
using guessed type int HordeBuildings[4],
я не понял. Работает без него.


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
(This post was last modified: 10.04.2014 23:30 by Arseniy.)
10.04.2014 11:51
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #54

#define o_GameMgr (*(_GameMgr_**)0x699538)
Я не понимаю, что делать с вот этим вот.
Вот мой код:
Quote:int ptr;
int result = ReadProcessMemory(_handle, LPCVOID(6919480), &ptr, 4, (SIZE_T*)&_readBytes);
int ptr2;
result = ReadProcessMemory(_handle, LPCVOID(ptr), &ptr2, 4, (SIZE_T*)&_readBytes);
int mapSize;
result = ReadProcessMemory(_handle, LPCVOID(ptr2 + 129904 + 212), &mapSize, 4, (SIZE_T*)&_readBytes);
Что я делаю не так?


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
(This post was last modified: 11.04.2014 13:01 by Arseniy.)
11.04.2014 12:54
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 485
Post: #55

Code:
int advManager;
int result = ReadProcessMemory(_handle, LPCVOID(0x699538), &advManager, 4, (SIZE_T*)&_readBytes);
int gameMap;
result = ReadProcessMemory(_handle, LPCVOID(ptr+0x1FB70), &gameMap, 4, (SIZE_T*)&_readBytes);
int mapSize;
result = ReadProcessMemory(_handle, LPCVOID(ptr2 + 212), &mapSize, 4, (SIZE_T*)&_readBytes);

При этом, если делать из-под процесса игры, лучше использовать

Code:
int advManager = *(int*)0x699538;
int gameMap= *(int*)(advManager+0x1FB70);
int mapSize= *(int*)(gameMap+212);
или говнокодом
Code:
int mapSize = *(int*)((*(int*)((*(int*)0x699538)+0x1FB70))+212);

А еще лучше структуры, своеописанные или готовый заголовочник
(This post was last modified: 11.04.2014 16:43 by feanor.)
11.04.2014 13:59
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #56

Спасибо! Код игроменеджера у меня не заработал, заработал следующий через адвенчерменеджер:
Quote:int advManager;
ReadProcessMemory(_handle, LPCVOID(0x6992B8), &advManager, 4, (SIZE_T*)&_readBytes);
int gameMap;
ReadProcessMemory(_handle, LPCVOID(advManager + 92), &gameMap, 4, (SIZE_T*)&_readBytes);
int mapSize;
ReadProcessMemory(_handle, LPCVOID(gameMap + 212), &mapSize, 4, (SIZE_T*)&_readBytes);
Из процесса игры было бы делать проще, но я пока не разобрался с патчером, поэтому прописываю мод при запущенной игре из своего ехе.


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
11.04.2014 17:41
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 485
Post: #57

Quote:Из процесса игры было бы делать проще, но я пока не разобрался с патчером
зачем патчер?
12.04.2014 01:18
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #58

Ну я использую конфигурацию Heroes 3 Complete Edition + HD Mod, как я понимаю, чтобы модифицировать ехе в данном случае, нужно api патчера использовать, чтобы потом все срослось.
Или в винде можно запустить мой код в процессе игры просто через виндовозное api?

У меня тут еще вопрос появился. Я пока не разобрался, как организовано хранение объектов (героев, замков, существ) и их привязка к карте.
В _MapItem_ есть следующие поля, которые могут иметь к этому отношения:
Dword SetUp; // +0
...
int OType; // +1E
Word OSType; // +22
Как я понял, в первое кидается указатель на нейтральных монстров, если они есть, иначе 0, правильно?
Про последние два в документации ничего толкового не написано и я не нашел какого-то обобщенного типа вроде Object, в котором может содержаться указатель на любой объект (героя, шахту и т.д.)
Есть тип _Types_ для карты, но как я понял, он для препятствий.
В общем, мне нужно из клетки на карте вытащить, стоит ли там монстр, герой, есть ли в ней вход в замок, шахту и получить указатель на этот объект. Для героя, как я понимаю, он потом должен быть приведен к _THero_/_Hero_, для замка к _CastleSetup_.
Или из карты это вытащить нельзя и надо отдельно просматривать список городов и героев?

По структуре _CMonster_
Quote:struct _CMonster_{
unsigned Number :12; // +00 число
unsigned Agression : 5; // +0C 1C-присоединяется, 0A-кровожадное
unsigned NoRun : 1; // +12 не убегает 3.58 fix
unsigned NoMore : 1; // +11 не растет
unsigned SetUpInd : 8; // +13 номер в настройке объектов (P1+44)
unsigned _u1 : 4; // +1B
unsigned HasSetUp : 1; // +1F имеет настройку структуры монстра
};
Непонятны смыслы полей SetUpInd, _u1, HasSetUp. Как из нее получить номер монстра, тот же, что используется CRTRAITS.TXT, а из него параметры монстра?


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
(This post was last modified: 12.04.2014 06:52 by Arseniy.)
12.04.2014 06:37
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 485
Post: #59

Quote:Про последние два в документации ничего толкового не написано и я не нашел какого-то обобщенного типа вроде Object, в котором может содержаться указатель на любой объект (героя, шахту и т.д.)
Это тип и подтип объекта.

Quote:Ну я использую конфигурацию Heroes 3 Complete Edition + HD Mod, как я понимаю, чтобы модифицировать ехе в данном случае, нужно api патчера использовать, чтобы потом все срослось.
Совершенно не обязательно. Патчер, в общем-то, нужен только ради удобства написания хуков.
Дллки HD-мод может подгружать и так.
12.04.2014 16:11
Find all posts by this user Quote this message in a reply
Arseniy Offline

Posts: 123
Post: #60

Я понял, что Dword SetUp; // +0 относится только к тому, получают ли игроки за убийство монстра, если на этой клетке монстр, ресурсы.
Самый главный вопрос остается открытым : как получить указатель на тот объект, который лежит в конкретной клетке карты, если в _MapItem_ этого указателя нет?
Допустим, по _MapItem_ стало ясно, что в этой клетке лежит город сопряжение. Как получить указатель на именно то актуальное сопряжение, которое там находится?


- Как я сегодня балагурю?
- Вы прекрасны, сир! (с)
12.04.2014 19:28
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2017 MyBB Group