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

Full Version: Программирование ВОГ
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9
(29.07.2010 09:34)baratorch Wrote: [ -> ]а вот и не для удобства, а потому что это было самым простым решением.
ну кнопку могли сделать, просто она не нажималась бы. некрасиво но не критично. А клавишами в самом деле немного удобнее - потому что быстрее чем мышку передвигать. В мультиплеере счет идет на секунды, т.к. игры занимают много времени.
Quote:Я, между прочим, 9 лет играл в героев, прежде чем начать их модить.
поздравляю. рекомендую сыграть в онлайне с сильными игроками. победить опытного игрока намного сложнее и интереснее чем убивать ограниченного в своих действиях компа.
Quote:про эти сочетания я знал, и оценил. Собирался сделать то же самое для сод.

вопрос будет ли твой сод совместим с обычным содом? проблема совместимости весьма большая. Счас модов располодилось дофига. Аудитория СОД очень консервативна.

(29.07.2010 09:34)baratorch Wrote: [ -> ]Сколько пушей/кликов нужно в те, чтобы передать недельный прирост города от второстепенного героя главному? У меня - 1 клик на кнопку.
в ТЕ/WT тоже 1 клик на кнопку "Exchange Army". Только в ТЕ можно поставить мой скрипт на фокусировку на правого героя, а в СОД - нет. С фокусировкой передача еще в 1,5 раза быстрее и не отвлекает внимание (при передаче через 5-7 героев не надо вспоминать кому передал, т.к. этот герой автоматически становится активным)
Добавлено:
(28.07.2010 13:33)MOP Wrote: [ -> ]Никогда не понимал, что такого удобного в использовании двух рук вместо одной + требовании держать в голове или бумажке такие извращенские комбинации.
это не сложнее, чем запомнить например различия 140 героев. руки запоминают моторной памятью за 4-5 игр и потом в СОД постоянно хочется ругаться матом
Давно хочу сделать интегрированную в хайрез поддержку 32битного режима.
И тут вчера случайно отреверсил в героях всё что связано с ddraw.
В связи с этим вопрос:
Дано:
программа использующая ddraw (Герои)
backbuffer ddraw surface c пиксельформатом 16 bit 565
primary ddraw surface c пиксельформатом 32 bit 5555
Есть ли какие нибудь стандартные directx инструменты, чтобы нарисовать на этом primary содержимое этого backbuffer? Или нужно писать что-то свое, медленное.
Я так понимаю Блиттинг возможен только между поверхностями одного формата? Или нет?
В directx я не очень шарю, просто в детстве немного почитал MSDN Lib. )

На каком, интересно, принципе основана работа 32bit патча?..

И еще вопрос: В IDirectDraw и IDirectDrawSurface первых версий (которые используются в героях) нет возможности применить сглаживание при блиттинге с изменением масштаба? В каких есть? Хотелось бы сделать в героях проигрывание растянутого видео с интерполяцией
(30.08.2010 18:58)baratorch Wrote: [ -> ]На каком, интересно, принципе основана работа 32bit патча?..
емнип, там заменяется библиотека ddraw
Да, потом создаются свои прокси IDirectDraw, IDirectDrawSurface и т.п., которые перекидывают с 16-битной поверхности на 32-битную. Блиттинг используется через канвасы (HDC) поверхностей, т.к. другие варианты работали не у всех.
Bourn уже сделал поддержку нового DirectX - с нормальным сглаживанием и другими интересностями. Лучше всего тебе поговорить с ним.
(31.08.2010 22:25)GrayFace Wrote: [ -> ]Да, потом создаются свои прокси IDirectDraw, IDirectDrawSurface и т.п., которые перекидывают с 16-битной поверхности на 32-битную.
Впринципе я это знал, я поковырял немного zdraw.dll, но для полного понимания решения чего то не хватало. Твой пост, sergroj, переключил в моей голове нужный триггер, спасибо!

