Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 15 авг 2021, 12:05

Кстати, заклинание Страх меня также интересует.

AlexSpl, я на heroesworld случайно наткнулся на ваше сообщение 13 летней давности (от 2008 года).

Вот оно:
Я уже разбирался с механикой заклинаний, когда пытался вернуть в игру "Fear" (правда на анализ кода уходит ну очень много времени, которого жалко).

Вопрос:
И как, получилось вернуть в игру "Fear"?

Дело в том, что Вы то сообщение писали еще в далеком 2008 году. А разбирались с "Fear" видимо еще раньше, вероятно в 2006-2007. В то время как HD-мод появился где-то в конце 2009, начале 2010. А patcher_x86, так и вовсе в 2016-2017. А H3API в 2017-2018.

Пытаясь тогда вернуть "Fear", вы писали все, как я понимаю, на ассемблере. Сейчас же модифицировать Героев стало куда проще, чем это было до 2016. Просто возврат заклинания "Fear" меня также интересует, но конечно в виде отдельного плагина к HD-моду. Был бы реально очень крутой плагин к моду. Ведь этого пока что нет даже в HotA. Возможно, в грядущем обновлении добавят.

А потому вопрос, насколько далеко вы тогда продвинулись и получилось ли у вас тогда вернуть "Fear" полностью без каких-либо проблем? И если да, то возможно ли будет переписать Ваш код на плюсы используя уже patcher_x86?
Вернуться к началу

offline8gabriel8  
имя: Николай
 
Сообщения: 4
Зарегистрирован: 15 авг 2021, 11:10
Пол: Мужчина
Поблагодарили: 0 раз.

Re: Как создать плагин для HD мода

Сообщение 8gabriel8 » 15 авг 2021, 12:34

И раз уж речь зашла о вырезанном контенте, то в HotA реализовали сборные артефакты: Железный кулак огра, Золотой гусь, Кулон отражения, Мантия дипломата. Нет ли мода, что их возвращает в Полное издание?
Кстати, в WoG Железный кулак огра называется Топор свирепости лорда варваров и даёт всем существам героя +1 атаку, а не Ускорение, Жажду крови, Огненный щит и Контрудар.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 15 авг 2021, 21:34

Я его возвращал в демо-версии RoE, но от самого заклинания остались лишь ресурсы, кода нет. Т.е. придётся писать заново на основе кода функций похожих заклинаний. Кстати, новые заклинания относительно легко добавлять. Например, в моде MoP добавлено несколько.

Золотой гусь - это вариант артефакта из Героев 2 в HotA. В ресурсах есть только остальные три, но для них не то, что кода нет, но и картинок.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 16 авг 2021, 09:56

AlexSpl писал(а):

Т.е. придётся писать заново на основе кода функций похожих заклинаний.

Ну с патчером на плюсах это будет сделать, наверное, уже проще, не так затратно по времени как писать это все на чистом ассемблере.

AlexSpl писал(а):

Кстати, новые заклинания относительно легко добавлять. Например, в моде MoP добавлено несколько.

Интересно получается, igrik он говорил что это вообще почти неподъемная задача. :smile1: Ну раз вы уже разбирались с механикой заклинаний, то Вам, наверное, виднее. А вообще понятие "сложно или легко" очень сильно зависит от опыта, знаний, навыков и способностей отдельно взятого программиста. :smile2:

Если у Вас получится вернуть этот закл в виде отдельного плагина, то это будет круто. В HotA по всей видимости планируют это также сделать в грядущем обновлении. Они все возвращают, что изначально планировалось разрабами. Только до заклов толком руки еще не дошли.

В ресурсах даже иконка Страха есть. Из ФизМига вот что известно о нем:
В файлах игры Страх отмечено как заклинание 4 уровня, стоимостью 16 маны и длительностью в СМ раундов боя. Школа магии не задана, но, судя по расцветке, можно предположить, что это Магия земли. Однако отмечено, что Страх относится к магии разума. При использовании – вражеское существо теряет способность атаковать и его скорость снижается на 25/50/75% в зависимости от уровня развития Магии земли.
Кстати, для баланса можно прикрутить его к Магии воды. Земля итак имбалансная.


AlexSpl писал(а):

Золотой гусь - это вариант артефакта из Героев 2 в HotA. В ресурсах есть только остальные три, но для них не то, что кода нет, но и картинок.

Ну разве картинки это проблема. Можно для начала из HotA взять, можно их немного отфотошопить, а можно и свои сделать при желании. Главное, чтобы рабочий код был. Вот что главое. А вообще сложно ли будет сделать сборники (Железный кулак огра, Золотой гусь, Кулон отражения, Мантия дипломата) отдельным плагином для SoD/Complete и придать им те свойства, которыми они обладают в HotA?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 16 авг 2021, 17:21

Цитата:
Ну с патчером на плюсах это будет сделать, наверное, уже проще, не так затратно по времени как писать это все на чистом ассемблере.

Да, намного проще. Уже одну только таблицу заклинаний перенести в код плагина - и 50% работы сделано :smile1: Поменять константы в циклах (70 на 71, например), если проход по всем заклам. Подкорректировать свитчи, чтобы можно было кастовать новое заклинание. Если пока не трогать AI, то вполне реально и довольно быстро запилить универсальный плагин, позволяющий расширить список заклинаний до 255.

