Wake of Gods Forum | Форум Во Имя Богов

Full Version: ERA II
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Тут проблема в чем. Хота выходит неведомо когда, стандарты на неё неведомы (да и менялись радикально уже минимум два раза, с каждым новым кодером, угу) и равняться на неё глупо - делать дело надо сейчас. Это раз.

Два - действительно крупные моды будут несовместимы между собой всегда. Особенно из-за текущей ситуации с моддингом героев. Нет, если кому-то будет не лень сделать большой и толстый MDK - можно будет и задуматься о совместимости хотя бы половины модов - но это фентези.

Quote:2. У Хоты будет 100% совместимость с Эрой - править экзешник мы не будем. Уж если что - попросим поправить Эру
Кажется, имеется некоторое непонимание. Если плагин yet_another_gemstone_name.dll совместим с Эрой, плагин yet_another_metal_song_name.dll совместим с Эрой и плагин hota.dll совместим с Эрой - это совершенно не значит, что они будут совместимы друг с другом.

Quote:3. Что такое Эра? Хуки на экзешник, позволяющие расширять его функции. Сомневаешься, что под 3.59 будет приспособлена новая версия Эры?
Я уверен, что все мало-мальски крупные плагины под ней просто не пойдут.
Хук на хук не приходится. Если ХотА строится на Эре, то это значит, что она будет полна хуков и плагины, использующие те же хуки не будут с ней совместимы. Новые герои - хуки на геройские массивы и функции - несовместимость с геройскими классами феанора, новые двеллы - несовместимость с новыми двеллингами МоПа, новые монстры - несовместимость с феаноровским (или дьяконовским чистым) плагином. И т.д.
Надеюсь, я правильно понимаю?
Угу. К примеру, в длл из альфы даже банальное получение указателя на другую структуру героя ([699538] + 21620 + 492*n) не работает.
Перенесли массив структур - все, альфа ТоЕ курит, прототип Форджа курит, не исключено, что курят MoP и НD-мод.
Quote:Да какая совместимость? Кодовая? Не было её и не будет никогда.
Если бы соблюдалась модульная структура нововведений и сам исполняемый файл бы практически не менялся (ТЕ), то совместимость бы была, но если уже проделан большой объём работы, то естественно, смысла нет критиковать решение. Эра 1.9 будет полностью открыта в плане исходников. Так уж получилось, что то, что ты правил, всё ещё на Virtual Pascal, так что повторные правки под твой вкус труда не составят. А новый функционал через вторую библиотеку. Поэтому единственная проблема - это пути.

Quote:Видите, я даже не боюсь утечек
А чего боятся утечек, если наоброт решённые проблемы помогли бы другим людям не изобретать велосипед? Не все могут позволить себе пару лет посвятить игре.

Quote:Есть разве что предчувствие недовольства людей, уже привыкших к HD-моду.
Да, HD это действительно для многих уже становится стандартом, но что говорить, в хороший мод и на 800х600 будут играть.

