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

Post Reply 
Threaded Mode | Linear Mode
Master of Puppets v. 4
» новая версия, находящаяся в разработке
Author Message
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #121

(21.09.2023 14:28)MOP Wrote:  Я не понимаю, где могут понадобиться статы героя даже под 200.

Лично мне игроки слали претензии о том, почему я ограничился 249, т.к. они при игре годами на XXXL-картах с опциями на повторное посещение объектов и прочими вого-читами умудрялись набирать значения выше 249. Понятно, что в MoP вог-читерство убрано (так же как в ERA+ оно убрано, из-за чего вог-консервативные игроки не приветствуют ERA+), но патч на XXXL-карты уже добавлялся в MoP и теоретически он может добавиться в 4-ю версию MoP.

По себе: так же выше сотни в первичных навыках никогда не набирал, сам патч на 249 - результат спора с Берсеркером (если б не он, сидели бы все по-прежнему на 127, с одной стороны такая случайность, а повлияла даже на MoP, а вот когда делаешь что-то большое, оказывается что оно пригождается единицам, такая ирония судьбы).
21.09.2023 17:34
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #122

(21.09.2023 04:40)StasPV Wrote:  Окно с Древним ну очень круто смотрится, атмосферно получилось20.
Спасибо. Мне, правда, рамка не очень нравится, но на первое время сойдёт.
А сегодня, между тем, сделал этот диалог анимированным. То есть, объясняю:
Весь звёздный (хотя, если приглядеться, это и не звёзды вовсе) задник диалога при анимации создаёт ощущение движения сквозь космическое пространство. Причём при каждом открытии диалога скорость рандомно меняется - от спокойной до очень быстрой, что мешает стать диалогу рутинным в глазах игрока и создаёт такое... особое ощущение. Spiteful
Удачно попавшаяся мне анимация в итоге привела к образованию дефа из 150-ти кадров, который в неупакованном виде весит ажно 60 Мб. В упакованном в h3mop.lod - 4,5 Мб. Именно поэтому гифку для скриншота делать не стал.)


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
22.09.2023 02:06
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #123

Однако, удалить город с карты без вредных последствий - задача куда как нетривиальнее, чем разместить новый.

В последнее время вообще за что ни возьмёшься - приходится преодолевать чудовищные дебри. Взять хоть реализацию битвы "Клинок Армагеддона vs. Ледяной Клинок". Казалось бы - чего проще? Тупо колдовство Армагеддона и Града в начале каждого раунда. Да не тут-то было!
1. Сначала туча времени ушла на то, чтобы понять древнюю истину - менеджер лога битвы не работает в начале нулевого раунда даже после тактической фазы - и даёт вылет. Так что колдуем не в !?BR, а в событии Битва_!_перед_передачей_контроля.
2. Дальше ещё вагон времени потрачен на то, чтобы разобраться с обновлением состояний стеков после получения урона. Так как колдовство происходит без участия героев, то никакого нормального обновления не происходит - умершие стеки остаются стоять, а после первого удара любым стеком все отряды на поле боя анимируют так, будто их тоже задели... Жесть, в общем, и никакой аналог !!BU:R тут не поможет. Пришлось дополнительно ковырять структуру стека.
3. Дальше начинаются танцы с бубном с реализацией иммунитета, когда артефакт есть, и отсутствием, когда у врага его антипод. Если что, воговский !?MR тут не помощник, так как ставит хук не на всё. К счастью, положение спас один из существующих в WERD хуков для Окровавленной Земли.
4. Наконец, ещё один гемор с передачей хода другому отряду, если тот, что должен был походить, подох от заклинаний в начале раунда. Опять фантомный отряд без количества с уроном в единичку... В итоге дело решил перезапуск BattleWhoMoves.
Ну и ещё куча маленьких гадостей, которые, впрочем, не стоят упоминания.


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
28.09.2023 01:53
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #124

MOP, 0x468570 вот эту ф-цию после дамагов надо вызывать вместо BU:R


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
28.09.2023 03:01
Visit this user's website Find all posts by this user Quote this message in a reply
StasPV Offline

