Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обсуждение инженерного анализа
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
Richter
Цитата(feanor @ 17 Jan 2015, 01:00) *
Так. Трэш-сеанс гадания по геройским внутренностям открыт
....
....
!!UN:C4854731/1/233;
!!UN:C4854732/4/182;

ура, можно постить

а еще можно потестить
а потом постить
но кто так делает?

Обалдеть! Такое сообщение составить ночью, уже большая работа, не говоря про анализ. Сейчас буду тестить)
feanor
Да, это все про банки только, которые тип 16
Пирамиды, корабли, утопы и чтотамеще затрагиваться не будут
Richter
Цитата(feanor @ 17 Jan 2015, 01:10) *
Да, это все про банки только, которые тип 16
Пирамиды, корабли, утопы и чтотамеще затрагиваться не будут

Это понятно. У меня такой вопрос к Вам сегодня ещё, картинку специальности не получается перетащить дальше первой четверти экрана героя по оси х, три дня копаю и ничего не понятно.
hippocamus
Цитата(Gavek @ 16 Jan 2015, 21:52) *
Писал МоР'у в личку, пока нет ответа. Так что согласен полностью.

Я - тоже ) Пиши берсеркеру и Бесу, Бесу даже перспективнее )
Richter
Цитата(feanor @ 17 Jan 2015, 01:00) *
Так. Трэш-сеанс гадания по геройским внутренностям открыт

!!UN:C4854731/1/233;
!!UN:C4854732/4/182;

ура, можно постить

Feanor, сейчас тестирую, по кнопке "ОК" отлично работает, а как отказаться от боя через !!UN:C?
hippocamus
Gavek
Молись демиургу Феанору - он изволил снизойти и помочь тебе - молись со мною!
О, великий Феаноре! Имя твое страшно, воля твоя неисповедима! Слова твои достойны записи в бессмертные фолианты! Да будут благословенны твои слова, да будет несказанна во веки твоя помощь!
Да примет твои дары великий Ассемблер, и да полижет твои стопы презренный Си++!
Richter
Согласен. Feanor хорош)
Richter
Назрел вопросик. Где сохраняется значение о статусе монстра при клике на нём на карте, когда в армии есть воры или при колдовстве "видения"?
igrik
!!! все накопал feanor
Цитата
ZVSE
!?OB16/1; посещение сокровищницы гномов
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4 Ey4/1/^erm_hooker^;
!!SN&v1>0:Ey2/1/4854731/31895;

!?FU31895;
!!SN:X?y3/0;
; EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
; RetAddr (32)
!!VRy4:Sy3 +32;
!!IF:Q1^Желаете ли вы посетить Сокровищницу Гномов?^;
!!UN&1:Cy4/4/4854918; // да
!!UN&-1:Cy4/4/4854782; // нет

Необходим плагин erm_hooker
скрипт на отмену стандартного диалога и создание своего
igrik
Цитата
Для сокровищницы если первый раз отменить, бой уже не вызывается, наверно параметры надо обратно менять?

У меня все ок. Покажи весь скрипт, который используешь для сокровищницы
feanor
..я вот задумался

А что, !!OB:MRS не работают для сокровищниц?
Bes
Цитата(hippocamus @ 16 Jan 2015, 23:57) *
Цитата(Gavek @ 16 Jan 2015, 21:52) *
Писал МоР'у в личку, пока нет ответа. Так что согласен полностью.

Я - тоже ) Пиши берсеркеру и Бесу, Бесу даже перспективнее )

чего Bes'у то писать, когда он не знает ничего по инженерному шаманству?! полный ноль! только бинарники умеет компилить при наличии адресов нужных..
и это факты, никакой его классической уничижительности в свой адрес тут нет, поверьте
MasterOfPuppets
Цитата(Algor @ 16 Jan 2015, 21:19) *
К нему бы тебе обратиться, но он тут гость не частый (ну или анонимно-молчаливый, хз).

Мои способности к моддингу Героев похоронены чуть более, чем полностью. О чем я, собственно, не жалею.
Algor
Цитата(MasterOfPuppets @ 17 Jan 2015, 18:22) *
Цитата(Algor @ 16 Jan 2015, 21:19) *
К нему бы тебе обратиться, но он тут гость не частый (ну или анонимно-молчаливый, хз).

