IPB

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

23 страниц V  « < 16 17 18 19 20 > »   
Reply to this topicStart new topic
> Обсуждение инженерного анализа
feanor
сообщение 08 Dec 2015, 21:51
Сообщение #341

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




Эм, ну должно работать вроде.
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 08 Dec 2015, 21:52 (Сообщение отредактировал igrik - 08 Dec 2015, 22:22)
Сообщение #342

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




неа, не работает. Код в точности как я приложил в спойлере

upd: вру:
хук "hook_YAtrCast" (FireErmEvent(79001)) вызывается дважды,
"hook_YAfterShoot" (FireErmEvent(79002)) не вызывается
"hook_YAfterStrike" (FireErmEvent(79003)) вызывается единожды (как и должен)

Видимо где-то я забокопорил, но я в упор не вижу где

* * * * *
upd: ми просто жуткая баклашка, я разобрался.
по первому - у меня уже был плагин с хуком по этому адресу, поэтому дважды
по второму - неправильный адрес хука
по третьему - все было ок
Но это заняло целый час. Господь в одних носках!!!

Все равно мэрси


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 10 Dec 2015, 17:34 (Сообщение отредактировал feanor - 10 Dec 2015, 17:41)
Сообщение #343

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




Цитата
x3 - кто кастует и описалово как в !!MM: 0 - герой (c вычетом маны и невозможностью каста в этом раунде битвы), 1 - монстр, 2 - арт (зачастую "что попало" в !!MM), 3 - герой (без вычета маны), 4 - герой (без вычета маны + бистро бистро анимация)
Там не совсем что попало, там либо имя артефакта с номером, равным номеру спелла, либо Альянс и Доспехи для соответствующих спеллов (прост где ты видишь в параметрах передаваемый номер арта?)

я в ТоЕ кастовал так

Код
void CastArtifactSpell(int artifact, int spell, int duration)
{
    char* combatManager = (char*)(*((int*)0x699420));
        char *tmp;

        tmp = GetArtifactRecord(spell)->name;
        GetArtifactRecord(spell)->name = GetArtifactRecord(artifact)->name;
        if ( (unsigned char)sub_5A43E0( combatManager, spell, 3, *(int *)(combatManager + 78528), 1, 2) )
          CastBattleSpell(combatManager, spell, -1, 2, -1, 3, duration);
        GetArtifactRecord(spell)->name = tmp;
}


3 и 4, кстати, не предусмотрены конструкцией вроде, так что я очень хз насчет них
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 10 Dec 2015, 18:17
Сообщение #344

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата
Там не совсем что попало, там либо имя артефакта с номером, равным номеру спелла, либо Альянс и Доспехи для соответствующих спеллов (прост где ты видишь в параметрах передаваемый номер арта?)

Да, я не правильно выразился: там имя артефакта с номером спела, и Альянс или Доспехи


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 19 Dec 2015, 13:02 (Сообщение отредактировал Richter - 21 Dec 2015, 15:19)
Сообщение #345

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




координаты ZGODBON.DEF
ID#139(левая) ;X - 754830h(1b) Y - 75482Bh(4b);
ID#107(правая);X - 7548AAh(1b) Y - 7548A5h(4b);

Менять кадры можно следующим образом;
Для ID#139 Меняем ID на неюзаный, скажем 300 по адресу 754822h,
Далее по средствам ERM ставим нужный кадр по адресу 75481Fh.
для 107, id по адресу 75489Fh, кадр 75489Ch
Обновление Def'a не запилино в функции Dlg_Hero_Update(а жаль), поэтому обновление кадра происходит только после открытия окна героя.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 25 Mar 2016, 19:59 (Сообщение отредактировал AlexSpl - 25 Mar 2016, 20:00)
Сообщение #346

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




2feanor:

Вы писали:

Код
PPAdvManager  = ^PAdvManager;
  PAdvManager   = ^TAdvManager;
  TAdvManager   = PACKED RECORD
    Dummy:            ARRAY [0..79] OF BYTE;
    RootDlgIdPtr:     PPINTEGER;
    CurrentDlgIdPtr:  PPINTEGER;
    (* Dummy *)
  END; // .RECORD TAdvManager


  AdvManagerPtr:  PPAdvManager  = Ptr($6992D0);