Quote:Просто идея
Бараторч верно ниже отписался. В двух словах - экономия на спичках. Но если вдруг интересует, то в первых версиях dll для Феникса (это даже не Эра 1.0) я был поглощён наноассемблером (http://mrhx.clan.su/publ/1-1-0-3). Там ровно то, что тебе нужно.

baratorch, у меня тоже в похожем стиле:
Code:
FUNCTION Hook_LoadLods (Context: Core.PHookHandlerArgs): LONGBOOL; STDCALL;
CONST
  H3BITMAP_LOD  = 'h3bitmap.lod';
  H3SPRITE_LOD  = 'h3sprite.lod';
  H3BITMAP_IND  = 0;
  H3SPRITE_IND  = 1;
  BASE_LOD_IND  = 2;

VAR
{O} Locator:  Files.TFileLocator;
{O} FileInfo: Files.TFileItemInfo;
    FileName: STRING;
    LodInd:   INTEGER;
    i:        INTEGER;
  
BEGIN
  Locator   :=  Files.TFileLocator.Create;
  FileInfo  :=  NIL;
  // * * * * * //
  Locator.DirPath :=  'Data';
  Locator.InitSearch('*.*');
  WHILE Locator.NotEnd DO BEGIN
    FileName  :=  Locator.GetNextItem(CFiles.TItemInfo(FileInfo));
    IF
      (SysUtils.AnsiLowerCase(SysUtils.ExtractFileExt(FileName)) = '.lod')  AND
      (((FileInfo.Data.dwFileAttributes) AND Windows.FILE_ATTRIBUTE_DIRECTORY) = 0)
    THEN BEGIN
      LodList.Add(FileName);
    END; // .IF
    SysUtils.FreeAndNil(FileInfo);    
  END; // .WHILE
  Locator.FinitSearch;
  Heroes.LoadLod(H3BITMAP_LOD, @ZvsLodTable[H3BITMAP_IND]);
  Heroes.LoadLod(H3SPRITE_LOD, @ZvsLodTable[H3SPRITE_IND]);
  IF LodList.Find(H3BITMAP_LOD, LodInd) THEN BEGIN
    LodList.Delete(LodInd);
  END; // .IF
  IF LodList.Find(H3SPRITE_LOD, LodInd) THEN BEGIN
    LodList.Delete(LodInd);
  END; // .IF
  LodInd  :=  BASE_LOD_IND;
  FOR i:=0 TO Math.Min(LodList.Count - 1, HIGH(TLodTable) - BASE_LOD_IND) DO BEGIN
    ZvsAddLodToList(LodInd);
    Heroes.LoadLod(LodList[i], @ZvsLodTable[LodInd]);
    INC(LodInd);
  END; // .FOR
  Context.RetAddr :=  Ptr($559408);
  RESULT          :=  NOT Core.EXEC_DEF_CODE;
  // * * * * * //
  SysUtils.FreeAndNil(Locator);
END; // .FUNCTION Hook_LoadLods

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

Есть однин ключевой вопрос. Оттого, что изменение готовой игры всегда сопряжено с указанными проблемами, не следует факт, что не нужно никаких соглашений или шагов для максимизации совместимости вообще. Если вдруг к какой-то игре каждое дополнение станет несовместимо с остальными, то среда вымрет. Нет прогресса. Велосипед изобретается каждый раз с нуля.
Сделал команды Эры локальными, так чтобы можно было вызвать команду, которая вызовет команду, которая вызовет команду...
Добавил поддержку строковых констант в командах:
Code:
!!SN:L^angel.dll^/?v2 Av2/^ResetEra^/?v3 Ev3/0;
Работаю над M-командами для дополнительной памяти.
Ещё узнал пренеприятнейшие известия и пошёл искать артефакт дух уныния до вечера.
CRACK! RETAIL! FULL! FREE!
Era 1.9 alpha. CRACKED BY ALLAH
Отличная шутка, Берс.
Не знаю, что вы тут, ребята, обсуждаете, но это был не я.Gigi
(18.07.2011 21:45)baratorch Wrote: [ -> ])) какая же это утечка, что мы с этим ехе будем делать?) что с ним вообще можно сделать?)
Посмотреть реализацию некоторых вещей, о которых я трепался у себя на форуме. Скажем, если я сказал, что номер Воздушного Шара такой-то, можно тупо пошарить по экзешнику в поиске такого dwordа и найти интересности. Gigi
(18.07.2011 21:45)baratorch Wrote: [ -> ]на самом деле в этом нет ничего хорошего. Ты конечно монстровый реверсер и ассемблерщик, но ведь такой код очень сложно отлаживать и менять в будущем.
Я запиливаю только то, что не вызывает у меня сомнений относительно будущей правки. То, что может потом исчезнуть - в длл, бинарниках для памяти или ещё как-нибудь.
(18.07.2011 21:45)baratorch Wrote: [ -> ]В своей платформе ХД 3 я готовлю практически полное отсутствие асма в коде непосредственных изменений и дополнений игры
Я знаю только асм, так что ничего не могу сказать.
Я не люблю длл-ки. Делал их, а всё равно не люблю. Не люблю, когда функцию нужно вызывать относительно (пара лишних байт, ага). Не люблю, когда код висит хрен знает где и чтобы добраться до функции, вложенной в кучу других, и посмотреть, верно ли скомпилирован код, нужно каждый раз лазить через всё, во что вложено. Код их выглядит ужасно. Гарантии стабильности тоже нет.
(18.07.2011 21:45)baratorch Wrote: [ -> ]зачем, если
Quote:Жёсткие диски теперь вмещают терабайты.
Диски-то вмещают. А вот у меня интернет платный и дыра в бюджете. Даже сигареты не на свои деньги курю.
Сказали бы просто - сложно реализовать. Я и сам так думал.