Идея интересная. Нужно будет как-нибудь попробовать. Если без кода самих заклинаний, то плагин получится точно меньше, чем NewMagicMirror.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 16 авг 2021, 18:40

AlexSpl писал(а):

Если пока не трогать AI

Я думаю, в конечном итоге его все же придеться трогать. AI как бы тоже должен его уметь применять. Но то уже в самом конце, когда все готово будет.

***

Кстати, у меня как-то была идея добавить еще один интересный закл - Старение. Если Страх изначально планировался разработчиками и потом его убрали, то закла Старение никогда не было - это лично моя идея. Просто хотелось перенести в заклы самую крутую абилку Призрачных драконов в виде заклинания, наподобие Слепоты и Удара Молнии (абилки Единорогов и Птиц Грома).

Старение - заклинание 5 уровня, стоимостью 25 маны (20 при развитии Школы магии) и длительностью в СМ раундов боя. Школа магии Земли (или Огня). При использовании – юниты целевого отряда противника состарятся – показатель здоровья каждого из них будет снижен на 30%/40%/50% в зависимости от уровня развития Магии Земли (или Огня).

Ну главное разобраться со Страхом, а дальше видно будет. На основе полученного кода добавить другой закл будет уже проще.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 16 авг 2021, 20:56

За основу взял RoE 1.2, как последнюю, в которой можно получить заклинание Fear:

Код: Выделить всё
00000000 _Spell_         struc ; (sizeof=0x84, mappedto_92)
00000000                                         ; XREF: .data:Spells/r
00000000                                         ; .data:005E352C/r ...
00000000 type            dd ?                    ; base 16
00000004 wav_name        dd ?                    ; offset
00000008 animation_ix    dd ?                    ; base 16
0000000C flags           dd ?                    ; base 16
00000010 name            dd ?                    ; offset
00000014 short_name      dd ?                    ; offset
00000018 level           dd ?                    ; base 16
0000001C school_flags    dd ?                    ; base 16
00000020 mana_cost       dd 4 dup(?)             ; base 16
00000030 eff_power       dd ?                    ; base 16
00000034 effect          dd 4 dup(?)             ; base 16
00000044 chance2get_var  dd 8 dup(?)             ; base 16
00000064 ai_value        dd 4 dup(?)             ; base 16
00000074 description     dd 4 dup(?)             ; offset
00000084 _Spell_         ends

