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

Post Reply 
Threaded Mode | Linear Mode
ERA II
» WoG Era 2: Русская и Английская версии
Author Message
Sav Offline

Posts: 2180
Post: #301

baratorch Wrote:а че такое $3, и зачем перед еах - % ?
я какбэ и в msvs достаточно с асмом поработал и тут недавно masm32 и fasm скачал, попрактиковался. но процитированный код меня пугает.

Это Dev c++ и at&t ассемблер.
$3 - константа, % - потому что такой синтаксис, а самое кошмарное то, что в mov первый операнд записывается во второй, а не наоборот. Меня этот код тоже пугает, если честно. Sm
(This post was last modified: 29.08.2011 10:05 by Sav.)
29.08.2011 10:00
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 622
Post: #302

Quote:
   с помощью __asm _emit и макросов в ms vc++ можно же реализовать любую недоступную инструкцию
проблема не в инструкциях, проблема в синтаксисе. АТ-шный отличается сильно.

Quote:Меня этот код тоже пугает, если честно.
дык.

Code:
int __attribute__((naked)) NewLuckCode() asm("new_luck");

asm
(
    ".intel_syntax noprefix\n" // use intel syntax

    "new_luck:                              \n"
        "xor eax, eax                       \n"
        "mov ecx, edi                       \n"
            "loop_1:                        \n"
        "cmp dword ptr ds:[ecx], 0x2D       \n"
        "je calc_bonuses_1                  \n"
        "inc eax                            \n"
        "add ecx, 0x8                       \n"
        "cmp eax, 0x13                      \n"
        "jl loop_1                          \n"
        "mov ecx, dword ptr ds:[0x660b68]   \n"
        "mov eax, dword ptr ds:[ecx+0x5D8]  \n"
        "cmp eax, -1                        \n"
        "je art_2                           \n"
        "lea edx, [eax*2+eax]               \n"
        "mov eax, dword ptr ds:[0x660B6C]   \n"
        "mov ecx, dword ptr ds:[edx*8+eax]  \n"
        "push ecx                           \n"
        "mov ecx, esi                       \n"
        "mov eax, 0x4d9460                  \n"
        "call eax                           \n"
        "test al, al                        \n"
        "je art_2                           \n"
            "calc_bonuses_1:                \n"
        "inc dword ptr ss:[ebp+0x0C]        \n"

            "art_2:                         \n"
        "xor eax, eax                       \n"
        "mov ecx, edi                       \n"
            "loop_2:                        \n"
        "cmp dword ptr ds:[ecx], 163        \n"
        "je calc_bonuses_2                  \n"
        "inc eax                            \n"
        "add ecx, 0x8                       \n"
        "cmp eax, 0x13                      \n"
        "jl loop_2                          \n"
        "mov ecx, dword ptr ds:[0x660b68]   \n"
        "mov eax, dword ptr ds:[ecx+0x5D8]  \n"
        "cmp eax, -1                        \n"
        "je art_3                           \n"
        "lea edx, [eax*2+eax]               \n"
        "mov eax, dword ptr ds:[0x660B6C]   \n"
        "mov ecx, dword ptr ds:[edx*8+eax]  \n"
        "push ecx                           \n"
        "mov ecx, esi                       \n"
        "mov eax, 0x4d9460                  \n"
        "call eax                           \n"
        "test al, al                        \n"
        "je art_3                           \n"
            "calc_bonuses_2:                \n"
        "add dword ptr ss:[ebp+0x0C],-2     \n"



            "art_3:"
            "ret_section:                   \n"
        "mov eax, 0x4E3AC7                  \n"
        "jmp eax                            \n"
    ".att_syntax noprefix\n" // reset AT&T syntax or there will be errors
);
(This post was last modified: 29.08.2011 10:22 by feanor.)
29.08.2011 10:21
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #303

Понятно, спасибо.

А что означают __attribute__((naked)) и asm("new_luck") в объявлении функции?
29.08.2011 11:02
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #304

__attribute__((naked)) это как в msvc++ __declspec(naked) ?
- очевидно означает объявление "голой" функции, то есть скомпилированная она будет без всяких такм push ebp mov ebp, esp ... вначале и ... retn в конце.

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

кстати здесь на форуме отдельная тема по программированию есть, а то офф. пошел..

вопрос: без asm("new_luck") и ... "new_luck:
голая функция работать не будет что ли?
29.08.2011 12:19
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #305

вообще я бы заменил

void SkipChecking()
{
   asm("mov $3, %eax");
   asm("mov %eax, 0x67F554");
}

на

void SkipChecking()
{
   *(DWORD*)0x67F554 = 3;
}

а используя и HOOKTYPE_BRIDGE можно решить в плагине абсолютно любую задачу, не используя ассемблер вообще.
29.08.2011 13:34
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #306

