Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Изменение вида города
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2, 3
Irh
Предлагаю вашему вниманию пакет, предназначенный для изменения некоторых параметров игры, связанных, в основном, с экраном города. В числе возможностей:
- Добавление зданий (незадействованных из диапазона номеров 0...43).
- Активация зданий (желтая окантовка)
- Задание координат и имен файлов для строений на экране города

Для WoG 3.58f (rapidshare, slil.ru)

(h3wog.exe 3,440,640 байт 26.10.04 22:23,
если данные другие, можно скачать подходящий h3wog.exe)


Для TE 1.03q
Druin
А по подобнее плиииииз... smile.gif
Demiurg
Можно сделать, чтобы с TE тоже работало?
Irh
Про использование написано в readme.txt. Если будет надо, напишу инструкцию... А пока чуть подробнее:

Программа модифицирует h3wog.exe и позволяет задать некоторые параметры для вида города:
- порядок и номера строений, отображаемых на экране города
- координаты, спрайты, окантовки и маски зданий в городе.
(при этом можно задействовать весь диапазон зданий - 0...43. Маска позволяет сделать здание активным - реагирующим на щелчки и движение мыши)
- существа в ордах - (зданиях, повышающих прирост существ) - не тестировано.
- включение/отключения взаимодействия орд с жилищами при постройке (по умолчанию из четверки жилище/улучшенное/жилище с ордой/улучшенная орда может быть построено только одно)
- строить ли домики при постройке Префектуры-Муниципалитета-Капитолия
Docent Picolan
спасибо за прогу! good.gif думаю очень пригодится создателям городов.
Irh
Под TE патч не работает, и суть проблемы неясна. При этом даже непатченый h3te.exe не пашет под отладчиком (Visual Studio 8) - вылетает та же ошибка. Надо разбираться...

Чуть не забыл - благодарность за идею: Deo.
Demiurg
Наверное, дело в защите exe'шника.
Irh
Сомневаюсь... Если защита и была в SoD, Слава ее уже должен был снять. Я думаю, что скорее всего там какая-то специфическая для TE операция зависит от специфических факторов, типа взаимодействия потоков, адресов в куче или значений над вершиной стека. Впрочем, это догадки, я слабо представляю себе детали работы дебаггеров.
gamecreator
и как назло выложил на два худших сервера smile.gif
но я все-же скачал. спасибо за прогу.
Morn
Действительно спасибоsmile.gif
NickLee
Полезная штука... Спасибо smile.gif
Druin
Жалко не под ТЕ... И дель возможно действительно в защите... Но не от СоД, а от ZVS...
Bes
не просто жалко, а АРХИПЛОХО!!! sad.gif sad.gif sad.gif

Надеюсь, что Irh сможет всё же обойти эту проблему...
izrukvruki
У меня такой вопрос. Вот смотрю файл bxtraits.txt

Код
No    X    Y    Frm    Spr    Outline
8
22    -1    -1    -1    -1    -1
7    -1    -1    -1    -1    -1
8    -1    -1    -1    -1    -1
9    -1    -1    -1    -1    -1
36    -1    -1    -1    -1    -1



как я понял это изменение для Конфлюкса.
22 - это волшебный фонарь
7 - Кузница
8 - Рынок
9 - Хранилище ресурсов
36 - НЕ ИСПОЛЬЗУЕТСЯ

За что отвечает порядок строк?
Номер строения это что такое?? Я понял так, что вместо нулевого строения строится 22, вместо первого 7...
Bes
Газете...

Я не знаю, что тут за номера, но скорее всего номера брались из таблицы строений города (общая для всех)
Немного поясню насчёт строений Конфлюкса (благо это пришлось изучать):
Цитата
0 Гильдия магов уровня 1
1 Гильдия магов уровня 2
2 Гильдия магов уровня 3
3 Гильдия магов уровня 4
4 Гильдия магов уровня 5
5 Таверна
6 Верфь
7 Форт
8 Цитадель
9 Замок
10 Сельская управа
11 Префектура
12 Муниципалитет
13 Капитолий
14 Рынок
15 Хранилище ресурсов
16 Кузница
17 Торговцы 
18 Строение орды для неулучшенных существ: Маленьких Фей
19 Строение орды для улучшенных существ: Феи
20 Корабль (если имеется Верфь)
21 Университет магии
22 не используется
23 не используется
24 Строение орды для неулучшенных существ: не используется
25 Строение орды для улучшенных существ: не используется
26 Грааль
27 Дополнительные дома для Префектуры
28 Дополнительные дома для Муниципалитета
29 Дополнительные дома для Капитолия
30 Жилище 1го уровня
31 Жилище 2го уровня
32 Жилище 3го уровня
33 Жилище 4го уровня
34 Жилище 5го уровня
35 Жилище 6го уровня
36 Жилище 7го уровня
37 Улучшенное жилище 1го уровня
38 Улучшенное жилище 2го уровня
39 Улучшенное жилище 3го уровня
40 Улучшенное жилище 4го уровня
41 Улучшенное жилище 5го уровня
42 Улучшенное жилище 6го уровня
43 Улучшенное жилище 7го уровня