Мои способности к моддингу Героев похоронены чуть более, чем полностью. О чем я, собственно, не жалею.

Вот за этим я и советовал обратиться к тебе ))
И да, рад видеть.
Richter
Цитата(igrik @ 17 Jan 2015, 17:07) *
У меня все ок. Покажи весь скрипт, который используешь для сокровищницы

!?DL;
!!VRv9756&v998=206/v999=34:Sv999;
!!VRv9757&v998=206/v999=32:Sv999;

!?OB16;
!!SN:L^erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4 Ey4/1/^erm_hooker^(эту строчку не пишу, т.к. пишет:"-неверный синтаксис для !!SN");
!!SN:Ey2/1/4854731/31865;

!?FU31865;
!!SN:X?y3/0;
; EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
; RetAddr (32)
!!VRy4:Sy3 +32;
!!UN&v9756=34:Cy4/4/4854918; // Да
!!UN&v9757=32:Cy4/4/4854782; // Нет
Richter
Цитата(feanor @ 17 Jan 2015, 18:45) *
..я вот задумался

А что, !!OB:MRS не работают для сокровищниц?

!!OB:MRS; работают

только как с помощью этого:

из ERM-HELP
version 2.81d
M$1/$2/$3
Эта команда может отключить множество сообщений и вопросов для объекта в любое время:
$1 – какому игроку (-1 – для всех)
$2 – отменить (1) следующее сообщение при посещении
$3 – следующий статус $2 после виртуального или реального появления сообщения
Это не настоящая отмена, это АВТОответ (по умолчанию – «нет»). Все сообщения через IF – ресейвер будут показаны как обычно.


получить информацию о монстре, которую дают воры и "видения"? Может способность воров герою передать? Но как?
feanor
С помощью этого - никак.
А вот сообщения сокровищниц-пирамид и т.д. отключаются вроде именно им.

Richter
Цитата(feanor @ 17 Jan 2015, 23:57) *
С помощью этого - никак.
А вот сообщения сокровищниц-пирамид и т.д. отключаются вроде именно им.

Sorry затупил, о том и речь шла.
feanor
Так, кажется, дружественность монстров считается непосредственно в процидурке диалога