hippocamus Wrote:Если у тебя ест ьсовместимость - играем в Моп с 10 городами, иначе - с 9-ю.
Новый город - это попса. А я митол люблю.
Я вообще думаю, что всего один новый артефакт - лучше, чем сотня городов. Новый город - дорогая по всем параметрам безделушка, делаемая людьми чисто из желания похвастаться, что они смогли это сделать.
Berserker Wrote:Так уж получилось, что то, что ты правил, всё ещё на Virtual Pascal, так что повторные правки под твой вкус труда не составят.
Если желаешь помочь, то мог бы дать в личку исходники, компилятор и, ещё лучше, список хуков. Если проблематично - ничего, не обижусь. С горем пополам могу и в готовой длл поменять адреса хуков. Такая я проныра. Gigi
Quote:Если желаешь помочь, то мог бы дать в личку исходники, компилятор и, ещё лучше, список хуков. Если проблематично - ничего, не обижусь. С горем пополам могу и в готовой длл поменять адреса хуков. Такая я проныра.
Нефинальные исходники могу кинуть. Те, что для делфи, потребуют скачать компилятор в 40 МБ (Free Pascal). Или подождать сперва финальную версию?

P.S Исправил баг ЕРМ команды CA:B3.
Подожду.
Можно тогда только список хуков с указанием типа (call, jump). Пропатчу прямо длл.
40 мегов для меня многовато.
Добавился новый тип автоматически генерируемого переходника (Bridge). Все хуки найти легко, ибо они через экспортируемую функцию Hook. В отладчике Era.Hook. В общем я в релиз включу и исходники, и бинарники.

Да, собираюсь также глянуть DL:E и сделать всем нормальный ввод. Есть намётки? (ещё не смотрел).
Очередные две хотелки.

Можно событие, аналогичное запуску инструкций (!#) ?
Для автоматического перегона ERM-скриптов в длл-ки

И событие на запуск функции с определенным номером?
Ну тут чисто понты, шоб можно было к дллкам не через !!SN:LAE обращаться, а через !!FU:P
Я не советую вообще использовать инструкции. Есть нормальный триггер после них: !?PI, а в Эре только его и использую. А инструкции это недоделанный пережиток прошлого прямо во время анализа ЕРМ кода. Б-р-р-р...

Quote:И событие на запуск функции с определенным номером?
"OnErmFunction X" и так работает Sm, глянь Triggers.txt

Добил команду K (получение длины строки, копирование памяти, установка получение отдельных символов строки), убрал старый триггер на встречу героев, заменив двумя новыми. Посмотрел немного DL:E. Бараторч по ходу и так сделал русский язык, а дальше копать уже неохота. Пора закругляться, перечитывать код и готовить руководство.
Самые древние команды ERM - самые неоптимизированные. И среди них, наверное, самая важная - !!HE. Не слишком изучал, но, по-моему, там чем дальше буква к концу алфавита - тем тормознее ресейвер. Просто команда не собрана, как поздние, в свитч. Цикл получения/изменения всех специализаций (маленький, героев ведь всего 156) очень тормозит. Требуется либо оптимизация (тогда выгирают и старые скрипты), либо новая реализация.
Не выходит открыть диалог встречи героев в городе. После него всё падает.
Reference URL's