Posts: 118
Post: #125

Quote:В последнее время вообще за что ни возьмёшься - приходится преодолевать чудовищные дебри

Тот кто работает на энтузиазме, не ищет лёгких путейAb. МОР, далеко не все обратят внимание на новую реализацию колдовства при битве с клинками, главное чтоб ты был доволен результатом, и удовлетворен решённой задачей.

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

Это ты сейчас работаешь над разрушением и перестройкой городов или над чем то другим?
28.09.2023 04:15
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #126

(28.09.2023 03:01)daemon_n Wrote:  MOP, 0x468570 вот эту ф-цию после дамагов надо вызывать вместо BU:R
Так ровно она и используется в !!BU:R (см. SUB_L007157C1). В оригинале, правда, она вызывается под разными параметрами, но ни одна комбинация мне не помогла. Помогло только это:
Code:
mov ebx, COMBAT_MANAGER
            push [ebx+combatManager.Ландшафт_битвы]
            or [ebx+combatManager.Ландшафт_битвы], -1
; Армагеддон
            mov esi, Текущий_раунд_битвы
            inc esi
            imul esi, 10
            PlayWAV [Адрес_структуры_заклинаний+SPL_Армагеддон*sizeof._Spell_+_Spell_.Звук]
            CastArmageddon ebx, 3, esi
; Град
            PlayWAV [Адрес_структуры_заклинаний+SPL_Град*sizeof._Spell_+_Spell_.Звук]
            stdcall CastHailStorm, 3, esi, ebx
; Нормализация отрядов
            lea esi, [ebx+combatManager.Структуры_стеков]
            xor edi, edi
          @@:
            mov [esi+_CombatMon_.Стек_более_не_является_атакующим_в_текущем_действии], 0
            mov [esi+_CombatMon_.Отображаемое_количество], -1;
            mov [esi+_CombatMon_.Стек_больше_не_считается_получившим_урон_в_раунде], 0
            mov dword [esi+_CombatMon_.Порядок_анимации], 4;
            mov [esi+_CombatMon_.Анимация_на_стеке], 0; прекратить анимацию
            add esi, sizeof._CombatMon_
            inc edi
            cmp edi, 42
            jl @b
            pop [ebx+combatManager.Ландшафт_битвы]

(28.09.2023 04:15)StasPV Wrote:  главное чтоб ты был доволен результатом, и удовлетворен решённой задачей.
Я удовлетворяюсь, но ненадолго. Иначе бы MoP кончился где-то между первой и второй версиями.)
(28.09.2023 04:15)StasPV Wrote:  Это ты сейчас работаешь над разрушением и перестройкой городов или над чем то другим?
Не, хотел сделать логическое продолжение опций, с которыми мне не терпится сыграть - "Запрет жилищ 4-7 уровня в городах" и "Запрет улучшенных жилищ в городах". Короче, опцию "Игра без городов". Думаю, будет прикольно, когда не надо отвлекаться на отстройку и всё внимание уделить карте приключений - поиску внешних жилищ, ресурсов, заклинаний, тюрем, вообще всего, что может иметь критическое значение. Да и воскреснуть в случае поражения не получится.
Опцию задумываю с двумя настройками: "Множитель стартовой армии" (так как с обычной можно просто размазаться об первых же нейтралов) и "Запретить строительство: Да/нет".

Ну а в более широком смысле удаление города с карты нужно не только для этого. Это может быть и проклятие богов. А ещё меня давно интригует идея корованов, как в AoW2 118 С помощью какого-либо артефакта или навыка - свернуть и сунуть город в карман, а потом развернуть в другом, более отдалённом от врагов месте.


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
28.09.2023 21:30
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2814
Post: #127

(28.09.2023 01:53)MOP Wrote:  2. Дальше ещё вагон времени потрачен на то, чтобы разобраться с обновлением состояний стеков после получения урона. Так как колдовство происходит без участия героев, то никакого нормального обновления не происходит - умершие стеки остаются стоять, а после первого удара любым стеком все отряды на поле боя анимируют так, будто их тоже задели... Жесть, в общем, и никакой аналог !!BU:R тут не поможет. Пришлось дополнительно ковырять структуру стека.
Опишу на будущее, на всяк))
Тут нужно было сбросить первый байт в структуре стека (отвечающий за анимацию при перерисовке), и третий (отвечающий за кадр анимации)

PHP Code:
struct _BattleStack_ _Struct_  // размер 0x548 = 1352 байта
{
 
_byte_ bShowAttackFrames;          // +0 
 
_byte_ bShowRangeFrames;           // +1 
 
_byte_ iShowAttackFrameType;       // +2 
 
_byte_ iNextFrameType;             // +3 
 
_byte_ iRemainingFrames;           // +4  
 
_byte_ field_05[3];  // +5 выравнивание стуктуры 

 
_int32_ iDrawPriority;             // +8 
 
_byte_ bShowTroopCount;            // +12 0x0C 
 
_byte_ field_0D[3];                // +13 0x0D выравнивание стуктуры

 
_dword_ targetStackSide;           // +16 0x10 
 
_dword_ targetStackIndex;          // +20 0x14
 
_dword_ targetAttackLimit;         // +24 0x18

 
_int32_ targetGexID;               // 28 +0x1C  позициякуда бежать/стрелять

 
_byte_ isFireshield;               // +32 0x20 огненный щит
 
_byte_ field_21[3];  // +33 0x21  выравнивание стуктуры 

 
_int32_ cloneOwnerStackIndex;      //+36  
 
_int32_ cloneIndex;                // +40 0x28 (номер стэка клона этого)[/code]

и т.д


game bug fixes extended.dll || My Plugins || My GitHub
28.09.2023 22:56
Visit this user's website Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #128

Ну, собственно, примерно то и сделано. Правда, 3-ий байт тревожить и не потребовалось.
Code:
struct _CombatMon_
        Стек_более_не_является_атакующим_в_текущем_действии db ?;            00
        db ?,?,?
        dd ?;
        Порядок_анимации dd ?;                                               08 - стандарт = 4
        dd ?;
        dd ?;
        dd ?;
        dd ?;
        dd ?;
        Анимация_на_стеке db ?;                                              20
        db ?,?,?
        dd ?;                                                                24
        dd ?;                                                                28
        dd ?;                                                                2C
        dd ?;                                                                30
        Тип_существа dd ?;                                                   34
        Позиция dd ?;                                                        38
        dd ?
        dd ?
        dd ?
        dd ?
        Текущее_количество dd ?;                                             4C
        Отображаемое_количество dd ?;                                        50 - -1 - совпадает с настоящим
        ...


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
29.09.2023 01:28
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #129

Собственно, ничего такого сложного в удалении городов с карты не оказалось.
Code:
mov edi, Количество_городов_на_карте
.if Option_Игра_без_городов & edi
        – [Search_X]
  .repeat
        FindObject 98, -1, addr Search_X
        mov eax, [Search_Y]
        dec eax; удаляем город с клетки выше входа, чтобы не задеть героя, стоящего во вратах
        DeleteObject [Search_X], eax, [Search_L]
        mov eax, [Search_X]
        dec eax
        DeleteObject eax, [Search_Y], [Search_L]; удалить возможную левую Коновязь
        mov eax, [Search_X]
        inc eax
        DeleteObject eax, [Search_Y], [Search_L]; удалить возможную правую Коновязь
        dec edi
  .until ZERO?
        rv ebx, GetPlayerStruc, 0
        xor edi, edi
      @@:
        mov [ebx+_Player_.Количество_городов], 0
        mov [ebx+_Player_.Номер_активного_города], -1
        FillMemory addr ebx+_Player_.Номера_городов, 48, -1
        add ebx, sizeof._Player_
        inc edi
        cmp edi, 8
        jl @b
        mov eax, BASE
        add eax, 21614h
        mov dword [eax], 0; нет начала структур
        mov dword [eax+4], 0; нет конца
        mov dword [eax+8], 0; нет выделенной памяти
  .нет_городов:
        mov Количество_городов_на_карте, 0
.endif

Но это удаление всех городов. А для удаления отдельного замка надо ещё написать функцию, которая бы сдвигала вперёд части таблиц, следующие за удалённым городом. Чуть посложнее, но весьма решаемо.
Впрочем, при строительстве нового города игра сама переносит структуры замков в новое место и всё обновляет. Может, можно заставить её делать то же самое и при удалении.


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
29.09.2023 01:52
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2814
Post: #130

(29.09.2023 01:28)MOP Wrote:  Ну, собственно, примерно то и сделано. Правда, 3-ий байт тревожить и не потребовалось.
Соглсен. На счёт третьего байта - я обозначил для более полного понимания. Проверка всё равно идет ток в булевом значении в первом байе.

(29.09.2023 01:52)MOP Wrote:  А для удаления отдельного замка надо ещё написать функцию, которая бы сдвигала вперёд части таблиц, следующие за удалённым городом.
Звучит, как банальная функция расширения/уменьшения обыденного массива)))
O(n), делов то. Для 48-ми элементов - издержки по времени и памяти - ничто!


game bug fixes extended.dll || My Plugins || My GitHub
29.09.2023 07:54
Visit this user's website Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #131

(29.09.2023 01:52)MOP Wrote:      dec eax; удаляем город с клетки выше входа, чтобы не задеть героя, стоящего во вратах

Так игра сглючит, т.к. в eax может попасть -1. Лучше скрывать героя с карты (как будто он зашёл в гарнизон города) и выводить обратно по тем же координатам после удаления города (заодно выводить на карту всех гарнизонных героев, если там они есть, т.к. при удалении города они тоже потеряются игрой).
29.09.2023 17:38
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #132

(29.09.2023 17:38)XEPOMAHT Wrote:  Так игра сглючит, т.к. в eax может попасть -1.
Понимаю, речь идёт о таких случаях:
Image: image.png
Но что удивительно: я только что попробовал опцию с таким "задвинутым" городом - и он удалился безо всяких вылетов и глюков. Ab С героем внутри - да, вылетает, но это, думаю, решаемо. Попробую для начала его просто убить.

(29.09.2023 17:38)XEPOMAHT Wrote:  Лучше скрывать героя с карты
Знал бы я, как это сделать - сделал бы удаление Бродячих Волшебников и Чёрных Магов из-под героя в таймере их перемещений. Функция "Скрытие_и_показ_героя" не даёт ровно ничего. Пришлось превратить баг в фичу - герой своим присутствием во входе объекта "задерживает" волшебника на месте до того момента, когда тот понадобится.
(29.09.2023 17:38)XEPOMAHT Wrote:  заодно выводить на карту всех гарнизонных героев, если там они есть, т.к. при удалении города они тоже потеряются игрой).
А нужно ли? Разберём возможные ситуации:
1. Случайная карта. Героев внутри нет = нет проблем. 115
2. Авторская карта с гарнизонными героями. Собственно, такой расклад подразумевает, что опцию вообще не стоит включать. 108
3. Проклятие богов. Пусть герой дохнет вместе с городом, сам виноват. 101
4. "Сворачивание" города для переноса с другое место. Копируется вся структура города целиком, следовательно - вместе с номером героя, стоящего в гарнизоне. Так что при "разворачивании" - он там и появится. 20
Плюс будет проблема с выводом гарнизонных героев, если снаружи гуляют уже 8 штук.


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
29.09.2023 22:50
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #133

(29.09.2023 22:50)MOP Wrote:  Знал бы я, как это сделать - сделал бы удаление Бродячих Волшебников и Чёрных Магов из-под героя в таймере их перемещений. Функция "Скрытие_и_показ_героя" не даёт ровно ничего. Пришлось превратить баг в фичу - герой своим присутствием во входе объекта "задерживает" волшебника на месте до того момента, когда тот понадобится.