(31.08.2010 22:25)GrayFace Wrote: [ -> ]Блиттинг используется через канвасы (HDC) поверхностей
Что это и как это, я не представляю. Сделал собственные функции конвертации из 16-битн. поверхности в 32 и обратно. Функции довольно грубые но шустрые. Неточность вычислений на глаз незаметна, и тормозов никаких на моем нетбуке нет.
Всего три сдвига и два AND'a на пиксель на конвертацию туда
   и три сдвига плюс два OR'а на конвертацию обратно. Никаких умножений и делений.

Однако, при размере окна близком к размеру экрана в моем патче у меня проявился абсолютно такой же глюк, что и в последней лучшей zdraw.dll.
Очевидно он появляется при блиттинге между 16 битными поверхностями при 32-битном режиме.
Т.е. свою задачу я не решил..
   Попробую заменить и 16-битные директдро поверхности и функцию блиттинга своими структурами и кодом, посмотрим решит ли это проблему...
Господа-товарищи помогите пожалуйста написать плагин в GCC:
Code:
#include <windows.h>
#include <stdio.h>
#include <setjmp.h>
#include <map>
using std::map;

#define OPCODE_JUMP 0xE9
#define OPCODE_CALL 0xE8
#define OPCODE_NOP 0x90

#define HOOKTYPE_JUMP 0
#define HOOKTYPE_CALL 1

#define HOOK_SIZE 5

inline void WriteHook( void *pOriginal, void *pNew, char type )
{
    *(byte*)pOriginal = (type==HOOKTYPE_JUMP)?OPCODE_JUMP:OPCODE_CALL;
    *(void**)( (byte*)pOriginal + 1 ) = (void*)( (byte*)pNew - (byte*)pOriginal - HOOK_SIZE );
}



__fastcall void FirstChange()
{
__asm
{
   pushad
   push   TriggerNum
   mov    eax, 0x74CE30
   call   eax              
   add    esp, 4              
   popad                    
}
}


extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{

    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
              {
                  WriteHook((void*)0x4074AC, (void*)(FirstChange), HOOKTYPE_CALL);
                break;
              }

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
В общим нужен хук по адресу 4074AC
и сделать чтоб по нему можно из ERM вызвать триггер.
Выдает всяческие ошибки в функции ASM - что-то я не правильно написал.
И ещё - какой номер триггера вставить вместо TriggerNum? Как я понимаю не занятый триггер WOG в шестнадцатеричном виде?
В GCC совсем другой ассемблер. http://ru.wikipedia.org/wiki/GNU_Assembler
(18.02.2012 14:29)etoprostoya Wrote: [ -> ]В GCC совсем другой ассемблер. http://ru.wikipedia.org/wiki/GNU_Assembler
Точно, оказывается это код TASM, а для GCC нужен AT&T
так что вот так работает:
Code:
asm
(
    ".intel_syntax noprefix\n" // use intel syntax
    "   pushad                     \n"
    "   push   0x0069DC            \n"
    "   mov    eax, 0x74CE30       \n"
    "   call   eax                 \n"
    "   add    esp, 4              \n"
    "   popad                      \n"
    ".att_syntax noprefix\n"
);
(18.02.2012 16:27)totkotoriy Wrote: [ -> ]А может есть у кого-нибудь готовый код для C++ на создание нового триггера? А то че-то теперь в героях ошибки полезли Bad

Вот пример на паскале:
Обработчик хука на ассемблере. Перенести в С++ легко, если сам хук сможешь создать. В теме " Исследование героев" раздела "Моды" есть еще более подробный комментарий, если комментария в тексте недостаточно.
А функция FireEvent в Эре случайно не запускает триггер?
(18.02.2012 19:14)kostya_76 Wrote: [ -> ]Обработчик хука на ассемблере. Перенести в С++ легко, если сам хук сможешь создать. В теме " Исследование героев" раздела "Моды" есть еще более подробный комментарий, если комментария в тексте недостаточно.
Перенести то легко, но мне нужен немного другой код асма и как его правильно написать я не знаю.
Ладно, вброшу сюда свой low-level бред для начинающих.

Простейшая stdcall-ная функция установки хука на асме имеет вид:
Code:
mov eax, [esp + 0x0C]
lea eax, [eax + 0xE8]
mov ecx, [esp + 8]
mov edx, [esp + 4]
mov [edx], al
lea eax, [edx + 5]
sub ecx, eax
mov [edx + 1], ecx
ret 0xC
3 параметра: адрес для помещения хука, адрес dll-процедуры, тип хука (0 - call, 1 - jump).

Некоторые люди ещё юзают VirtualProtect до и после установки хука, но в Воге это не нужно.
Ещё бывает, что остаток изменённого кода затирают nop-ами, но мне лично это ни разу не понадобилось: call-ом обычно замещается тоже вызов функции, так что длина опкода остаётся той же, а jump позволяет всё равно прыгать после возврата на корректный адрес. Вообще, куда и как ставить хук - отдельная история, но сам стараюсь ставить так, чтобы он менял только 5 байт.

Ещё более минималистская форма (без процедуры) массовой установки хуков - из Drew.dll:
Code:
...
    mov esi, offset Hook_Table
LoopHooks:
    mov al, [esi+8]
    mov ecx, [esi+4]
    mov edx, [esi]
    mov [edx], al
    lea eax, [edx+5]
    sub ecx, eax
    mov [edx+1], ecx
    add esi, 9
    cmp esi, End_Hook_Table
    jl LoopHooks
    ...
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
TJump equ 0E9h
TCall equ 0E8h

Hook MACRO ExeAdress, ProcDrew, TypeHook
    dd ExeAdress
    dd ProcDrew
    db TypeHook
ENDM

Hook_Table:
; 1. ДИАЛОГ СТАРТОВЫХ ХАРАКТЕРИСТИК ГЕРОЯ
    Hook 569DECh, StartHeroDialog, TCall
    Hook 5826ACh, StartHeroDialog, TCall
    Hook 5828C6h, StartHeroDialog, TCall
; 2. ОПЦИЯ ЗАПРЕТА ОТОБРАЖЕНИЯ ЭКРАНА ЗАГРУЗКИ КАРТЫ
    Hook 4ED9E0h, change_LoadScreen, TJump
    Hook 4EF83Ch, change_LoadScreen1, TJump
; 3. ВСТАВКА ТЕКСТА ИЗ БУФЕРА ОБМЕНА
    Hook 5BB500h, MainKeyboard, TJump
; 4. ИМЕНА ИГРОКОВ ДЛЯ ХОТ-СИТА
    Hook 51231Fh, MultiPlayerButtons, TJump
    Hook 512221h, MultiPlayerload_file_10_mop, TJump
    Hook 512276h, MultiPlayerStrings_realize, TJump
    Hook 512696h, MultiPlayerDialogresult, TJump
    Hook 50E229h, MultiPlayerInterdiction, TJump
; 5. УВЕЛИЧЕНИЕ КОЛИЧЕСТВА ЗАКЛИНАНИЙ В ИГРЕ
    Hook 59CD5Bh, SpellsExpand1, TJump
    Hook 4D8F77h, SpellsExpand2, TJump
    Hook 4D8B6Ah, SpellsExpand3, TJump
    Hook 4D95A8h, SpellsExpand4, TJump
End_Hook_Table:
Nop-ы не дают процессору подавиться на неправильных командах (сброс кеша, остановка предсказания переходов), идущей за перехватом, а также сохраняют отладчик от нервной дрожи при анализе.
Это понятно, я же приводил минималистскую форму. А если место для хука подбирать очень тщательно, то остатков кода может вообще не быть.
Как у тебя с FASM-ом, стабильность выросла по сравнению с ЕРМ или упала?
Pages: 1 2 3 4 5 6 7 8 9
Reference URL's