Код: Выделить всё
.data:005E34A8 Spells          _Spell_ <0, offset aSummboatWav, 0FFFFFFFFh, 80002h, 0, 0, 0, 0, 0, 0,\
.data:005E34A8                                         ; DATA XREF: .data:off_5E5DE8vo
.data:005E34A8                          0, 0, 0, 0>    ; "SummBoat.wav"
.data:005E352C                 _Spell_ <0, offset aScutboatWav, 0FFFFFFFFh, 2, 0, 0, 0, 0, 0, 0, 0, \ ; "ScutBoat.wav"
.data:005E352C                          0, 0, 0>
.data:005E35B0                 _Spell_ <0, offset aVisionsWav, 0FFFFFFFFh, 2, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Visions.wav"
.data:005E35B0                          0, 0>
.data:005E3634                 _Spell_ <0, 0, 0FFFFFFFFh, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>
.data:005E36B8                 _Spell_ <0, offset aDisguiseWav, 0FFFFFFFFh, 2, 0, 0, 0, 0, 0, 0, 0, \ ; "Disguise.wav"
.data:005E36B8                          0, 0, 0>
.data:005E373C                 _Spell_ <0, 0, 0FFFFFFFFh, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>
.data:005E37C0                 _Spell_ <0, offset aFlyspellWav, 0FFFFFFFFh, 80002h, 0, 0, 0, 0, 0, 0,\ ; "FlySpell.wav"
.data:005E37C0                          0, 0, 0, 0>
.data:005E3844                 _Spell_ <0, offset aWatrwalkWav, 0FFFFFFFFh, 80002h, 0, 0, 0, 0, 0, 0,\ ; "WatrWalk.wav"
.data:005E3844                          0, 0, 0, 0>
.data:005E38C8                 _Spell_ <0, offset aTelptoutWav_1, 0FFFFFFFFh, 80002h, 0, 0, 0, 0, 0, \ ; "Telptout.wav"
.data:005E38C8                          0, 0, 0, 0, 0>
.data:005E394C                 _Spell_ <0, offset aTelptoutWav_1, 0FFFFFFFFh, 80002h, 0, 0, 0, 0, 0, \ ; "Telptout.wav"
.data:005E394C                          0, 0, 0, 0, 0>
.data:005E39D0                 _Spell_ <0, 0, 37h, 81h, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>
.data:005E3A54                 _Spell_ <0, 0, 2Fh, 81h, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>
.data:005E3AD8                 _Spell_ <0, offset aForcefldWav, 0FFFFFFFFh, 81h, 0, 0, 0, 0, 0, 0, 0,\ ; "Forcefld.wav"
.data:005E3AD8                          0, 0, 0>
.data:005E3B5C                 _Spell_ <0, offset aFirewallWav, 41h, 81h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Firewall.wav"
.data:005E3B5C                          0>
.data:005E3BE0                 _Spell_ <0, offset aErthquakWav, 0FFFFFFFFh, 80001h, 0, 0, 0, 0, 0, 0,\ ; "Erthquak.wav"
.data:005E3BE0                          0, 0, 0, 0>
.data:005E3C64                 _Spell_ <0FFFFFFFFh, offset aMagicbltWav, 40h, 4211h, 0, 0, 0, 0, 0, \ ; "MagicBlt.wav"
.data:005E3C64                          0, 0, 0, 0, 0>
.data:005E3CE8                 _Spell_ <0FFFFFFFFh, offset aIcerayWav, 2Eh, 4211h, 0, 0, 0, 0, 0, 0, \ ; "IceRay.wav"
.data:005E3CE8                          0, 0, 0, 0>
.data:005E3D6C                 _Spell_ <0FFFFFFFFh, offset aLightbltWav, 31h, 4211h, 0, 0, 0, 0, 0, \ ; "LightBlt.wav"
.data:005E3D6C                          0, 0, 0, 0, 0>
.data:005E3DF0                 _Spell_ <0FFFFFFFFh, offset aDecayWav, 0Ah, 5211h, 0, 0, 0, 0, 0, 0, \ ; "Decay.wav"
.data:005E3DF0                          0, 0, 0, 0>
.data:005E3E74                 _Spell_ <0, offset aChainlteWav, 26h, 8211h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Chainlte.wav"
.data:005E3E74                          0, 0>
.data:005E3EF8                 _Spell_ <0, offset aFrostingWav, 2Dh, 4281h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Frosting.wav"
.data:005E3EF8                          0, 0>
.data:005E3F7C                 _Spell_ <0, offset aSpontcombWav, 35h, 4281h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Spontcomb.wav"
.data:005E3F7C                          0, 0>
.data:005E4000                 _Spell_ <0, offset aFireblstWav, 9, 8281h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Fireblst.wav"
.data:005E4000                          0>
.data:005E4084                 _Spell_ <0, offset aMeteorWav, 10h, 4281h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Meteor.wav"
.data:005E4084                          0>
.data:005E4108                 _Spell_ <0, offset aDeathripWav, 8, 11201h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Deathrip.wav"
.data:005E4108                          0>
.data:005E418C                 _Spell_ <0, offset aSacbrethWav, 1Dh, 10201h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Sacbreth.wav"
.data:005E418C                          0, 0>
.data:005E4210                 _Spell_ <0, offset aFirestrmWav, 0Ch, 10201h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Firestrm.wav"
.data:005E4210                          0, 0>
.data:005E4294                 _Spell_ <1, offset aShieldWav, 1Bh, 22845h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Shield.wav"
.data:005E4294                          0>
.data:005E4318                 _Spell_ <1, offset aAirsheldWav, 2, 22845h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Airsheld.wav"
.data:005E4318                          0>
.data:005E439C                 _Spell_ <1, offset aFireshldWav, 0Bh, 22815h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Fireshld.wav"
.data:005E439C                          0, 0>
.data:005E4420                 _Spell_ <1, offset aProtectaWav, 16h, 22845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Protecta.wav"
.data:005E4420                          0, 0>
.data:005E44A4                 _Spell_ <1, offset aProtectfWav, 18h, 22845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Protectf.wav"
.data:005E44A4                          0, 0>
.data:005E4528                 _Spell_ <1, offset aProtectwWav, 17h, 22845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Protectw.wav"
.data:005E4528                          0, 0>
.data:005E45AC                 _Spell_ <1, offset aProtecteWav, 1Ah, 22845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Protecte.wav"
.data:005E45AC                          0, 0>
.data:005E4630                 _Spell_ <1, offset aAntimagkWav, 5, 22815h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Antimagk.wav"
.data:005E4630                          0>
.data:005E46B4                 _Spell_ <0, offset aDispellWav, 29h, 20041h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Dispell.wav"
.data:005E46B4                          0, 0>
.data:005E4738                 _Spell_ <1, offset aBacklashWav, 3, 22815h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Backlash.wav"
.data:005E4738                          0>
.data:005E47BC                 _Spell_ <1, offset aCureWav, 27h, 20841h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Cure.wav"
.data:005E47BC                          0>
.data:005E4840                 _Spell_ <1, offset aResurectWav, 32h, 41011h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Resurect.wav"
.data:005E4840                          0, 0>
.data:005E48C4                 _Spell_ <1, offset aAnimdeadWav, 4, 41011h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Animdead.wav"
.data:005E48C4                          0>
.data:005E4948                 _Spell_ <1, offset aSacrif1Wav, 34h, 1011h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Sacrif1.wav"
.data:005E4948                          0>
.data:005E49CC                 _Spell_ <1, offset aBlessWav, 24h, 20845h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Bless.wav"
.data:005E49CC                          0>
.data:005E4A50                 _Spell_ <0FFFFFFFFh, offset aCurse, 28h, 20045h, 0, 0, 0, 0, 0, 0, 0, \ ; "Curse"
.data:005E4A50                          0, 0, 0>
.data:005E4AD4                 _Spell_ <1, offset aBloodlusWav, 0FFFFFFFFh, 21845h, 0, 0, 0, 0, 0, 0,\ ; "BloodLus.wav"
.data:005E4AD4                          0, 0, 0, 0>
.data:005E4B58                 _Spell_ <1, offset aPrecisonWav, 19h, 20845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Precison.wav"
.data:005E4B58                          0, 0>
.data:005E4BDC                 _Spell_ <0FFFFFFFFh, offset aWeaknessWav, 38h, 20045h, 0, 0, 0, 0, 0, \ ; "Weakness.wav"
.data:005E4BDC                          0, 0, 0, 0, 0>
.data:005E4C60                 _Spell_ <1, offset aTuffskinWav, 36h, 22845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Tuffskin.wav"
.data:005E4C60                          0, 0>
.data:005E4CE4                 _Spell_ <0FFFFFFFFh, offset aDisruptrWav, 0Eh, 20011h, 0, 0, 0, 0, 0, \ ; "Disruptr.wav"
.data:005E4CE4                          0, 0, 0, 0, 0>
.data:005E4D68                 _Spell_ <1, offset aPrayerWav, 0, 20845h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Prayer.wav"
.data:005E4D68                          0>
.data:005E4DEC                 _Spell_ <1, offset aMirthWav, 14h, 20C45h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Mirth.wav"
.data:005E4DEC                          0>
.data:005E4E70                 _Spell_ <0FFFFFFFFh, offset aSorrowWav, 1Eh, 20445h, 0, 0, 0, 0, 0, 0,\ ; "Sorrow.wav"
.data:005E4E70                          0, 0, 0, 0>
.data:005E4EF4                 _Spell_ <1, offset aFortuneWav, 12h, 20845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Fortune.wav"
.data:005E4EF4                          0, 0>
.data:005E4F78                 _Spell_ <0FFFFFFFFh, offset aMisfortWav, 30h, 20045h, 0, 0, 0, 0, 0, \ ; "Misfort.wav"
.data:005E4F78                          0, 0, 0, 0, 0>
.data:005E4FFC                 _Spell_ <1, offset aTailwindWav, 1Fh, 21845h, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Tailwind.wav"
.data:005E4FFC                          0, 0>
.data:005E5080                 _Spell_ <0FFFFFFFFh, offset aMuckmireWav, 13h, 21045h, 0, 0, 0, 0, 0, \ ; "Muckmire.wav"
.data:005E5080                          0, 0, 0, 0, 0>
.data:005E5104                 _Spell_ <1, offset aSlayerWav, 1Ch, 20815h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Slayer.wav"
.data:005E5104                          0>
.data:005E5188                 _Spell_ <1, offset aFrenzyWav, 11h, 20C15h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Frenzy.wav"
.data:005E5188                          0>
.data:005E520C                 _Spell_ <0FFFFFFFFh, offset aFearWav, 0Fh, 20415h, 0, 0, 0, 0, 0, 0, \ ; "Fear.wav"
.data:005E520C                          0, 0, 0, 0>
.data:005E5290                 _Spell_ <1, offset aCntrstrkWav, 7, 23845h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Cntrstrk.wav"
.data:005E5290                          0>
.data:005E5314                 _Spell_ <0FFFFFFFFh, offset aBerserkWav, 23h, 21485h, 0, 0, 0, 0, 0, \ ; "Berserk.wav"
.data:005E5314                          0, 0, 0, 0, 0>
.data:005E5398                 _Spell_ <0FFFFFFFFh, offset aHypnotizWav, 15h, 41415h, 0, 0, 0, 0, 0, \ ; "Hypnotiz.wav"
.data:005E5398                          0, 0, 0, 0, 0>
.data:005E541C                 _Spell_ <0FFFFFFFFh, offset aForgetWav, 2Ah, 1425h, 0, 0, 0, 0, 0, 0, \ ; "Forget.wav"
.data:005E541C                          0, 0, 0, 0>
.data:005E54A0                 _Spell_ <0FFFFFFFFh, offset aBlindWav, 6, 21415h, 0, 0, 0, 0, 0, 0, 0,\ ; "Blind.wav"
.data:005E54A0                          0, 0, 0>
.data:005E5524                 _Spell_ <1, offset aTelptoutWav_0, 0FFFFFFFFh, 21011h, 0, 0, 0, 0, 0, \ ; "TelptOut.wav"
.data:005E5524                          0, 0, 0, 0, 0>
.data:005E55A8                 _Spell_ <0, offset aRemoveobWav, 22h, 101h, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ ; "Removeob.wav"
.data:005E55A8                          0>
.data:005E562C                 _Spell_ <1, offset aCloneWav, 0FFFFFFFFh, 21011h, 0, 0, 0, 0, 0, 0, 0,\ ; "Clone.wav"
.data:005E562C                          0, 0, 0>
.data:005E56B0                 _Spell_ <0, offset aSumnelmWav, 0FFFFFFFFh, 40001h, 0, 0, 0, 0, 0, 0, \ ; "SumnElm.wav"
.data:005E56B0                          0, 0, 0, 0>
.data:005E5734                 _Spell_ <0, offset aSumnelmWav, 0FFFFFFFFh, 40001h, 0, 0, 0, 0, 0, 0, \ ; "SumnElm.wav"
.data:005E5734                          0, 0, 0, 0>
.data:005E57B8                 _Spell_ <0, offset aSumnelmWav, 0FFFFFFFFh, 40001h, 0, 0, 0, 0, 0, 0, \ ; "SumnElm.wav"
.data:005E57B8                          0, 0, 0, 0>
.data:005E583C                 _Spell_ <0, offset aSumnelmWav, 0FFFFFFFFh, 40001h, 0, 0, 0, 0, 0, 0, \ ; "SumnElm.wav"
.data:005E583C                          0, 0, 0, 0>
.data:005E58C0                 _Spell_ <0FFFFFFFFh, offset aParalyzeWav, 0FFFFFFFFh, 101Ch, 0, 0, 0, \ ; "Paralyze.wav"
.data:005E58C0                          0, 0, 0, 0, 0, 0, 0>
.data:005E5944                 _Spell_ <0FFFFFFFFh, offset aPoisonWav, 43h, 101Ch, 0, 0, 0, 0, 0, 0, \ ; "Poison.wav"
.data:005E5944                          0, 0, 0, 0>
.data:005E59C8                 _Spell_ <0FFFFFFFFh, offset aBindWav, 44h, 1018h, 0, 0, 0, 0, 0, 0, 0,\ ; "Bind.wav"
.data:005E59C8                          0, 0, 0>
.data:005E5A4C                 _Spell_ <0FFFFFFFFh, offset aDiseaseWav, 45h, 101Ch, 0, 0, 0, 0, 0, 0,\ ; "Disease.wav"
.data:005E5A4C                          0, 0, 0, 0>
.data:005E5AD0                 _Spell_ <0FFFFFFFFh, offset aParalyzeWav, 46h, 101Ch, 0, 0, 0, 0, 0, \ ; "Paralyze.wav"
.data:005E5AD0                          0, 0, 0, 0, 0>
.data:005E5B54                 _Spell_ <0FFFFFFFFh, offset aAgeWav, 47h, 101Ch, 0, 0, 0, 0, 0, 0, 0, \ ; "Age.wav"
.data:005E5B54                          0, 0, 0>
.data:005E5BD8                 _Spell_ <0, offset aDeathcldWav, 48h, 18h, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ; "Deathcld.wav"
.data:005E5BD8                          0>
.data:005E5C5C                 _Spell_ <0FFFFFFFFh, offset aLightbltWav, 31h, 218h, 0, 0, 0, 0, 0, 0,\ ; "LightBlt.wav"
.data:005E5C5C                          0, 0, 0, 0>
.data:005E5CE0                 _Spell_ <0FFFFFFFFh, offset aDispellWav, 29h, 18h, 0, 0, 0, 0, 0, 0, \ ; "Dispell.wav"
.data:005E5CE0                          0, 0, 0, 0>
.data:005E5D64                 _Spell_ <0FFFFFFFFh, offset aDeathstrWav, 50h, 18h, 0, 0, 0, 0, 0, 0, \ ; "Deathstr.wav"
.data:005E5D64                          0, 0, 0, 0>