PROCEDURE GetGameState (OUT GameState: TGameState);
BEGIN
  IF AdvManagerPtr^.RootDlgIdPtr <> NIL THEN BEGIN
    GameState.RootDlgId :=  AdvManagerPtr^.RootDlgIdPtr^^;
  END // .IF
  ELSE BEGIN
    GameState.RootDlgId :=  0;
  END; // .ELSE
  IF AdvManagerPtr^.CurrentDlgIdPtr <> NIL THEN BEGIN
    GameState.CurrentDlgId  :=  AdvManagerPtr^.CurrentDlgIdPtr^^;
  END // .IF
  ELSE BEGIN
    GameState.CurrentDlgId  :=  0;
  END; // .ELSE
END; // .PROCEDURE GetDialogsIds


Похоже, что это то, что нужно, если GameState.RootDlgId - фиксированная и уникальная величина для карты приключений в любой игре. Только есть пара вопросов:
1. ID диалогов в Героях 3 действительно фиксированные величины?
2. Если так, то какой RootDlgId соответствует карте приключений? У меня получилось 6530532. Так ли это?

Получаю так (пока без проверки на nil):

Код
function  GetH3RootDlgID: Integer;
begin
  Result := RPM_INT(RPM_INT(RPM_INT($6992D0) + 80));
end;

RPM_INT - чтение Integer (адрес - аргумент).
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 25 Mar 2016, 20:04 (Сообщение отредактировал feanor - 25 Mar 2016, 20:07)
Сообщение #347

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




Да, 63A5E4 - фиксированный адрес.
Код
// 63A5E4: using guessed type int (__thiscall *AdvMapDlg_VTable)(void *, char);


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 26 Mar 2016, 01:46
Сообщение #348

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Добавил код для разных версий (вдруг кому пригодится, чтобы не тратить время на поиски адресов). Вписал Вас в Special Thanks (надеюсь, Вы не против).

Код
// Subverions
SV_Complete_RU  = 0;
SV_Complete_EN  = 1;
SV_SoD_EN       = 2;
SV_Chronicles   = 3;
SV_HotA         = 4;      

// Heroes Chronicles
CHAPTER_1       = 0;
CHAPTER_2       = 1;
CHAPTER_3       = 2;
CHAPTER_4       = 3;
CHAPTER_5       = 4;
CHAPTER_6       = 5;
CHAPTER_7       = 6;
CHAPTER_8       = 7;
CHAPTER_UNKNOWN = 8;

...

H3AdvManagerAddr: array[SV_Complete_RU..SV_HotA] of DWORD =
($69CA20, $699280, $6992D0, $000000, $6992D0);

HCAdvManagerAddr: array[CHAPTER_1..CHAPTER_8] of DWORD =
($63B458, $63B450, $63B458, $63D8A0, $63B458, $63D858, $63E8C0, $63E8D0);

H3MapDlgID: array[SV_Complete_RU..SV_HotA] of DWORD =
($63B5F4, $63A5E4, $63A5E4, $000000, $63A5E4);

HCMapDlgID: array[CHAPTER_1..CHAPTER_8] of DWORD =
($5EB594, $5EB594, $5EB594, $5EB594, $5EB594, $5EB594, $5EB5A4, $5EB5A4);

...

function GetH3RootDlgID: DWORD;
var RootDlgIDAddr: DWORD;
begin
  if SubVer <> SV_Chronicles
  then RootDlgIDAddr := RPM_DWORD(RPM_DWORD(H3AdvManagerAddr[SubVer]) + $50)
  else RootDlgIDAddr := RPM_DWORD(RPM_DWORD(HCAdvManagerAddr[HCChapter]) + $50);
  if RootDlgIDAddr <> 0 then Result := RPM_DWORD(RootDlgIDAddr) else Result := 0;
end;

...

function isAdvMapActive: Boolean;
begin
  case Version of
    // Temp Solution
    V_H1: Result := RPM_WORD(GetH1HeroAddr(0) + $3D) <> 0;
    V_H2: Result := RPM_BYTE(GetH2HeroAddr(0) + $63) <> 0;
    // Temp Solution
    else
    if SubVer <> SV_Chronicles then Result := GetH3RootDlgID = H3MapDlgID[SubVer]
      else Result := GetH3RootDlgID = HCMapDlgID[HCChapter];
  end;
