Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 88
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 22 раз.

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

Сообщение Catastrophe » 19 авг 2019, 19:50

Проверил, генерируются разные числа, но очень редко. Косяк псевдорандома.
А другой вариант не работает, выдает 'rand_s': identifier not found, хотя я указал:
Код: Выделить всё
#define _CRT_RAND_S
#include <stdlib.h>
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 19 авг 2019, 22:08

#define _CRT_RAND_S нужно прописывать во framework.h:

Код: Выделить всё
#pragma once

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_RAND_S
// Windows Header Files
#include <windows.h>
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 22 авг 2019, 18:09

Во время битвы AI выбирает цель для удара с учетом информации - проигрывает он битву или выигрывает (видимо, просто сравнивая суммарные AI_value или FighValue противостоящих армий).
Если выигрывает - выбирает цель "осмотрительно", с учетом ответного удара противника. Если проигрывает - бьет "напропалую", стараясь нанести максимальный урон противнику. Как ни странно, против человека более примитивный подход дает AI больше выгод - то есть лучше бы ему всегда действовать по 2-му варианту.

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

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 22 авг 2019, 21:50

Пока что выяснил, что в битве ИИ использует данные, хранящиеся в стеке.

Например, int __thiscall sub_0041F530(_CombatMan_ *this, _CombatMonster_ *a2, _CombatMonster_ *a3, int a4)

Здесь a4 указывает на нужные для расчетов данные стека.

*(_byte_*) (a4 + 8)
Если 0, то выигрывает, если 1, то проигрывает.

Пока не знаю, какая процедура апдейтит эту информацию.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 23 авг 2019, 03:54

Ну вот, собственно, и решение:

Код: Выделить всё
_PI->WriteByte(0x435B4E, 1);
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 23 авг 2019, 11:28

RoseKavalier,

in fact there is one additional game manager - AIBattleManager, it is extensively used by subroutines of routines such as CombatMan_00422100_MeleeCreatureAI or CombatAI_0043C450_SpellsAI

This manager, however, located in stack, not in global memory. Pointer of manager is argument between many procedures.
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 23 авг 2019, 12:22

I have some notes on it from a while ago when I was studying related function. Since I didn't have much info on it and no immediate use, I didn't include it in H3API.
Feel free to flesh it out))

Код: Выделить всё
00000000 AI_combat           struc ; (sizeof=0x28, mappedto_358)     ; XREF: FF0158DF/r
00000000                                                             ; FF015A1C/r
00000000 hero_attack         dd ?
00000004 hero_defence        dd ?
00000008 field_8             db ?
00000009 field_9             db ?                                    ; XREF: MeleeCreatureAI+1F/w
0000000A                     db ? ; undefined
0000000B                     db ? ; undefined
0000000C damage              dd ?
00000010 damage3             dd ?
00000014 damage2             dd ?
00000018 damage4             dd ?
0000001C move_type           dd ?
00000020 someBoolean         dd ?
00000024 field_24            dd ?
00000028 AI_combat           ends
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 31 авг 2019, 15:52

wenwell писал(а):

Цитата:
Это приводило к тому, что крайний правый стек противника получал сильно завышенную ценность.


AI (коричневый) нападает на игрока (красный), получается, что стеком с багованной ценностью будет гном? (крайний справа). Что если у нас не семь стеков, а два, баг тоже будет работать? Работает ли баг если нападаем мы?


Баг всегда будет работать :smile1: Кроме 1-го стека.

Если речь идет о расчете для Фениксов, то стеком с багованной ценностью будет Архангел )) (правда, в данном случае он и без бага самый ценный) поскольку последние 3 стека слишком слабы даже будучи переоцененными в несколько раз.

Для остальных же стеков коричневого самым ценным целевым стеком будут 19 кентавров, поскольку Архангел слишком силен, а прочие стеки, даже будучи переоцененными, слишком маленькие.
Для кентавров переоценки не будет, кстати, поскольку это 1-й стек.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 31 авг 2019, 16:13

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

Надеюсь, никого не запутал ))
Вернуться к началу

offlinewenwell  
имя: Roman
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 29 мар 2019, 09:31
Пол: Мужчина
Поблагодарили: 16 раз.

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

Сообщение wenwell » 31 авг 2019, 17:04

Цитата:
Баг всегда будет работать Кроме 1-го стека.


Весьма ценная информация! Знаю бои где это важно учитывать.

Известно, что комп может выбирать цель с меньшим hp в некоторых случаях, скажем, когда стек в 30 гномов выбирая кого атаковать - стек с 1 феей или 2 феями, иногда, выбирает атаку 1 феи, при том, что та и другая цель достижима в первый же ход беспрепятственно. Но вот то что этот баг не работает для первого стека - очень важно и стоит учитывать.
Вернуться к началу

Пред.След.

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

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

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