Из кода видно, что у Fear индекс анимации 0Fh = 15 (это полупрозрачный вариант анимации Death Stare*) и звук "Fear.wav". Все картинки, а также описания тоже присутствуют в ресурсах. Набор флагов уникальный - 20415h = 100000010000010101b (SPF_BATTLE | SPF_TIME | SPF_ON_STACK | SPF_MIND | флаг для AI).

* Возможно, баг функции, которая воспроизводит анимацию. В ресурсах я такого не нахожу. Как C07SPE0.def, только анимация полупрозрачная.

* * *
Не похоже на баг. Действительно, C07SPE0.def - это анимация с индексом 15:

Код: Выделить всё
00000000 _MagicAnim_     struc ; (sizeof=0x8, mappedto_94)
00000000                                         ; XREF: .rdata:MagicAnims/r
00000000                                         ; .rdata:005B9CF8/r ...
00000000 DefName         dd ?                    ; offset
00000004 Type            dd ?
00000008 _MagicAnim_     ends

Код: Выделить всё
.rdata:005B9CF0 MagicAnims      _MagicAnim_ <offset aC10spwDef, 100h>
.rdata:005B9CF0                                         ; DATA XREF: sub_45CF50+158^r
.rdata:005B9CF0                                         ; sub_45CF50+52C^r ...
.rdata:005B9CF0                                         ; "C10spW.def"
.rdata:005B9CF8                 _MagicAnim_ <offset aC11spa0Def, 2> ; "C11spA0.def"
.rdata:005B9D00                 _MagicAnim_ <offset aC01spa0Def, 1> ; "C01spA0.def"
.rdata:005B9D08                 _MagicAnim_ <offset aC02spa0Def, 1> ; "C02spA0.def"
.rdata:005B9D10                 _MagicAnim_ <offset aC01spe0Def, 1> ; "C01spE0.def"
.rdata:005B9D18                 _MagicAnim_ <offset aC02spe0Def, 1> ; "C02spE0.def"
.rdata:005B9D20                 _MagicAnim_ <offset aC02spf0Def, 1> ; "C02spF0.def"
.rdata:005B9D28                 _MagicAnim_ <offset aC04spa0Def, 1> ; "C04spA0.def"
.rdata:005B9D30                 _MagicAnim_ <offset aC04spe0Def, 1> ; "C04spE0.def"
.rdata:005B9D38                 _MagicAnim_ <offset aC04spf0Def, 1> ; "C04spF0.def"
.rdata:005B9D40                 _MagicAnim_ <offset aC05spe0Def, 0> ; "C05spE0.def"
.rdata:005B9D48                 _MagicAnim_ <offset aC05spf0Def, 1> ; "C05spF0.def"
.rdata:005B9D50                 _MagicAnim_ <offset aC06spf0Def, 0Fh> ; "C06spF0.def"
.rdata:005B9D58                 _MagicAnim_ <offset aC07spa0Def_0, 0Fh> ; "C07spA0.def"
.rdata:005B9D60                 _MagicAnim_ <offset aC07spa1Def, 101h> ; "C07spA1.def"
.rdata:005B9D68                 _MagicAnim_ <offset aC07spe0Def_0, 101h> ; "C07spE0.def"
.rdata:005B9D70                 _MagicAnim_ <offset aC08spe0Def, 1> ; "C08spE0.def"
.rdata:005B9D78                 _MagicAnim_ <offset aC08spf0Def, 1> ; "C08spF0.def"
.rdata:005B9D80                 _MagicAnim_ <offset aC09spa0Def, 1> ; "C09spA0.def"
.rdata:005B9D88                 _MagicAnim_ <offset aC09spe0Def, 0> ; "C09spE0.def"
.rdata:005B9D90                 _MagicAnim_ <offset aC09spw0Def, 1> ; "C09spW0.def"
.rdata:005B9D98                 _MagicAnim_ <offset aC10spa0Def, 1> ; "C10spA0.def"
.rdata:005B9DA0                 _MagicAnim_ <offset aC11spe0Def, 0> ; "C11spE0.def"
.rdata:005B9DA8                 _MagicAnim_ <offset aC11spf0Def, 0> ; "C11spF0.def"
.rdata:005B9DB0                 _MagicAnim_ <offset aC11spw0Def, 0> ; "C11spW0.def"
.rdata:005B9DB8                 _MagicAnim_ <offset aC12spa0Def, 1> ; "C12spA0.def"
.rdata:005B9DC0                 _MagicAnim_ <offset aC13spa0Def, 0> ; "C13spA0.def"
.rdata:005B9DC8                 _MagicAnim_ <offset aC13spe0Def, 1> ; "C13spE0.def"
.rdata:005B9DD0                 _MagicAnim_ <offset aC13spw0Def, 1> ; "C13spW0.def"
.rdata:005B9DD8                 _MagicAnim_ <offset aC14spa0Def, 101h> ; "C14spA0.def"
.rdata:005B9DE0                 _MagicAnim_ <offset aC14spe0Def, 1> ; "C14spE0.def"
.rdata:005B9DE8                 _MagicAnim_ <offset aC15spa0Def, 0> ; "C15spA0.def"
.rdata:005B9DF0                 _MagicAnim_ <offset aC15spe0Def, 0> ; "C15spE0.def"
.rdata:005B9DF8                 _MagicAnim_ <offset aC15spe9Def, 0> ; "C15spE9.def"
.rdata:005B9E00                 _MagicAnim_ <offset aC18spw0Def, 0> ; "C18spW0.def"
.rdata:005B9E08                 _MagicAnim_ <offset aC01spf0Def, 1> ; "C01spF0.def"
.rdata:005B9E10                 _MagicAnim_ <offset aC01spw0Def, 1> ; "C01spW0.def"
.rdata:005B9E18                 _MagicAnim_ <offset aC03spa0Def, 2> ; "C03spA0.def"
.rdata:005B9E20                 _MagicAnim_ <offset aC03spa1Def, 1> ; "C03spA1.def"
.rdata:005B9E28                 _MagicAnim_ <offset aC03spw0Def, 1> ; "C03spW0.def"
.rdata:005B9E30                 _MagicAnim_ <offset aC04spw0Def, 1> ; "C04spW0.def"
.rdata:005B9E38                 _MagicAnim_ <offset aC05spw0Def, 1> ; "C05spW0.def"
.rdata:005B9E40                 _MagicAnim_ <offset aC06spw0Def, 1> ; "C06spW0.def"
.rdata:005B9E48                 _MagicAnim_ <offset aC07spf0Def, 4> ; "C07spF0.def"
.rdata:005B9E50                 _MagicAnim_ <offset aC07spf9Def, 4> ; "C07spF9.def"
.rdata:005B9E58                 _MagicAnim_ <offset aC07spw0Def, 1> ; "C07spW0.def"
.rdata:005B9E60                 _MagicAnim_ <offset aC08spw5Def, 101h> ; "C08spW5.def"
.rdata:005B9E68                 _MagicAnim_ <offset aC09spf0Def, 4> ; "C09spF0.def"
.rdata:005B9E70                 _MagicAnim_ <offset aC10spf0Def, 1> ; "C10spF0.def"
.rdata:005B9E78                 _MagicAnim_ <offset aC11spa1Def, 0> ; "C11spA1.def"
.rdata:005B9E80                 _MagicAnim_ <offset aC12spe0Def, 101h> ; "C12spE0.def"
.rdata:005B9E88                 _MagicAnim_ <offset aC12spf0Def, 1> ; "C12spF0.def"
.rdata:005B9E90                 _MagicAnim_ <offset aC12spf1Def, 101h> ; "C12spF1.def"
.rdata:005B9E98                 _MagicAnim_ <offset aC13spfDef, 1> ; "C13spF.def"
.rdata:005B9EA0                 _MagicAnim_ <offset aC16spe0Def, 1> ; "C16spE0.def"
.rdata:005B9EA8                 _MagicAnim_ <offset aC17spe0Def, 4> ; "C17spE0.def"
.rdata:005B9EB0                 _MagicAnim_ <offset aC17spw0Def, 1> ; "C17spW0.def"
.rdata:005B9EB8                 _MagicAnim_ <offset aC09spf3Def, 0> ; "C09spF3.def"
.rdata:005B9EC0                 _MagicAnim_ <offset aC17spe2Def, 4> ; "C17spE2.def"
.rdata:005B9EC8                 _MagicAnim_ <offset aC09spf2Def, 4> ; "C09spF2.def"
.rdata:005B9ED0                 _MagicAnim_ <offset aC15spe2Def, 4> ; "C15spE2.def"
.rdata:005B9ED8                 _MagicAnim_ <offset aC15spe11Def, 4> ; "C15spE11.def"
.rdata:005B9EE0                 _MagicAnim_ <offset aC07spf2Def, 4> ; "C07spF2.def"
.rdata:005B9EE8                 _MagicAnim_ <offset aC07spf11Def, 4> ; "C07spF11.def"
.rdata:005B9EF0                 _MagicAnim_ <offset aC20spxDef, 1> ; "C20SPX.DEF"
.rdata:005B9EF8                 _MagicAnim_ <offset aC07spf60Def, 4> ; "C07spF60.def"
.rdata:005B9F00                 _MagicAnim_ <offset aC07spf62Def, 4> ; "C07spF62.def"
.rdata:005B9F08                 _MagicAnim_ <offset aSp11Def, 1> ; "sp11_.def"
.rdata:005B9F10                 _MagicAnim_ <offset aSp02Def, 0> ; "sp02_.def"
.rdata:005B9F18                 _MagicAnim_ <offset aSp05Def, 1> ; "sp05_.def"
.rdata:005B9F20                 _MagicAnim_ <offset aSp10Def, 0> ; "sp10_.def"
.rdata:005B9F28                 _MagicAnim_ <offset aSp01Def, 1> ; "sp01_.def"
.rdata:005B9F30                 _MagicAnim_ <offset aSp04Def, 10Fh> ; "sp04_.def"
.rdata:005B9F38                 _MagicAnim_ <offset aSp03Def, 1> ; "sp03_.def"
.rdata:005B9F40                 _MagicAnim_ <offset aSp06Def, 101h> ; "sp06_.def"
.rdata:005B9F48                 _MagicAnim_ <offset aSp07ADef, 1> ; "sp07_A.def"
.rdata:005B9F50                 _MagicAnim_ <offset aSp07BDef, 1> ; "sp07_B.def"
.rdata:005B9F58                 _MagicAnim_ <offset aSp08Def, 0> ; "sp08_.def"
.rdata:005B9F60                 _MagicAnim_ <offset aSp09Def, 3> ; "sp09_.def"
.rdata:005B9F68                 _MagicAnim_ <offset aSp12Def, 101h> ; "sp12_.def"
.rdata:005B9F70                 _MagicAnim_ <offset aC07spe0Def, 1> ; "c07spe0.def"
.rdata:005B9F78                 _MagicAnim_ <offset aPoofDef, 0> ; "poof.def"