end;


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Mar 2016, 00:30 (Сообщение отредактировал AlexSpl - 27 Mar 2016, 00:43)
Сообщение #349

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




А нет ли случайно в менеджере приключений (advManager) Героев 3 указателя на таблицу виртуальных функций класса icon (const icon::`vftable')? Заметил, что в Героях 1 и 2 этот указатель не равен nil, только если идёт игра на карте приключений.
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 01 Jul 2016, 22:50 (Сообщение отредактировал igrik - 01 Jul 2016, 22:51)
Сообщение #350

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




feanor, подскажи как это (хоть и работающее) безобразие привести к более презентабельному виду (вложиться в пару строк)
А еще лучше организовать в функцию и показать способ вызова этой функции, которая будет возвращать адрес структуры активного стека. И еще желательно не через __thiscall.
Код
char* combatManager = (char*)(*((int*)0x699420));  // это this_

int j = *(int*)(this_ + 78524);       // номер активного стека текущей стороны 0 ... 20
int i = *(int*)(this_ + 78520);       // номер активной стороны
int v3 = i * 14 + i * 7 + j;          // переход к номеру стека 0 ... 41
int v1 = v3 * 1352;                   // длина структуры одного стека
int v2 = *(int*)(this_ + 21708 + v1); // получить структуру стека


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Barin
сообщение 11 Jul 2016, 11:36 (Сообщение отредактировал Barin - 11 Jul 2016, 12:19)
Сообщение #351

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




Мне нужно в меню выбора кампаний SoD отключить некоторые окна, выглядеть должно так:


Для начала хочу презентовать 1 кампанию, другие должны быть заблокированы.
Наверняка можно сделать это подобием таких команд:

Цитата
сместить кнопки далеко за пределы экрана: для бин файла
; кнопка "Синглплеер"
63E6B0 FFFD
; кнопка "Мультиплеер"
63E6B8 FFFD
; кнопка "Обучение"
63E6C8 FFFD
; кнопка "Во имя богов"
456C6C AAAA
; кнопка "Клинок Армагедона"
456CE6 AAAA
; кнопка "Возраждение Эратии"
63BBF0 AAAA
; кнопка "Выбрать"
63BBF8 AAAA


Кто может помочь?

p.s Оставшиеся 3 окна тоже бы отключить.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 18 Sep 2016, 19:42
Сообщение #352

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(feanor @ 18 Sep 2016, 14:33) *
Проиграть анимацию стека.

Код
!!UN:C6919200/4/?y10;
!!VRy20:Sx1 *1352 +21708 +y1; // x1 = номер стека
!!SN:E4482656/2/y20/13/-1/0; //13 - атака вниз
!!SN:E4482656/2/y20/2/1/0; //восстанавливаем исходное положение (стойка)

Еще бы разобраться с массовой анимацией стеков.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Sep 2016, 20:55
Сообщение #353

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




Попробуй в функции из этого поста
http://forum.df2.ru/index.php?s=&showt...st&p=607236
подменить номер для анимации урона

или самому прокручивать комбатанимэйшнстеп
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 14 Dec 2016, 21:43 (Сообщение отредактировал AlexSpl - 14 Dec 2016, 21:51)
Сообщение #354

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Подскажите, пожалуйста, как узнать, проходима ли героем клетка с координатами x, y, z. Без учёта объектов, которые герой может "убрать с пути" (сундуки, ресурсы, артефакты и т.п.).

Или хотя бы функцию, которая строит маршрут героя.
Go to the top of the pageAdd Nick
 
+Quote Post
Barin
сообщение 01 May 2017, 16:06 (Сообщение отредактировал Barin - 01 May 2017, 16:20)
Сообщение #355

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




Цитата(igrik @ 01 May 2017, 15:52) *
Цитата(Barin @ 01 May 2017, 14:41) *
Хорошо, работает для объектов которые можно построить. А как определить подобные декоративные объекты непонятно:

Сначала проверь указанное, а потом говори что "непонятно". Откуда эта инфа, что можно менять только строящиеся объекты? Ты проверял? Конечно нет. Поэтому и не знаешь, что можно.
И в сотый раз тебе повторять уже надоело - есть специальные темы для обсуждений. А эти темы для чистой информации. Смекаешь?


Проверял. В ERM справочнике предоставлен список только объектов. В списке нет подобных декоративных дефов. Там есть значения без информации: постройки 20, 27, 28, 29 - попробовал не сработало. Например:

!!VRy1:S8; //city (e.g. Castle)
!!VRy2:S20; //building ID (e.g Tavern)

!!VRy6:S10; //frames num in new def (там 10 кадров)
!!VRy3:S1; //new x
!!VRy4:S1; //new y

!!VRy5:Sy1 *44 +y2 *6 +6859276;

!!UN:Cy5/2/y6;
!!VRy5:+2;
!!UN:Cy5/2/y3;
!!VRy5:+2;
!!UN:Cy5/2/y4;

Короче, через CM подобный объект не определяется, имеет значение -1 как и фон города.

Где посмотреть ID водопада?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 01 May 2017, 20:13
Сообщение #356

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(Barin @ 01 May 2017, 16:06) *
Где посмотреть ID водопада?
22


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 01 May 2017, 20:40
Сообщение #357

😸🧡✊✌️
Сообщений: 16 495
Спасибо сказали: 3402 раза




Цитата(Barin @ 01 May 2017, 16:06) *
Где посмотреть ID водопада?
В ERM-справке по ресейверу !!CM:I щёлкнуть по слову "место".


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post
Barin
сообщение 09 Jun 2017, 12:47 (Сообщение отредактировал Barin - 09 Jun 2017, 12:47)
Сообщение #358

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




Команду RedirectFile использую для подмены дефов в конкретных картах, но с форматом .txt трюк не проходит.

Например:
!?PI;
!!SN:L^Era.dll^/?y1 Ay1/^RedirectFile^/?y2 Ey2/1/^HCTRAITS.txt^/^my.txt^; !!VRy1:S0; !!VRy2:S0;

HCTRAITS.txt - здесь список классов героев.
my.txt - мои новые названия.

Как можно это сделать?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 09 Jun 2017, 16:01 (Сообщение отредактировал igrik - 09 Jun 2017, 16:04)
Сообщение #359

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(Barin @ 09 Jun 2017, 12:47) *
Как можно это сделать?
Смысла в этом нет.
HCTRAITS.txt грузится при старте экзешника и всего один раз.

Но пожешь использовать этот способ. Точно не знаю - сработает ли, и будет ли утечка памяти ли. Ли-ли-ли...
Цитата
!!VRz1:S^1111.txt^; полное название тектовика в z1
!!UN:C5138903/4/9597928; подменить ссылку на адрес переменной z1
!!SN:E5138896/1; функция загрузки "hctraits.txt"


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Barin
сообщение 10 Jun 2017, 12:02
Сообщение #360

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




Цитата(igrik @ 09 Jun 2017, 16:01) *
Цитата(Barin @ 09 Jun 2017, 12:47) *
Как можно это сделать?
Смысла в этом нет.
HCTRAITS.txt грузится при старте экзешника и всего один раз.

Но пожешь использовать этот способ. Точно не знаю - сработает ли, и будет ли утечка памяти ли. Ли-ли-ли...
Цитата
!!VRz1:S^1111.txt^; полное название тектовика в z1
!!UN:C5138903/4/9597928; подменить ссылку на адрес переменной z1
!!SN:E5138896/1; функция загрузки "hctraits.txt"



Если есть вероятность ошибок, лучше откажусь от этой затеи. Тем более мне нужно было не только hctraits.txt, но и другие текстовики, например DWELLING.txt - чтобы подменять в городе названия строений Оплота на названия строений Града. Пользуясь случаем, не подскажите ли, можно этого добиться через ERM? Что-то не встретил команду в справочнике. Ресейвер !!CA не даёт такой возможности, а в !!UN есть команда только для узнавания названия - N2/z#/$1/$2 – имя здания ($2) в городе $1.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

23 страниц V  « < 16 17 18 19 20 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20 December 2025 - 18:58
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика