Current time: 22.04.2024, 11:30 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Вопросы по моддингу
» (обсуждаем моддинг здесь)
Author Message
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #1666

(21.01.2021 10:16)igrik Wrote:  так чем тебя этот генератор не устроил?

Жесткая привязка к номерам монстров. Для поддержки Тифона потребуется:

1. получить адрес структуры монстров из эровского RedirectMemoryBlock по идентификатору 7D0C90h (как делается - знает Берсеркер).

2. Если полученный адрес не равен 7D0C90h, значит имеем дело с Тифоном (или с Аметистом, х.з. как проверить конкретную загруженную dll на ЭРЕ), если нет - идут проверки Игрика, п.3 и далее уже пропускаются.

3. Прибавить к адресу структуры её размер (тифоновский: MonNum * sizeof._Creature_). Далее прибавить 56000. Попадаем на тифоновский Ban_Table.

4. Проверяем 1000 байтов на предмет разрешённости 1000 тифоновских монстров:

Code:
do { // ищем доступного монстра из разрешённых
        result = Randint(0, 999);        
    } while ( !monArray[result] );

ну и так далее по коду Игрика.
21.01.2021 14:52
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16488
Post: #1667

Генератор, конечно, не оптимальный по скорости с вечным циклом и дырками. В Mixed Neutrals генерация монстра по уровню — операция O(1) (линейная).
Для этого отсутствующие монстры не попадают в глобальный массив номеров существ вообще + есть отдельные индексированные глобальные массивы по уровням. Не при каждом же вызове делать фильтрацию.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
21.01.2021 14:57
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1668

А может закинуть вот это все
в OnGameEnter, а массив monArray сделать глобальным?


Создал новый глобальный мод: WoG Ultra Edition
21.01.2021 15:06
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2270
Post: #1669

(21.01.2021 14:57)Berserker Wrote:  Для этого отсутствующие монстры не попадают в глобальный массив номеров существ вообще + есть отдельные индексированные глобальные массивы по уровням.

Да, только если памяти не жалко на списки отсортированных монстров. По оптимизации скорости ЦП верхний лимит для выборки случайного монстра можно заранее понизить (например для ERA+ он не 1000, а 221, если скляроз не изменяет, если пройтись по той же таблице запрета - всё что выше 221 байта будет в нулях). Лично я привык экономить память (наследство от консольного моддинга, где её всегда мало).

(21.01.2021 15:06)Raistlin Wrote:  А может закинуть вот это все в OnGameEnter, а массив monArray сделать глобальным?

В Тифоне оно и так глобальное. Смысл в дубликате имеющегося массива?
(This post was last modified: 21.01.2021 15:17 by XEPOMAHT.)
21.01.2021 15:11
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1670

(21.01.2021 15:11)XEPOMAHT Wrote:  В Тифоне оно и так глобальное. Смысл в дубликате имеющегося массива?
igrik пишет универсальный код, который должен работать как с Тифоном, так и без.
21.01.2021 15:24
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2814
Post: #1671

(21.01.2021 14:57)Berserker Wrote:  Генератор, конечно, не оптимальный по скорости с вечным циклом и дырками. В Mixed Neutrals генерация монстра по уровню — операция O(1) (линейная).
Для этого отсутствующие монстры не попадают в глобальный массив номеров существ вообще + есть отдельные индексированные глобальные массивы по уровням. Не при каждом же вызове делать фильтрацию.
Этот код практически идентичен коду генератора СОДа, только массив состоит не из битов как СОДе, а из байтов.
С нынешними компами я не вижу проблемы быстродействия массива на 1024+196 итераций. К тому же его сложность так же линейная O(n).

Да, этот код можно хорошенько оптимизировать. Но это был лишь показательный пример.

(21.01.2021 15:06)Raistlin Wrote:  А может закинуть вот это все в OnGameEnter, а массив monArray сделать глобальным?
Ты правильно код прочитал?)) Глобальным делать код не нужно. Таким образом потеряется смысл данного кода.

(21.01.2021 13:46)Raistlin Wrote:  Кстати, это ведь код из game bug fixes extended.dll? Я чувствую, мне определенно стоит ознакомиться с исходниками.
Нет. Этот код вообще отдельно-написанный, и не существует ни в одном из моих плагинов.

(21.01.2021 13:46)Raistlin Wrote:  P.S. Я работаю в девятнадцатой студии, и мне потребовалось сделать приведение типов при вызове функции b_MsgBox. Это, ясное дело, не проблема, но на всякий случай я Вас уведомляю.
Ты используешь заголовочники homm3.h?
Их для 19 студии вообще нужно полностью адаптировать. Правильнее тогда уже использовать заголовочники от Кавалериста (они насыщеннее и работают на новых студиях)


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

Posts: 2270
Post: #1672

(21.01.2021 15:24)Raistlin Wrote:  igrik пишет универсальный код, который должен работать как с Тифоном, так и без.

Ну так без Тифона можно просто добавить готовый массив на 196 монстров. И тогда вообще проверять/вычислять в OnGameEnter ничего не нужно. А в генераторе простая проверка: если есть Тифон, то используется таблица тифона, если нет - используется таблица на 196 монстров. То, что SoD эти данные каждый раз вычисляет - проблема содовского кода генератора монстров (который давно пора отправить на пенсию, что, например, давно сделано в MoP и никак не могут сделать на ERA).

Минусы:
1. на картах старых форматов будут генерироваться новые монстры. Думаю, что это не минус, а даже плюс.
2. не будет действовать запрет фракции Сопряжения (значение из базовой структуры) для определённых кампаний в игре. Но... ВоГ изначально создан как дополнение, вводящее Сопряжение в SoD. Поэтому думаю, что в рамках ВоГа это будет выглядеть нормально, что в каких-нибудь стандартных RoE/SoD-кампаниях сгенерируются, например, Фениксы или Аспиды.
(This post was last modified: 21.01.2021 16:28 by XEPOMAHT.)
21.01.2021 15:42
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1673

(21.01.2021 15:42)XEPOMAHT Wrote:  А в генераторе простая проверка: если есть Тифон, то используется таблица тифона, если нет - используется таблица на 196 монстров
Все, теперь понял. Тут я согласен.
21.01.2021 15:49
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16488
Post: #1674

Quote:Этот код практически идентичен коду генератора СОДа,
Тогда ты прав. Оптимизировать нужно только там, где по тестам реально видна выгода. Иначе чистый и простой код предпочтительнее.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
21.01.2021 16:37
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1675

(21.01.2021 15:40)igrik Wrote:  Ты правильно код прочитал?)) Глобальным делать код не нужно. Таким образом потеряется смысл данного кода.
Ой 96 Я туда много лишнего закинул, имелось ввиду только это:

Code:
    char monArray[LatestMonID];

    // заполняем массив нулями (запрещяем всех монстров)
    for (int i = 0; i < LatestMonID; i++)
        monArray[i] = 0;
По идее, выбранные в прошлый раз монстры будут просто перезаписываться, если сохранять в отдельную переменную количество отобранных индексов... Выбирать, соответственно, надо случайный элемент массива.
upd. Тогда этот цикл вообще не нужен.

Бред написал... Извиняюсь.
Пусть все остается как есть, я просто опять о разрешенных монстрах стал думать.

Quote:Нет. Этот код вообще отдельно-написанный, и не существует ни в одном из моих плагинов.
Хорошо, я понял.

Quote:Ты используешь заголовочники homm3.h?
Их для 19 студии вообще нужно полностью адаптировать. Правильнее тогда уже использовать заголовочники от Кавалериста (они насыщеннее и работают на новых студиях)
Да... Я что-то слышал о том, что Кавалерист дорабатывает их, но с конечным результатом я не знаком. Можно ссылку пожалуйста?
(This post was last modified: 21.01.2021 17:35 by Raistlin.)
21.01.2021 16:56
Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 118
Post: #1676

This is the api.

This is a set of plugins with a VSIX template project that can be installed to instantly create projects with all proper linkage and settings. The api is not updated often on this repository.
(This post was last modified: 21.01.2021 19:18 by RoseKavalier.)
21.01.2021 19:18
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1677

RoseKavalier, thank you very much! Thank_you


Создал новый глобальный мод: WoG Ultra Edition
21.01.2021 19:59
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2814
Post: #1678

(21.01.2021 14:52)XEPOMAHT Wrote:  Жесткая привязка к номерам монстров. Для поддержки Тифона потребуется:
Жесткая привязка к номерам монстров приведена для показательного примера. И в этом примере очень легко уменьшить кол-во итераций просто прочитав активное кол-во монстров.
Code:
// количество монстров в игре
// тут нужно учесть и Тифон, и Аметист,
// но и не гонять циклы в пустую (поэтому откуда бы считать?)
// int count = 196;
int count = *(int*)0x<адрес 221 монстра в Тифоне>;
Вот только я никак не пойму откуда прочитать это активное (221) кол-во монстров, а не максимальное кол-во (1000). В Тифоне что, нет простого указателя на текущее кол-во задействованных монстров?


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

Posts: 2270
Post: #1679

(21.01.2021 21:34)igrik Wrote:  В Тифоне что, нет простого указателя на текущее кол-во задействованных монстров?

Нету. Моддер может занять любой доступный слот монстра, хоть 999-й, хоть 666-й, и разрешить его в Ban_Table (или наоборот, если добавляется, например, боевая машина, или переносятся командиры на другие слоты, с добавлением новых).
21.01.2021 22:58
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2814
Post: #1680

Ещё интереснее))
А как тогда скриптеру производить цикл по всем монстрам в скрипте?
Как в плагине производить цикл прохода по всем монстрам в плагине?

Возьмём к примеру часто используемый скрипт: "половинная стоимость существ на 7й день". Как организовать цикл? Сколько итераций производить? 1000? Т.е. 778 итераций в пустую? Как скрипту проверять, что монстра (например id 650) вообще нет, если есть активный монстр с id 666?

Вот я щас потихоньку пилю WoG Scripts II и меня этот вопрос более чем интересует.
Скрипт: Половинная стоимость существ на 7й день (Click to View)
Скрипт: существа без вог способностей от опыта (Click to View)


game bug fixes extended.dll || My Plugins || My GitHub
21.01.2021 23:23
Visit this user's website 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