Такая же у абилки Могучих горгон (индекс 50h = 80). Разница только в регистре имени файла :smile4: "C07spE0.def" vs. "c07spe0.def", что подтверждает, что это не механическая ошибка при наборе кода. Ещё видно, что тип (а точнее, флаги) анимации разные: 101h у заклинания Fear и 1 у абилки Могучих горгон (отсюда и полупрозрачность, я думаю). Так что, похоже, это реальная анимация заклинания Fear. Кроме того, по суффиксу "E" можно сделать однозначный вывод, что заклинание Fear относится к Магии Земли (A - Воздух, E - Земля, F - Огонь, W - Вода).

* * *
Заполненная из sptraits.txt структура _Spell_ заклинания Fear:

Код: Выделить всё
.data:005E520C dd -1                                   ; type ; "Fear.wav"
.data:005E520C dd offset aFearWav                      ; wav_name
.data:005E520C dd 15                                   ; animation_ix
.data:005E520C dd 100000010000010101b                  ; flags
.data:005E520C dd offset unk_2949AB0                   ; name
.data:005E520C dd offset unk_2949A90                   ; short_name
.data:005E520C dd 4                                    ; level
.data:005E520C dd 0                                    ; school_flags
.data:005E520C dd 16, 8, 8, 8                          ; [0].mana_cost
.data:005E520C dd 0                                    ; eff_power
.data:005E520C dd 75, 75, 50, 25                       ; [0].effect
.data:005E520C dd 0, 0, 0, 0, 0, 0, 0, 0               ; [0].chance2get_var
.data:005E520C dd 50, 50, 50, 50                       ; ai_value
.data:005E520C dd offset unk_2949A10, offset unk_2949960, offset unk_29498B0, offset unk_29497F0; [0].description

Собственно, здесь можно увидеть всё то, что есть в sptraits.txt.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 17 авг 2021, 05:50

AlexSpl писал(а):

Не похоже на баг. Действительно, C07SPE0.def - это анимация с индексом 15:

Есть еще такая прозрачная анимация, как C0fear.def - это абилка Лазурных драконов. Но там принцип действия немного другой, нежели тот, который описан в ресурсах игры для закла "Fear." У абилки отряд просто пропускает свой ход, а пропуск хода сопровождается этой анимацией, подобно отрицательной морали, только анимация другая.

А у закла, как я понял, отряд ходить может, только его скорость существенно снижается, подобно Медлительности, только у Медлительности на Экперте 50% для всех, а здесь 75% для одного отряда. Но сам отряд может подойти хоть вплотную к вражескому отряду, просто сам атаковать и отвечать на атаки врага, как я понял, не может. Типа груша для битья. :smile1:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 17 авг 2021, 08:27

Примерно так будет:

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "..\..\HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;

//char iniPath[MAX_PATH];

#define SPL_FEAR 81
_Spell_ spell[128];

int __stdcall afterInit(LoHook* h, HookContext* c)
{
   for (int i = 0; i < SPL_FEAR; ++i)
      spell[i] = o_Spell[i];

   spell[SPL_FEAR].type = -1;
   spell[SPL_FEAR].wav_name = "Fear.wav";
   spell[SPL_FEAR].animation_ix = 15;
   spell[SPL_FEAR].flags = 0x20415;
   spell[SPL_FEAR].name = "Fear";
   spell[SPL_FEAR].short_name = "Fear";
   spell[SPL_FEAR].level = 4;
   spell[SPL_FEAR].school_flags = 8;
   spell[SPL_FEAR].mana_cost[0] = 16;
   spell[SPL_FEAR].mana_cost[1] = 8;
   spell[SPL_FEAR].mana_cost[2] = 8;
   spell[SPL_FEAR].mana_cost[3] = 8;
   spell[SPL_FEAR].eff_power = 0;
   spell[SPL_FEAR].effect[0] = 75;
   spell[SPL_FEAR].effect[1] = 75;
   spell[SPL_FEAR].effect[2] = 50;
   spell[SPL_FEAR].effect[3] = 25;
   spell[SPL_FEAR].chance2get_var[0] = 10;
   spell[SPL_FEAR].chance2get_var[1] = 10;
   spell[SPL_FEAR].chance2get_var[2] = 10;
   spell[SPL_FEAR].chance2get_var[3] = 10;
   spell[SPL_FEAR].chance2get_var[4] = 10;
   spell[SPL_FEAR].chance2get_var[5] = 10;
   spell[SPL_FEAR].chance2get_var[6] = 10;
   spell[SPL_FEAR].chance2get_var[7] = 10;
   spell[SPL_FEAR].chance2get_var[8] = 10;
   spell[SPL_FEAR].ai_value[0] = 50;
   spell[SPL_FEAR].ai_value[1] = 50;
   spell[SPL_FEAR].ai_value[2] = 50;
   spell[SPL_FEAR].ai_value[3] = 50;
   spell[SPL_FEAR].description[0] = "{Fear}\n\n...";
   spell[SPL_FEAR].description[1] = "{Fear}\n\n...";
   spell[SPL_FEAR].description[2] = "{Fear}\n\n...";
   spell[SPL_FEAR].description[3] = "{Fear}\n\n...";

   _PI->WriteDword(0x687FA8, (int)&spell);
   
   return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
   static bool plugin_On = false;
   if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
   {
      if ( !plugin_On )
      {
           plugin_On = true;
           _P = GetPatcher();
           _PI = _P->CreateInstance("HD.Plugin.H3.NewSpells");
         
         //GetCurrentDirectoryA(sizeof(iniPath), iniPath);
         //strcat(iniPath, "\\NewSpells.ini");

         _PI->WriteLoHook(0x4EE1C1, afterInit);
      }
   }

   return TRUE;
}