Функцию ActivateHero (417A80h) можно попробовать. Пример из MoP, если герой ставится на коновязь из лодки:

Code:
    ToLandFromABoat advManager, [Herostr], 1; вытаскиваем из лодки
    mov eax, CurrentPlayerStruc
    push 1 0 0 dword [eax+4]; to 417A80h ->
    push 1 edi ebx esi; to TeleportHero ->
    mov esi, [Herostr]
    push esi
    mov byte [465000h+2AD110h+1], 0
    call TeleportHero
    mov byte [465000h+2AD110h+1], 1
    mov ecx, advManager
    mov eax, 417A80h
    call eax; восстановить фокус на герое
29.09.2023 23:26
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #134

Посмотрю, спасибо. Может, и пригодится, так как, не создавая авторские карты, я и помыслить не мог, что, оказывается, гарнизонного героя в редакторе карт вообще никак не задать (!). Можно только героя-гостя. И вот он, в отличие от героя, вручную поставленного во вход города, даёт вылет, несмотря на то, что город удаляется с клетки выше.
Продолжаю эксперименты.


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
29.09.2023 23:56
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #135

Наваял. "Скрытие_и_показ_героя" таки пригодилась.
Code:
proc DeleteTown uses ebx esi edi, x, y, l, addrCopy
             rv esi, GetTownStrucXYL, [x], [y], [l]; получаем структуру города
        .if [addrCopy]; задано копирование
             CopyMemory esi, [addrCopy], sizeof._Town_; копируем структуру города в заданный буфер
        .endif
             movsx edi, [esi + _Town_.Хозяин]
             movsx ebx, [esi + _Town_.Номер]
             mov ecx, [esi+_Town_.Номер_героя_гостя]
        .if signed ecx > -1
             GetHeroStruc ecx
             Скрытие_и_показ_героя eax, 0
        .endif
             mov eax, [y]
             dec eax; удаляем город с клетки выше входа, чтобы не задеть героя, стоящего во вратах
             DeleteObject [x], eax, [l]; удалить город
             mov eax, [x]
             dec eax
             DeleteObject eax, [y], [l]; удалить возможную левую Коновязь
             mov eax, [x]
             inc eax
             DeleteObject eax, [y], [l]; удалить возможную правую Коновязь
        .if edi <> -1; не нейтральный город
             rv esi, GetPlayerStruc, edi
             dec [esi+_Player_.Количество_городов]; вычесть 1 город
           .if bl = [esi+_Player_.Номер_активного_города]
             or [esi+_Player_.Номер_активного_города], -1;
           .endif
             mov al, bl
             lea edi, [esi+_Player_.Номера_городов]
             mov ecx, 48
             repne scasb
             lea eax, [edi-1]
             CopyMemory edi, eax, ecx; сдвигаем список номеров городов на 1 вперёд
        .endif
             mov esi, BASE
             add esi, 21614h
             mov ecx, 48
             mov edi, [esi]; - начало структур городов
           @@:
             cmp [edi + _Town_.Номер], bl
             je @f
             dec ecx
             add edi, sizeof._Town_
             jnz @b
           @@:
             mov eax, [esi+4]; конец структур
             sub eax, sizeof._Town_; переместиться к началу структуры последнего города
             CopyMemory eax, edi, sizeof._Town_; копировать данные последнего города на место освободившегося
             sub dword [esi+4], sizeof._Town_; структуры - уменьшить на одну
             sub dword [esi+8], sizeof._Town_; памяти под города - на 1 меньше
             dec Количество_городов_на_карте
             ret
endp
Вариант, может, и не окончательный, но багов пока не заметил. Герой-гость спокойно остаётся на месте. Герой внутри города исчезает и его не найти нигде в Обзоре Королевства. Однако, на следующий день, если снаружи бегают не 8 героев игрока, он спокойно появляется на месте удалённого города. Если же внешних героев 8 - пропадает неизвестно куда.
Остаётся выяснить, какие сюрпризы сулит копирование структуры удалённого города на место структуры вновь построенного.


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
30.09.2023 02:49
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group