baratorch Wrote:вопрос: без asm("new_luck") и ... "new_luck:
голая функция работать не будет что ли?
У меня не заработало.

baratorch Wrote:__attribute__((naked)) это как в msvc++ __declspec(naked) ?
- очевидно означает объявление "голой" функции, то есть скомпилированная она будет без всяких такм push ebp mov ebp, esp ... вначале и ... retn в конце.
У меня одинаково заработало и __attribute__((naked)), и __declspec(naked) (причём компилятор обычно выдавал warning`и, что nacked проигнорировано, но всё было нормально).

baratorch Wrote:void SkipChecking()
{
    *(DWORD*)0x67F554 = 3;
}
Да, пожалуй, в данном случае лучше без ассемблера.

Вот обновлённая (UPD: и ещё раз обновлённая) версия. Как оказалось, прошлая избавляла от необходимости существования только экзешника AB: lod`ы, snd и vid считались существующими и должны были быть открыты (иначе - ошибка). С snd и vid-файлами я разобрался (вместо ошибки просто пропускаю открытие), а с lod`ами всё сложнее. Но, с другой стороны, если подгружать только конкретные lod`ы (например с плагином lods через параметры), ошибки с lod`ами и не будет.

Кстати, если в исходнике HOOKTYPE_CALL заменить на HOOKTYPE_BRIDGE (только это одно изменение), работать это не будет. Bridge требует каких-то дополнительных специальных телодвижений?
(This post was last modified: 30.08.2011 19:13 by Sav.)
29.08.2011 19:05
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16486
Post: #307

Для моста нужно:
Code:
__stdcall LONGBOOL Sav (PHookHandlerArgs Context)
{
  // Поменяем регистры:
  Context->EAX = 777;
  // Адрес возврата тоже сменим
  Context->RetAddr = 0;
  // Ну и выполним затёртый код, 0 - не выполнять
  return 1
}

Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет.


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

Posts: 2180
Post: #308

Насчёт моста понятно, спасибо.

Berserker Wrote:Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет.
Создал несколько случайных карт, ни разу не было вылета в списке (AB-ские lod`ы убрал и в коде вообще не подгружал), хотя даты действительно стрёмные. Эти вылеты непостоянно случались?
(This post was last modified: 30.08.2011 00:10 by Sav.)
30.08.2011 00:10
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16486
Post: #309

Постоянно. У меня даже есть патч, убирающий получение дат. Но раз у тебя не вылетает, то хорошо.


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

Posts: 2180
Post: #310

Последняя версия.
Всё работает без всех файлов AB: экзешника, lod`ов, snd, vid без дополнительных плагинов. Вылетов в списке случайных карт не замечено.

От lod`ов избавился просто: убрал их номера из таблиц подгрузки для версии 3. Это чисто теоретически не очень хорошо в плане совместимости, но совместимо со всем, что существует сейчас на том направлении. Sm Только если у кого-то такая кривая версия, что в H3ab_bmp.lod или H3ab_spr.lod хранятся файлы, которые необходимо подгрузить, с плагином у них вообще ничего не заработает, даже при наличии этих lod`ов (ибо их подгрузка в нём срезана практически начисто). Sm
(This post was last modified: 20.09.2011 23:35 by Sav.)
30.08.2011 19:25
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16486
Post: #311

Глянул Арсенал, код едва ли поддаётся изменениям. В Фениксе сделаем тогда DL-диалог, скорее всего.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
30.08.2011 21:23
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16486
Post: #312

Обновление: Эра 1.91
Размер: 169 KB.
Ссылка: MultiUpload
Описание:
Code:
[Era 1.91 - 30.08.2011]
+) Эра полностью поддерживает ert-строки в командах (z[>1000]).
+) Встроена поддержка карт любого размера для команды PO.
-) Не очищалась дополнительная память SN:M/W при старте карты.


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

Posts: 2180
Post: #313

А lod`ы теперь подгружаются после OnAfterWoG что ли?
Только сейчас обратил внимание, это вообще-то делает плагин lods (вернее ту его версию, которую я ещё не выкладывал Sm) несовместимым с автоподгрузкой, но я могу это обойти (и, скорее всего, это обойдётся автоматически, т. к. я собираюсь переносить таблицы в dll и расширять их для vid`ов).
(This post was last modified: 31.08.2011 22:01 by Sav.)
31.08.2011 21:56
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #314

Глянул в исходники Эры, понял, что прав.
(This post was last modified: 01.09.2011 21:04 by Sav.)
01.09.2011 21:04
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #315

В порядке изучения изученных внутренностей ВоГа сделал плагин, позволяющий загружать тексты из любых папок. Прописал путь к папке с текстом перевода игры в ини-файле и играй в переведённую игру, изменил расширение у плагина - играй с текстами, что в лодах или в Data.
http://zalil.ru/31657771
06.09.2011 20:12
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