Остальное - много работы (к таблице, как минимум, 270 обращений*) по исправлению кода, работающего с таблицей заклинаний (условий вида >= 70, < 70 и т.п.). Тут можно пойти двумя путями: 1) вставлять новые заклинания до абилок существ; 2) вставлять после абилок существ (как в примере выше). Посмотрев код, а также def-ки заклинаний (SpellBon.def, SpellInt.def, spells.def, SpellScr.def), полагаю, что первый вариант будет проще: не придётся писать двойные условия и вставлять пустые кадры в def-ки. Минус я вижу пока только один: придётся пройтись по всем спецабилкам и пододвинуть их ID и кадры в def-ках на кол-во новых заклинаний (можно с запасом). Однако для демонстации Fear быстрее будет пойти первым путём.

Если кто желает помочь: нужны def-ки с запакованными картинками Fear в: 1) позиции после последнего заклинания (т.е. перед картинками абилок существ); 2) позиции после абилок существ (если абилок нет, вставить пустые кадры).

А ещё нужно будет перенести таблицу анимаций (в SoD 15-я анимация, если не ошибаюсь, Страх Лазурных драконов).

* Конечно, далеко не все придётся менять, но, думаю, из 270 наберётся прилично участков кода, которые придётся править.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 17 авг 2021, 08:50

AlexSpl писал(а):

Тут можно пойти двумя путями: 1) вставлять новые заклинания до абилок существ; 2) вставлять после абилок существ (как в примере выше). Посмотрев код, а также def-ки заклинаний (SpellBon.def, SpellInt.def, spells.def, SpellScr.def), полагаю, что первый вариант будет проще: не придётся писать двойные условия и вставлять пустые кадры в def-ки. Минус я вижу пока только один: придётся пройтись по всем спецабилкам и пододвинуть их ID и кадры в def-ках на кол-во новых заклинаний (можно с запасом). Однако для демонстации Fear быстрее будет пойти первым путём.

А какой вариант более правильный? В конечно итоге одинаково будет все работать и смотреться или нет? Наверное, лучше все же пойти по второму первому варианту, как в примере выше. Не придеться писать двойные условия и вставлять пустые кадры в дефки. Наверное, так будет более правильно.
Последний раз редактировалось Rolex 17 авг 2021, 08:56, всего редактировалось 2 раз(а).
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6