Красным отмеченыте строения, которые в игре не используются.
К примеру, 22 нигде нету, но оно вроде как всё время построено (при любой постройке оно строится).
А 27-29 отстраиваются вместе с постройкой соответствующий им строений (11-13)
izrukvruki
Бес спасибо, но то что ты мне в личку написал - нифига не понял... и обяснять не нуно.

с номерами тогда понятно.
а их последовательность на что влияет? чем 22 7 8 9 36, отличается от 7 22 9 8 36???

Вопрос еще такой: получается что можно использовать для строений СВОИ дефы? т.е. не заменять старые дефы, а добавить свои и сделать несколько вариантов экзешника один для стандартной игры, а другой с новыми дефами
Bes
как я понял из вашего поста (#14) , там просто написано списком здания... это, имхо, не важно как их располагать в последовательности.


Цитата
Вопрос еще такой: получается что можно использовать для строений СВОИ дефы? т.е. не заменять старые дефы, а добавить свои и сделать несколько вариантов экзешника один для стандартной игры, а другой с новыми дефами
ну, если вы в своём новом ехе-шникесопоставите неиспользуемые здания с новыми именами дефов для них... то по идее такой вариант подойдёт.
Ведь для неиспользуемых зданий в оригинальном ехе-шнике имена дефов не прописаны, вроде.
gamecreator
Цитата(izrukvruki @ 31 Oct 2007, 15:14)
т.е. не заменять старые дефы, а добавить свои и сделать несколько вариантов экзешника один для стандартной игры, а другой с новыми дефами

думаю это будет возможно только при динамической подгрузке ресурсов
Irh
Цитата(Bes @ 31 Oct 2007, 14:29)
0 Гильдия магов уровня 1
...
Да - это формат CMI/CB, не U. А индекс в массиве с номерами зданий не связан.
Последовательность номеров - насколько я понял, просто последовательность отрисовки на экране, это важно, если здания перекрываются.

Номера в bxtraits.txt (это просто пример) я скопировал из ехе, чтобы сохранить существующий порядок зданий в Сопряжении.

Цитата(izrukvruki @ 31 Oct 2007 @ 16:14)
Вопрос еще такой: получается что можно использовать для строений СВОИ дефы? т.е. не заменять старые дефы, а добавить свои и сделать несколько вариантов экзешника один для стандартной игры, а другой с новыми дефами

Именно так. Просто заменить соответстующие строки в exe. Правда, много имен файлов придется менять... но это имхо стоит сделать. Несколько сложнее со зданиями, которые не присутствуют в списке, но тоже можно - изменить адреса строк в таблице и прописать новые имена файлов.

Надеюсь все же сделать вскоре новый патч для TE с ограниченной функциональностью - по крайней мере, с добавлением зданий принципиальных проблем нет.
gamecreator
Цитата(Irh @ 31 Oct 2007, 18:59)
Просто заменить соответстующие строки в exe.

может вынесешь тогда это в опцию в текстовик?
izrukvruki
т.е. порядок имеет значение если здания перекрываются?
например если здания 22 7 8 9 36 перекрываются, то 36 будет выше всех на экране, а 22 самая нижняя.

а вот в посте Беса, что за номера 24 и 25?

что будет если построить незадействованные постройки? их можно будет как-то настроить?
Irh
Цитата(gamecreator @ 31 Oct 2007, 23:22)
Цитата(Irh @ 31 Oct 2007, 18:59)
Просто заменить соответстующие строки в exe.

может вынесешь тогда это в опцию в текстовик?
В контексте идет речь о спрайтах зданий - это уже сделано, в bxtraits.txt можно прописать любое имя файла.
А в перспективе можно будет добавить и другие строки (иконки, имена текстовых файлов).

Цитата(izrukvruki @ 01 Nov 2007, 11:12)
т.е. порядок имеет значение если здания перекрываются?
например если здания 22 7 8 9 36 перекрываются, то 36 будет выше всех на экране, а 22 самая нижняя.
По-видимому, да. Костер и замок там на заднем плане...
Цитата
а вот в посте Беса, что за номера 24 и 25?

что будет если построить незадействованные постройки? их можно будет как-то настроить?

>24 Строение орды для неулучшенных существ: не используется
>25 Строение орды для улучшенных существ: не используется
Вторая орда (используется в Инферно и Оплоте) - единственные незанятые номера в Сопряжении, поэтому я их использовал в примере. Вроде работает, хотя с функциональностью орды уверенности нет.
Darkmoon
Спасибо!
Я надеюсь, что данное дополнение поможет нам в создании Кремля.
hippocamus
Цитата(izrukvruki @ 01 Nov 2007, 10:12)
что будет если построить незадействованные постройки? их можно будет как-то настроить?

Как-то строят ведь в аддоне QuickSilver. Там у них есть новые постройки. Имхо с незадействованными номерами. А вообще эти номера можно использовать как флаги.
Irh
Ну, видимо, аналогичным способом редактируют ехешник или память...
Berserker
Если Ирх сможет весь код патча сделать ввиде длл и экспортируемой процедуры, то патчить можно динамически.
В общем, можно не трогая Славин код пропатчить ехешник всего в одном месте, в геройской процедуре, но нужен ответ от ЕРМ, чтобы всё это происходило после того, как защита проверит данные.

Вот файл:
www.rebirth.nekislohost.com/FILES/HEROES/HeroesExe.zip
Нужен тестинг. В архив три файла, библиотеку и ехешник помещаем в корневой каталог, скрипт переименовываем в script98.erm и кидаем в Data\s. Ехешник запустится у тех, к кого стоит ТЕ или Феникс.
Меня интересует вот что, работает ли на вин2000 и вин98.
Начните любую карту, если вылетов не будет, значит всё ок.
hippocamus
Berserker, загрузил smile.gif
Ну ты крут!за Феникс спасибо.
Bes
Цитата(Irh)
Вроде работает, хотя с функциональностью орды уверенности нет
Нет не работает (функциональность, в смысле), просто строятся "невидимые здания" и всё dry.gif
(ресивер !!MA:R#/$ игнорируется)
Это касаемо Сопряжения... с др. городами не знаю.

sorry.gif
Irh
Ясно, интересный факт... Но, наверное, отвязывать орду от жилища не имеет смысла, так что это не так уж плохо? Впрочем, если в одном из городов планируется вторая орда, имеет смысл исследовать этот вопрос подробнее.
Впрочем, орда имхо связана скорее с балансом, чем с концепцией, так что лучше иметь свободу маневра в этой области.
Berserker
Ехешник глючит, причины пока не выяснены. Просьба не качать пока...
Irh
Ну вот, вроде как удалось заставить работать патч под ТЕ. Посмотрим, что будет...
Bes
при посещении Замка (город тот, что слева) на карте для тестинга, вылетает такое...



После чего игра вылетает (попутно выкинув сообщение, типа ERM Lаtest Code... и т.п.)
sad.gif
unsure.gif
Irh
Точно sorry.gif . Сейчас исправим...
Bes
кстати, забыл указать вам, что скрипт в карте вы забыли задать на день >500... Поэтому при старте выскакивает событие с содержимым вашего скрипта wink.gif (не страшно вроде, но и не красиво как-то)
Irh
Цитата(Irh @ 26 Oct 2007, 23:44)
Ну вот, так вроде лучше. Теперь все замки работают, не только те, что прописаны в bxtraits.txt.

Кроме того, добавилась замена иконок зданий размером 58х64. Правда, не смог вспомнить, где они используются unsure.gif .

Если кто уже модифицировал bxtraits.txt и не хочет заменять файл, нужно добавить справа столбец -1-чек - сделать это проще в Excel.

Добавлено ([mergetime]1194546152[/mergetime]):
Цитата(Bes @ 08 Nov 2007, 21:10)
кстати, забыл указать вам, что скрипт в карте вы забыли задать на день >500... Поэтому при старте выскакивает событие с содержимым вашего скрипта wink.gif (не страшно вроде, но и не красиво как-то)
Я всегда так делаю, когда тестирую скрипты, чтобы иметь возможность лишний раз проверить, что я запускаю. А тут вместе со скриптом выводится его описание. Так что прошу отнестись к этому, как к фиче smile.gif .
Berserker
Great!
Bisik
Слушай Ирх, не мог бы ты мне помочь, так как я с цифрами не в ладах и выставить координаты здания в текстовом файле мне слабо sad.gif . В общем я тебя попросил бы выставить координаты здания для людского города по картинке, которой я тебе брошу. Если сделаешь, буду признателен smile.gif
Irh
можно попробовать... мыло в профиле.
Irh
Действительно - есть такая проблема, что если нужно не заменять полностью город, а просто поменять или вставить свое здание, то непонятно, откуда брать номера зданий. Вот текстовые файлы с настройками по умолчанию для всех городов.
http://woggrad.ru/ARCHIVE/index.php?action...MODS_AND_PACKS&
Berserker
Ирх, а где первый вариант проги со статическим патчем? Мне он нужен...
Griffit
Айяйяй хаспадын Бюрзеркер!!!Как никарашо!!!Ставить в подпись официально не спетую еще песню Епидемии!!Никарашо никарашо. Впрочем тоже не люблю зеленых птичек
Irh
Что значит статический? Для WoG который?

Добавлено ([mergetime]1196191205[/mergetime]):
Он в первом посте.
Berserker
Эпидемия уже выпустила альбом.

Добавлено ([mergetime]1196271749[/mergetime]):
Пропатчил я ехешник, он запускается, но ничего не происходит.
Berserker
Вот ехешник:
www.rebirth.nekislohost.com/PhoenixRetail.exe
Irh
Хм... Если возникает исключительная ситуация при инициализации (скажем, библиотека не загрузилась), то никаких сообщений не выдается. У Bisik'a та же проблема с WoG 358. Надо будет посмотреть...
Berserker
В общем некорректно патч прописывается (если смотреть в отладчике). Лучше патчить вообще без всяких hood.dll, статично.
Irh
Цитата(Berserker @ 28 Nov 2007, 22:16)
Вот ехешник:
www.rebirth.nekislohost.com/PhoenixRetail.exe
Ага, круто! good.gif Надеюсь в ближайшее время подумать насчет патча под эту версию.
Irh
М-да... так и не сделал. Ну, а теперь, похоже, это уже и не актуально.

Компилируемые исходники уже не найти, расскажу пару технических моментов, авось пригодится.

По адресу 0x005BED30 начинается функция, которая строит в городе здание и при этом кое-что еще (добавляет юниты, разрушает другие здания). Город - this, номер здания - аргумент.

Код
MemWriteByte((VOID *)0x005BED30, 0x68); // push imm32
    MemWriteDword((VOID *)0x005BED31, (DWORD)&Build);
    MemWriteByte((VOID *)0x005BED35, 0xC3); // ret

Это я делаю прыжок из нее на мою функцию...

Код
// Вспомогательный класс, соответствует структуре геройского класса города
class CTown
{
public:
    
    BYTE * Data() { return (BYTE *)this; }

    BYTE & Type() { return Data()[4]; }

    // WORD[14], 0-6 base, 7-13 upgraded
    WORD * CreaturesOwned() { return (WORD *)(Data() + 0x16); }

    typedef INT BUILDING;
    typedef QWORD BUILDING_MASK;

    BUILDING_MASK BuildingMask( BUILDING bu ) { return 1ULL << bu; }

    QWORD & BuiltMask() { return (QWORD &)Data()[0x150]; }

    BOOL IsBuilt( BUILDING bu ) { return IsBuiltMask(BuildingMask(bu)); }
    VOID DoBuild( BUILDING bu ) { DoBuildMask(BuildingMask(bu)); }
    VOID DoDestruct( BUILDING bu ) { DoDestructMask(BuildingMask(bu)); }
    BOOL IsBuiltMask( BUILDING_MASK mask ) { return !!(BuiltMask() & mask); }
    VOID DoBuildMask( BUILDING_MASK mask ) { BuiltMask() |= mask; }
    VOID DoDestructMask( BUILDING_MASK mask ) { BuiltMask() &= ~mask; }

    // Это, по сути, декомпилированный вручную код исходной функции с некоторыми изменениями, отмеченными + или *
    BUILDING Build( BUILDING bu )
    {
 BUILDING buBuilt = bu;
 DoBuild(bu);
 // + if (...); else
 if ((bu == g_aHordes[1] && !g_TownXTraits[Type()].bHorde1Horde) ||
     (bu == g_aHordes[3] && !g_TownXTraits[Type()].bHorde2Horde))
 ;
 else
     DoDestructMask(g_aDestroyOnBuildMask[Type()][bu]);
 // * for ( int h = 0; h < HORDES_NUM; h++)
 for ( int h = g_TownXTraits[Type()].bHorde1Horde ? 0 : 2;
     h < (g_TownXTraits[Type()].bHorde2Horde ? HORDES_NUM : 2); h++)
 {
     INT buHorde = g_aHordes[h];
     WORD wLev = g_aHordeTraits[Type()][h].wLevel;
     if (bu == buHorde)
     {
   DoDestruct(wLev + 30); // Dwelling
   // Check if building base horde on upgraded dwelling
   if (wLev < 7 && IsBuilt(wLev + 37))
   {
       DoDestruct(bu); // Dest base horde
       DoDestruct(wLev + 37); // Dest upgraded dwelling
       DoBuild(buBuilt = g_aHordes[h + 1]); // Build upgraded horde
   }
     } // if (bu == buHorde)
     // Check if building corresponding dwelling on current horde
     if (IsBuilt(buHorde) && bu == wLev + 25)
     {
   DoDestruct(bu); // Dwelling
   DoDestruct(buHorde);
   DoBuild(buBuilt = g_aHordes[h + 1]); // Upgraded horde
     }
 } // for(h)
 // Set creatures number
 if (bu >= 30 && bu <= 36)
 {
     DWORD dw = ((DWORD *)0x6747B4)[Type() * 14 + bu - 30];
     dw = dw * 7 * 4 + dw;
     BYTE *p = (BYTE *)*(DWORD *)0x6747B0;
     WORD w = *(WORD *)(p + dw * 4 + 0x44);
     CreaturesOwned()[bu - 30] = w;
 }
 if (bu >= 37 && bu <= 43)
 {
     CreaturesOwned()[bu - 30] = CreaturesOwned()[bu - 37];
     CreaturesOwned()[bu - 37] = 0;
 }
 // * if (Type() == 1 || Type() == 4 || Type() == 8)
 if (g_TownXTraits[Type()].bHouses)
 {
     switch (bu)
     {
     case 10:
   Build(23);
   break;
     case 11:
   Build(27);
   break;
     case 12:
   Build(28);
   break;
     case 13:
   Build(29);
   break;
     default:
     ;
     } // switch (buNo)
 } // if (type() == 1 || type() == 4 || type() == 8)
 return buBuilt;
    }
}; // class CTown


// Проверяем, перейти ли на нашу функцию, или на стандартную
// в зависимости от типа города
//extern "C"
void __declspec(naked) Build()
{
    __asm pushad;

    // Check if to use build hook
    __asm
    {
 movsx    eax,byte ptr [ecx+4]; // Type()
 mov  al, [eax + g_aBuildHook]; // aBuildHook[Type()]
 cmp  al, 0; // if (aBuildHook[Type()] == 0)
 jnz  l;
 // go to default code
 popad; // undo pushad
 // 6 bytes from original fn
/* 005BED30 55               */ __asm push        ebp  
/* 005BED31 8B EC            */ __asm mov         ebp,esp
/* 005BED33 83 EC 0C         */ __asm sub         esp,0Ch
 push  0x005BED30 + 6; // after 6 bytes of hook code
 ret  // as if there were no hook
l:
    }

    // Now call BUILDING CTown::Build( BUILDING bu )
    // this (ecx) and bu(in stack) must be valid
    __asm
    {
 popad; // undo pushad
 push    CTown::Build;
 ret; // Just continue as if it were ordinary method
    }
}

Пожалуй, все...
KEHu
а можно добавить верфь рассам у которых ее нету
Irh
Можно. Просто добавить спрайт здания с соответствующим типом и построить здание скриптом. Только нельзя заранее сказать, будет ли это работать, надо проверять.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.