Current time: 14.04.2024, 20:49 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Программирование ВОГ
Author Message
SAG Offline

Posts: 173
Post: #106

(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 игр и потом в СОД постоянно хочется ругаться матом
(This post was last modified: 29.07.2010 19:02 by SAG.)
29.07.2010 18:58
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #107

Давно хочу сделать интегрированную в хайрез поддержку 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
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #108

(30.08.2010 18:58)baratorch Wrote:  На каком, интересно, принципе основана работа 32bit патча?..
емнип, там заменяется библиотека ddraw


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
30.08.2010 19:28
Find all posts by this user Quote this message in a reply
GrayFace Offline
Forum Moderators

Posts: 1233
Post: #109

Да, потом создаются свои прокси IDirectDraw, IDirectDrawSurface и т.п., которые перекидывают с 16-битной поверхности на 32-битную. Блиттинг используется через канвасы (HDC) поверхностей, т.к. другие варианты работали не у всех.
Bourn уже сделал поддержку нового DirectX - с нормальным сглаживанием и другими интересностями. Лучше всего тебе поговорить с ним.


Вся правда обо мне
31.08.2010 22:25
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #110

(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-битные директдро поверхности и функцию блиттинга своими структурами и кодом, посмотрим решит ли это проблему...
03.09.2010 00:52
Find all posts by this user Quote this message in a reply
totkotoriy Offline

Posts: 873
Post: #111

Господа-товарищи помогите пожалуйста написать плагин в 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 в шестнадцатеричном виде?


Ты роешься в моих паках, но ты делаешь это без уважения...
(This post was last modified: 18.02.2012 13:51 by totkotoriy.)
18.02.2012 13:50
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #112

В GCC совсем другой ассемблер. http://ru.wikipedia.org/wiki/GNU_Assembler
18.02.2012 14:29
Find all posts by this user Quote this message in a reply
totkotoriy Offline

Posts: 873
Post: #113

(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"
);


Ты роешься в моих паках, но ты делаешь это без уважения...
(This post was last modified: 19.02.2012 13:00 by totkotoriy.)
18.02.2012 16:27
Find all posts by this user Quote this message in a reply
kostya_76 Offline

Posts: 33
Post: #114

(18.02.2012 16:27)totkotoriy Wrote:  А может есть у кого-нибудь готовый код для C++ на создание нового триггера? А то че-то теперь в героях ошибки полезли Bad

Вот пример на паскале:
Обработчик хука на ассемблере. Перенести в С++ легко, если сам хук сможешь создать. В теме " Исследование героев" раздела "Моды" есть еще более подробный комментарий, если комментария в тексте недостаточно.
18.02.2012 19:14
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #115

А функция FireEvent в Эре случайно не запускает триггер?
18.02.2012 20:52
Find all posts by this user Quote this message in a reply
totkotoriy Offline

Posts: 873
Post: #116

(18.02.2012 19:14)kostya_76 Wrote:  Обработчик хука на ассемблере. Перенести в С++ легко, если сам хук сможешь создать. В теме " Исследование героев" раздела "Моды" есть еще более подробный комментарий, если комментария в тексте недостаточно.
Перенести то легко, но мне нужен немного другой код асма и как его правильно написать я не знаю.


Ты роешься в моих паках, но ты делаешь это без уважения...
19.02.2012 13:23
Find all posts by this user Quote this message in a reply
MOP Offline
Moderators

Posts: 1468
Post: #117

Ладно, вброшу сюда свой 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:


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
20.02.2012 07:54
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16471
Post: #118

Nop-ы не дают процессору подавиться на неправильных командах (сброс кеша, остановка предсказания переходов), идущей за перехватом, а также сохраняют отладчик от нервной дрожи при анализе.


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

Posts: 1468
Post: #119

Это понятно, я же приводил минималистскую форму. А если место для хука подбирать очень тщательно, то остатков кода может вообще не быть.


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
(This post was last modified: 20.02.2012 19:14 by MOP.)
20.02.2012 19:08
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16471
Post: #120

Как у тебя с FASM-ом, стабильность выросла по сравнению с ЕРМ или упала?


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
20.02.2012 20:02
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