Код
//----- (004170B0) --------------------------------------------------------
void __thiscall Dlg_MonsterRMHint(void *this, _Dlg_ *a2, int a3, int a4)
{
  int v4; // ecx@1
  void *v5; // ebx@1
  int v6; // edi@1
  int v7; // esi@1
  _Hero_ *v8; // esi@2
  int v9; // ecx@2
  __int16 v10; // cx@3
  int v11; // eax@6
  int v12; // ecx@6
  int v13; // eax@6
  int v14; // edx@6
  signed int v15; // eax@6
  int v16; // edx@6
  int v17; // eax@6
  int v18; // ecx@6
  int v19; // esi@8
  _Dlg_ *v20; // eax@15
  int v21; // ebx@15
  int v22; // eax@16
  _Dlg_ *v23; // eax@18
  int v24; // edx@21
  int v25; // ecx@21
  int v26; // esi@21
  int v27; // eax@21
  unsigned __int8 v28; // sf@21
  unsigned __int8 v29; // of@21
  void *v30; // ecx@22
  unsigned __int8 v31; // sf@23
  unsigned __int8 v32; // of@23
  int v33; // edx@25
  int v34; // ecx@25
  _Dlg_ *v35; // eax@25
  unsigned __int8 v36; // sf@25
  unsigned __int8 v37; // of@25
  void *v38; // ecx@26
  unsigned __int8 v39; // sf@27
  unsigned __int8 v40; // of@27
  __int64 v41; // [sp+Ch] [bp-24h]@3
  float v42; // [sp+14h] [bp-1Ch]@6
  float v43; // [sp+18h] [bp-18h]@1
  _PlayerSetup_ *v44; // [sp+1Ch] [bp-14h]@1
  int v45; // [sp+20h] [bp-10h]@1
  int v46; // [sp+2Ch] [bp-4h]@15

  v5 = this;
  v7 = a2->VTable & 0xFFF;
  v6 = HIWORD(a2->SizeX);
  LODWORD(v43) = this;
  v45 = v7;
  v44 = GetHumanPlayerStructure(Main_Structure);
  GetHumanPlayerIndex(Main_Structure);
  v4 = v44->ActiveHero;
  if ( v4 != -1 )
  {
    v9 = 585 * v4;
    v8 = (_Hero_ *)((char *)Main_Structure->Heroes + 2 * v9);
    if ( (_MainStruct_ *)((char *)Main_Structure + 2 * v9) != (_MainStruct_ *)-136736 )
    {
      if ( (v10 = *((_WORD *)v5 + 115),
            LOWORD(v41) = (((_WORD)a3 + ((signed __int16)(*((_WORD *)v5 + 114) << 6) >> 6)) ^ (_WORD)v41) & 0x3FF ^ v41,
            WORD1(v41) = ((((signed __int16)(4 * v10) >> 12) & 0xF) << 10) | ((_WORD)a4
                                                                            + ((signed __int16)(v10 << 6) >> 6)) & 0x3FF ^ WORD1(v41) & 0xC000,
            sub_004E6080(v8, (int)&v41))
        && sub_004E6050(v8) != -1                                //вот это как раз проверка на то, наложен ли Visions
        || *(_BYTE *)(LODWORD(v43) + 61) )
      {
        v13 = sub_004A7230((int)v8, v6);
        v14 = v8->SSkill[4];     //дипломатия игрока
        LODWORD(v41) = v13;
        v44 = (_PlayerSetup_ *)v14;   //а еще кто-то накосячил с типами
        v15 = sub_00427650(v8);
        LODWORD(v43) = v15;
        v16 = v45 * *(_DWORD *)(116 * v6 + Mon_Table_p + 64);
        v42 = (long double)v15;
        v43 = (long double)v16;
        v42 = v42 / v43;
        v17 = sub_004A7330(v42);
        v18 = a2->VTable;
        v11 = (int)((char *)v44 + v17 + v41);
        a2 = (_Dlg_ *)v18;
        v12 = v18 << 15 >> 27;
        if ( v12 > v11 )
          goto LABEL_33;
        if ( v12 <= (signed int)(&v44->HeroesCount + v41) )
        {
          v19 = 2;
          goto LABEL_15;
        }
        if ( v12 <= (_DWORD)v41 + 2 * (_DWORD)v44 + 1 )
        {
          v19 = 3;
          goto LABEL_15;
        }
        if ( (unsigned int)a2 & 0x20000 || v12 == v11 )
LABEL_33:
          v19 = 1;
        else
          v19 = 0;
LABEL_15:

..

далее не важно, потому что v19 - это как раз статус отношения группы монстров

для аутентичного результата надо переписать всю эту маету на ERM
Richter
Цитата(feanor @ 18 Jan 2015, 00:17) *
Так, кажется, дружественность монстров считается непосредственно в процидурке диалога
...
...
для аутентичного результата надо переписать всю эту маету на ERM

Ок. Попробую. В IDApro декомпилированный код есть возможность открыть или нужен другой инструмент?
feanor
Цитата
Ок. Попробую. В IDApro декомпилированный код есть возможность открыть или нужен другой инструмент?
Ида нужна с хексрейзом. F5 на функции.
И воговская база, конечно..хотя хрен его знает, где её взять, пока вогфорум лежит.

А лучше скачай готовый декомпилят, один из последних постов в инженерном анализе
igrik
Цитата(feanor @ 17 Jan 2015, 22:51) *
И воговская база, конечно..хотя хрен его знает, где её взять, пока вогфорум лежит.

вот

Цитата
Для сокровищницы если первый раз отменить, бой уже не вызывается, наверно параметры надо обратно менять?

Скорее всего проблема в этих переменных v9756 v9757. Походу нужно переменную, которая отвечает за "нет" обнулять. Но лень разбираться. В идеале лучше всего использовать одну, а не две
Richter
Цитата(feanor @ 17 Jan 2015, 18:45) *
..я вот задумался

А что, !!OB:MRS не работают для сокровищниц?

!!OB998:M-1/1/0;
Не для всех сокровищниц работает как описано в ERM help 2.81

для склепа (тип 84) сразу выдает бой, после разграбления сообщение остается.
для утопий (тип 25) сразу дает бой, далее сообщений нет.

пробовал разные значения для третьего параметра (!!OB:M-1/1/?) от -1 до 3, ничего не происходит(.
A хочется выбирать как никак.

С помощью Ermhooker "в бой" сделал, а вот отмену не получается.
Richter
Всё! Со склепом справился.
!?OB84;
!!CB998:T?y33;
!!OB998&y33=1:M-1/1/4;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4;
!!SN&v1>0:Ey2/1/4899236/31896;
!$OB84;
!!VRv9756:S0;
!?FU31896;
!!SN:X?y3/0;
!!VRy4:Sy3 +32;
!!UN&v9756=34:Cy4/4/4899301; yes
!!UN&v9756=32:Cy4/4/4899429; no


для ветхого корабля(24) и кораблекрушения(85), аналогично.
Richter
Цитата(feanor @ 18 Jan 2015, 00:17) *
Так, кажется, дружественность монстров считается непосредственно в процидурке диалога

Код
//----- (004170B0) --------------------------------------------------------
void __thiscall Dlg_MonsterRMHint(void *this, _Dlg_ *a2, int a3, int a4)
..

далее не важно, потому что v19 - это как раз статус отношения группы монстров
для аутентичного результата надо переписать всю эту маету на ERM

Feanor, не получается однако перенести строку с сообщениями: "Эти существа хотят присоединиться к Вам", "Любые существа присоединятся к Вам за %d золотых",
"Эти ничтожные существа сразу обратятся в бегство" и т.д. в самописный диалог DL.
Richter
Отвечаю на свой вопрос,заданный здесь. Есть возможность открыть информацию по любому существу, на примере клика на карте.

Однако в процессе тестирования скрипта обнаружилось, что возвращаемый опыт стеку шахты, которая не кому не принадлежит, сводится к нулю, ибо ИИ почти всегда делит стек на несколько стеков, что приводит к нулевому опыту всех стеков.
igrik
Открыть окно существа
Richter
А я блин заморочился через шахту) Спасибо огромное.
feanor
Цитата
Feanor, не получается однако перенести строку с сообщениями: "Эти существа хотят присоединиться к Вам", "Любые существа присоединятся к Вам за %d золотых",
"Эти ничтожные существа сразу обратятся в бегство" и т.д. в самописный диалог DL.

Эм, в смысле?
Я, если чо, тоже не буду браться, слишком мутный код, свою механику сделать будет едва ли не проще.

Алсо, сообщения на самом деле лучше ловить через брякпойнт на 4F6C00, чем через поиск по коду
Richter
Цитата(feanor @ 21 Jan 2015, 14:53) *
Эм, в смысле?
Я, если чо, тоже не буду браться, слишком мутный код, свою механику сделать будет едва ли не проще.

Алсо, сообщения на самом деле лучше ловить через брякпойнт на 4F6C00, чем через поиск по коду

Ок. Итак по теме ответили очень развернуто, мне лично помогло. Спасибо)
Etoprostoya
Может, слить эту тему с "Обсуждением инженерного анализа", чтобы не плодить сущностей и не путаться?
igrik
Код
далее не важно, потому что v19 - это как раз статус отношения группы монстров

Блин, что-то я не могу въехать, где у определяется, что v19 = 0 ... 4.

Код
!?CM0;
!!CM:I?y1; куда кликнули
!!FU&y1<>37:E; если не карта приключений, то выход
!!CM:P?y1/?y2/?y3; координаты клика
!!OBy1/y2/y3:T?y4; что это за объект
!!FU&y4<>54:E; если не монстр, то выход
!!CM:R0;   отмена стандартного действия
!!OBy1/y2/y3:U?y4; узнать что за монстр?
!!MOy1/y2/y3:G?y5; сколько их?
!!FU35353:P1/y4/y5/3;

!?FU35353;
; x1 - тип диалога:
;      0 - стандартный
;      1 - как с видением
; x2 - номер монстра
; x3 - кол-во монстров
; x4 - строка с присоединением:
;      0 - в бегство
;      1 - готовы ринутся в драку
;      2 - присоединяются по холяве
;      3 - присоединятся за плату
; y10 - скоко денег они хотят
!!MA:Cx2/6/?y10; узнать скок стоит один монстр
!!VRy10:*x3; умножить на кол-во
!!UN:C6919480/4/?y1;
!!SN:E5438880/2/y1/x1/x2/x3/x4/y10;
!!SN:E6245264/2/y1;

Но еще не нашел где изменять координаты отображения диалога
Код
!?CM0;
!!CM:R0;
!!UN:C6919480/4/?y1; получить указатель
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
!!SN:E6245264/2/y1; нужно для вызова диалога по ПКМ
Richter
Цитата(igrik @ 22 Jan 2015, 01:11) *
Код
далее не важно, потому что v19 - это как раз статус отношения группы монстров

Блин, что-то я не могу въехать, где у определяется, что v19 = 0 ... 4.

Код
!?CM0;
!!CM:I?y1; куда кликнули
!!FU&y1<>37:E; если не карта приключений, то выход
!!CM:P?y1/?y2/?y3; координаты клика
!!OBy1/y2/y3:T?y4; что это за объект
!!FU&y4<>54:E; если не монстр, то выход
!!CM:R0;   отмена стандартного действия
!!OBy1/y2/y3:U?y4; узнать что за монстр?
!!MOy1/y2/y3:G?y5; сколько их?
!!FU35353:P1/y4/y5/3;

!?FU35353;
; x1 - тип диалога:
;      0 - стандартный
;      1 - как с видением
; x2 - номер монстра
; x3 - кол-во монстров
; x4 - строка с присоединением:
;      0 - в бегство
;      1 - готовы ринутся в драку
;      2 - присоединяются по холяве
;      3 - присоединятся за плату
; y10 - скоко денег они хотят
!!MA:Cx2/6/?y10; узнать скок стоит один монстр
!!VRy10:*x3; умножить на кол-во
!!UN:C6919480/4/?y1;
!!SN:E5438880/2/y1/x1/x2/x3/x4/y10;
!!SN:E6245264/2/y1;

Но еще не нашел где изменять координаты отображения диалога
Код
!?CM0;
!!CM:R0;
!!UN:C6919480/4/?y1; получить указатель
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
!!SN:E6245264/2/y1; нужно для вызова диалога по ПКМ

Опробую будет время. С такой помощью мод можно будет закончить в скором времени.
Richter
Цитата(igrik @ 22 Jan 2015, 01:11) *

Код
!?CM0;
!!CM:I?y1; куда кликнули
!!FU&y1<>37:E; если не карта приключений, то выход
!!CM:P?y1/?y2/?y3; координаты клика
!!OBy1/y2/y3:T?y4; что это за объект
!!FU&y4<>54:E; если не монстр, то выход
!!CM:R0;   отмена стандартного действия
!!OBy1/y2/y3:U?y4; узнать что за монстр?
!!MOy1/y2/y3:G?y5; сколько их?
!!FU35353:P1/y4/y5/3;

!?FU35353;
; x1 - тип диалога:
;      0 - стандартный
;      1 - как с видением
; x2 - номер монстра
; x3 - кол-во монстров
; x4 - строка с присоединением:
;      0 - в бегство
;      1 - готовы ринутся в драку
;      2 - присоединяются по холяве
;      3 - присоединятся за плату
; y10 - скоко денег они хотят
!!MA:Cx2/6/?y10; узнать скок стоит один монстр
!!VRy10:*x3; умножить на кол-во
!!UN:C6919480/4/?y1;
!!SN:E5438880/2/y1/x1/x2/x3/x4/y10;
!!SN:E6245264/2/y1;

Но еще не нашел где изменять координаты отображения диалога
Код
!?CM0;
!!CM:R0;
!!UN:C6919480/4/?y1; получить указатель
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
!!SN:E6245264/2/y1; нужно для вызова диалога по ПКМ


В целом здорово! Пока правда ещё не понятно как эти значения использовать в !!DL.
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
18 это наличие тени диалога, 2= отключить.

Цитата(Etoprostoya @ 22 Jan 2015, 00:20) *
Может, слить эту тему с "Обсуждением инженерного анализа", чтобы не плодить сущностей и не путаться?


скажите как объединить.
Richter
Кто нибудь знает,как сделать чтобы кнопка рекорды в главном меню вызывала диалог, значения для которого можно было бы брать из ini файла?
зачем?
Решил тут в хоту поиграть, захотелось однослотовых сборных артефактов, насколько я помню это можно сделать изменением пары байт в памяти (пофиг, что они не будут разбираться или давать не все статы), не подскажите адрес начинала таблицы артефатов и её структуру, поиск что то не дал результатов.... Кстати заодно может подскажете, возможно ли сделать плагин для hd мода, чтобы байтики заменялись при запуске, примеров реализации тоже не нашел нигде.

UPD: адресочки нашлись, только вот работает все не так как хотелось, сборные артефакты не только разобрать нельзя, но и собрать... в воге же (а может и сод), к примеру, если аналогичные адреса забить значением FFFFFFFF, собирались арты без проблем... просто разобрать нельзя было biggrin.gif
feanor
Я хотел написать пост про то, как хранятся в экзе деревья отстройки (битовое поле в памяти создается при старте из хитровыкрученных данных), но без мата не получается. Поэтому пусть полежит так.

Код
int depend_tables[] =
{
    0,                    -1, //первое число - номер здания, дальше - требования, завершаем минус единицей
    1, 0,                -1,
    2, 1,                -1,
    
    5,                    -1,

    7,                    -1,
    8,7,                -1,
    9,8,                -1,
    
    11, 5,                -1,
    12, 11, 14, 16, 0,    -1,
    13, 12, 9,            -1,
    
    14,                    -1,
    15, 14,                -1,

    16,                    -1,

    17, 16,                -1, //artif <- smith
    
    21, 0, 7,            -1, //managen <- fort, mguild

    22, 9,                -1, //moat???

    30, 7, 16,            -1,
    37, 30,                -1,
    18, 30,                -1,
    19, 30,    37,            -1,

    31, 7, 16,            -1,
    38, 31,                -1,

    32, 7, 16,            -1,
    39, 32,                -1,

    33, 31,                -1,
    40, 33,                -1,

    34, 30, 8, 14,        -1,
    41, 34, 35,            -1,

    35, 32, 8, 0,        -1,
    42, 35, 36, 17,        -1,

    36, 35, 34, 9, 1,    -1,
    43, 2,                -1,

    26,                    -1, //грааль
    -100 //конец
};


*(int*)0x4EBA98 = (int)depend_tables; //для конфлюкса. Иные адреса раньше по коду.
Richter
Цитата(feanor @ 21 Jan 2015, 14:53) *
Цитата
Feanor, не получается однако перенести строку с сообщениями: "Эти существа хотят присоединиться к Вам", "Любые существа присоединятся к Вам за %d золотых",
"Эти ничтожные существа сразу обратятся в бегство" и т.д. в самописный диалог DL.

Эм, в смысле?
Я, если чо, тоже не буду браться, слишком мутный код, свою механику сделать будет едва ли не проще.

Алсо, сообщения на самом деле лучше ловить через брякпойнт на 4F6C00, чем через поиск по коду

Благодарен за "наводку" так сказать", по поводу создания своей механники, скоро будет готово.
Barin
Цитата(Barin @ 03 Nov 2015, 13:58) *
Цитата(igrik @ 13 Oct 2015, 01:17) *
отвечу и тут, мож кому еще пригодится
Код
сместить кнопки далеко за пределы экрана: для бин файла
; кнопка "Синглплеер"
63E6B0 FFFD
; кнопка "Мультиплеер"
63E6B8 FFFD
; кнопка "Обучение"
63E6C8 FFFD
; кнопка "Во имя богов"
456C6C AAAA
; кнопка "Клинок Армагедона"
456CE6 AAAA
; кнопка "Возраждение Эратии"
63BBF0 AAAA
; кнопка "Выбрать"
63BBF8 AAAA


Ещё мне нужно в окне выбора кампаний заблокировать некоторые окна кампаний. Как например сейчас в Hota, доступно 2 кампании. Я тоже хочу поместить в свой мод 2 кампании, остальные окна пока закрыть. Нужно так, чтобы было как в оригинале игры - проходишь например 2 кампании, открывается окно следующей.

Может кто помочь?

igrik
я тут хз
Richter
Всем Здравствуйте!
Подскажите как закрыть окно героя и как отрыть окно найма существа (любого) вне замка?
Пробовал через "хук на эру" глядя в "компилят" героев, через ida pro... регистры и прочее... в программировании не разбираюсь.
hippocamus
Gavek
Ты ассемблер знаешь? В каждом конретном случае вызвано разное количество вложенных функций, которым разное количество параметров передано через стек командой push. Чтобы функцию завершить (а вызов окна героя - функция) - нужно передать управление на начало команд pop перед ret. Но в общем случае дать рекомендации нельзя - а вдруг вызвана вложенная функция (нажата кнопка например) - и эти операторы pop восстановят вовсе не то, и стек не вернётся в исходное состояние?
А окно найма можно открыть, хоть даже внутри окна героя - но это нужно в отладчике смотреть.
Richter
Цитата(hippocamus @ 06 Nov 2015, 01:36) *
Gavek
Ты ассемблер знаешь? В каждом конретном случае вызвано разное количество вложенных функций, которым разное количество параметров передано через стек командой push. Чтобы функцию завершить (а вызов окна героя - функция) - нужно передать управление на начало команд pop перед ret. Но в общем случае дать рекомендации нельзя - а вдруг вызвана вложенная функция (нажата кнопка например) - и эти операторы pop восстановят вовсе не то, и стек не вернётся в исходное состояние?
А окно найма можно открыть, хоть даже внутри окна героя - но это нужно в отладчике смотреть.

Пробовал хотя бы азы изучить, интересно лично мне. Однако как и всё требует времени много, особенно если сам занимаешься. Поэтому ассемблер не знаю. Хотя за 4 года удалось очень подробно изучить ERM. Поскольку внутренности программы не знаю, то пользуюсь чужими наработками (естественно). Однако найденых мною наработок не хватает, мне.
feanor
Гиппо, не надо нести ерунду. Пуши, реты - начнем с того, что достаточно сымитировать нажатие кнопки (хотя бы через винапишную сендкей, ага, если не через встроенные функции диалога).
Ну и выход из диалога в принципе не может осуществляться "передачей управления на начало команд pop перед ret".
hippocamus
Ага, а если в этот момент поверх открыто ещё одно диалоговое окно?
Про сымитировать нажатие - это я и так понимаю, только работают ли апи-функции в героях? Неужели там не свой обработчик?
igrik
Цитата(feanor @ 16 Jan 2015, 22:00) *
Так. Трэш-сеанс гадания по геройским внутренностям открыт

В теме есть описалово нескольких стартовых функций
В частности, есть указание на то, что 004A8160 обрабатывает вход в объекты
Код
0x004A8160 void __thiscall Enter2ObjectMain(int AvdManager, _Hero_ *Hero, signed int Par1, __int64 PosMixed)

Код
0х00408ABF Enter2ObjectGamer(v2, a5, mip);
0х00408ABF car__thiscall Enter2ObjectGamer(int AdvManager, signed int a3, int a4)


Цитата
Щас посмотрю.
Есть mip, который указатель на тайл клетки, а есть пакованные координаты.
//здесь - да, пакованные координаты

feanor, если есть время и желание, можешь немного поподробнее расписать про эти функции и чем пакованные координаты отличаются от указателя на "тайл клетки"

Цитата
!!CM:P?y1/?y2/?y3;
!!VRy1: &1023;
!!VRy2: &1023 *65536 |y1;
!!VRy3: &15 *67108864 |y2;

Тут в y3 получаем тайл клетки?

Цитата
!!CM:P?y1/?y2/?y3;
!!UN:C6919480/4/?y15; gamemgr
!!UN:C6918840/4/?y10; advmgr
!!VRy11:Sy10 +92;
!!UN:Cy11/4/?y11; gamemap
!!SN:E4228816/2/y11/y1/y2/y3;
!!VRy12:Sv1; mapitem

А тут пакованные координаты в y12?
feanor
Наоборот, в первом случае упакованные в dword координаты, во втором - указатель на структуру тайла клетки.
Richter
Цитата(igrik @ 07 Nov 2015, 23:48) *
Окно найма существ
Код
!!FU8980050:P28/132/10/-1/0/-1/0/-1/0;
!?FU8980050;  нанять существо при активном герое
....
....
!!SN&y3<>0:E4917104/2/y1/y3;
!!en:;

Но! при попытке купить происходит вылет. Как это решить я не знаю

Очень жаль. У меня вообще курсор пропадает, активна только кнопка "отмены" (ESC). Нажимаешь, потом снова функцию активируешь: первый слот нанимать также нельзя остальные можно, но всё равно вылет при найме. Ссылается на последнюю выполненную функцию и ошибку в доступе к функции Get Mon Stack(точно название не помню)
Точно также было у меня, когда хук на Dwеллинги ставил. Хоть поступай в "Вышку" на программирование.
igrik
Оказывается функция работает, но если нанимаешь только боевые машины (ведь я то работаю в функции покупки боевых машин). При попытке купить других кричей получается вылет. Попробую пошаманить через другую фунцию
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.