Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 19 июн 2022, 15:50

Пробовать менять signed и unsigned. Также нужно попробовать поиграться со смещенными указателями.

Вообще, мне это больше напоминает то, что со структурами что-то не то. Нужно строго знать правильные смещения и размеры каждого поля, четко определить размеры структур. Тогда проблем возникнуть не должно. Тогда все должно работать правильно. Единственное, что IDA не может определить автоматически это смещенные указатели.
Вернуться к началу

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 » 19 июн 2022, 16:02

Но у меня точно всё правильно:

Код: Выделить всё
void __thiscall TGame::CaptureTown(TGame *this, char town_id, char owner)
{
  TTile *leftTile; // [esp+4h] [ebp-Ch]
  TTile *rightTile; // [esp+4h] [ebp-Ch]
  int i; // [esp+8h] [ebp-8h]
  TTown *town; // [esp+Ch] [ebp-4h]

  town = &this->town[town_id];
  if ( this->town[town_id].owner != owner )
  {
    if ( this->townOwner[town_id] != -1 )
      TTown::InitTownList(&gpGame->town[town_id]);
    for ( i = 0; i < 5; ++i )
    {
      town->garrison.creature[i] = eNone;
      town->garrison.num[i] = 0;
    }
    if ( this->town[town_id].owner == -1 )
      this->town[town_id].development_factor = 2;
    else
      this->town[town_id].development_factor = 0;
    this->town[town_id].owner = owner;
    this->townOwner[town_id] = owner;
    this->player[owner].owned_town_id[this->player[owner].numTowns++] = town_id;
    leftTile = &this->player[1].gap0[720 * this->town[town_id].x + 27 + 10 * this->town[town_id].y];
    leftTile->flags |= 0x10u;
    leftTile->layer1_res_id |= 0xE0u;
    leftTile->extra_tile_info = 2 * this->player[owner].color;
    rightTile = &this->map[this->town[town_id].x + 1][this->town[town_id].y];
    rightTile->flags |= 0x10u;
    rightTile->layer1_res_id |= 0xE0u;
    rightTile->extra_tile_info = 2 * this->player[owner].color + 1;
    TGame::SetVisibility(this, this->town[town_id].x, this->town[town_id].y, owner, dbTownVisibilityRadius);
    CheckWinLoseGame(0);
  }
}

Просто для leftTile = &this->player[1].gap0[720 * this->town[town_id].x + 27 + 10 * this->town[town_id].y]; IDA почему-то решает начать отсчёт от поля выше, чем map (т.е. для x + 1 всё хорошо, а для x - 1 IDA считает уже от поля с меньшим смещением).
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 19 июн 2022, 16:05

Какой тип имеет переменная X? Попробуйте сменить с signed на unsigned или наоборот, возможно это даст эффект.
Вернуться к началу

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 » 19 июн 2022, 16:07

Пробовал, не помогает. В Героях 1 x и y - char.

Код: Выделить всё
#pragma pack(push, 1)
struct __cppobj TTown
{
  char id;
  char owner;
  char name_id;
  char type;
  char x;
  char y;
  TArmyGroup garrison;
  char defender_hero_id;
  __int16 buildings;
  char mage_guild_level;
  char unk4;
  __int16 num_creatures[6];
  char obj_info_index;
  bool initialized;
  char gap2[4];
  char spells[9];
  __int16 development_factor;
};
#pragma pack(pop)
Вернуться к началу

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 » 19 июн 2022, 16:15

Вот class TGame, если поможет:

Код: Выделить всё
#pragma pack(push, 1)
struct __cppobj TGame
{
  __int16 difficultyRating;
  char unk_2;
  int campaign;
  int scenario;
  int numHumanPlayers;
  int days;
  char mapSize;
  char mapDifficulty;
  char mapName[17];
  char mapDesc[121];
  char fileName[17];
  char unk_197[334];
  eGameDifficulty difficulty;
  char numPlayers;
  char unk;
  char numPlayersDead;
  bool bIsPlayerDead[4];
  unsigned __int16 day;
  unsigned __int16 week;
  unsigned __int16 month;
  TPlayer player[4];
  TTile map[72][72];
  int tileExtraInfo[72][72];
  char numObelisks;
  TTown town[36];
  char townOwner[36];
  char unk_12981[4];
  THero hero[36];
  char hero_owner_id[36];
  TMineInfo mine[36];
  char mines[36];
  char artifactTable[37];
  TShipInfo Ship[32];
  char ships[32];
  char visited_obelisks[48];
  char ai_visited_objects[72][72];
  char uncharted[72][72];
  TUAInfo UA;
  TBin *currBin;
  char unk_16E59[11];
  THero *active_hero;
  char unk_16E6C[2];
  __int16 totalSpellsNum;
  __int16 chosenSpell;
  __int16 topLeftBookSpell;
  char unk_16E74[5];
  char isLoading;
};
#pragma pack(pop)

Было бы здорово иметь возможность самостоятельно задавать базовое смещение для поля.
Вернуться к началу

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 » 21 июн 2022, 12:09

Ещё есть похожая на эту проблема с циклами. Например, если счётчик цикла инициализируется ненулевым значением, IDA может путаться с тем, какое поле класса считать базой, особенно если счётчик используется для вычисления индекса.

Например, если исходный код такой:
Код: Выделить всё
for (int i = 3; i < 7; ++i)
{
   p->A[i - 3][7 - i] = 2 * i - 2;
}

то IDA, скорее всего, будет вести отсчёт индексов (смещений) от поля, расположенного выше, чем A. Мой вопрос: можно ли как-то подсказать IDA, что я хочу, чтобы индексы считались от заданного мной поля. Т.е. в идеале кликаешь на p и выбираешь нужное поле, а IDA уже подгоняет индексы, чтобы получалось корректное смещение.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 22 июн 2022, 04:08

Пока не уехал, даю вам свою сырую базу Heroes 3 SoD Macintosh.
Вложения
Heroes III.zip
(7.16 МБ) Скачиваний: 213
Вернуться к началу

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

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

Сообщение Rolex » 18 авг 2022, 11:32

Эх, давненько не заходил. Я так понял никто даже и не смотрел. Жаль, а мог бы получитсяь еще один интересный плагин.
viewtopic.php?f=56&t=518&start=3780#p24749

Предложенный вариант отличается от того, что есть в HotA. Но основное, конечно, хотелось бы сделать его полностью совместимым с NewSpells. Может AlexSpl заглянет как-нибудь... :smile1:
Вернуться к началу

offlinegeorg22  
имя: georg
 
Сообщения: 3
Зарегистрирован: 11 сен 2022, 23:28
Пол: Мужчина
Поблагодарили: 0 раз.

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

Сообщение georg22 » 11 сен 2022, 23:37

Привет!

Я вижу, что в этой теме много полезной информации. К сожалению, я не говорю по-русски, и мне трудно просмотреть более 3000 сообщений в поисках того, что я ищу :p

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

Пример: Нажмите F1 -> Телепортировать текущего героя туда, где находится курсор.
F2 -> Откройте карту приключений
И так далее...

Как это сделать? Такой плагин уже существует?

Всего наилучшего, Георг

--------------

Hello!

I see there is a lot of good information in this thread. Sadly I do not speak russian and it is hard to look through over 3000 posts for what I am searching for :p

I am a mapmaker and would like to have a plugin that lets me use cheat codes on the click of a button, to make testing less painful.

Example: Press F1 -> Teleport current hero to where cursor is
F2 -> Uncover adventure map
And so on...

How can it be done? Does such a plugin exist already?

All the best, Georg
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 12 сен 2022, 01:50

/nwcgrail?
Вернуться к началу

Пред.След.

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

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

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