Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зеркально отраженные виды городов
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
feanor
Идея честно сперта у Доцента.




http://ifolder.ru/24406043 (13 Мб)
feanor
А, сорец библиотеки:

Код
//==========WriteHook=============
#define OPCODE_JUMP 0xE9
#define OPCODE_CALL 0xE8
#define OPCODE_NOP 0x90

#define HOOKTYPE_JUMP 0
#define HOOKTYPE_CALL 1

#define HOOK_SIZE 5

//работа с памятью
void WriteHook( void *pOriginal, void *pNew, char type )
{
    *(char*)pOriginal = (type==HOOKTYPE_JUMP)?OPCODE_JUMP:OPCODE_CALL;
    *(void**)( (char*)pOriginal + 1 ) = (void*)( (char*)pNew - (char*)pOriginal - HOOK_SIZE );
}
//===================================

int _edi() {__asm{mov eax, edi}}
int _esi() {__asm{mov eax, esi}}

int (__fastcall *sub_44FBE0)(int _this, int edx, short x, short y, short w, short h, short a6, short a7) =
(int (__fastcall *)(int, int, short, short, short, short, short, short))(0x44FBE0);


int __fastcall BuildingCoordsHook(int _this, int edx, short x, short y, short w, short h, short a6, short a7)
{
    int esi = _esi();
    

    x = 800 - x - w;

    *(int*)(esi+8) = x;

    return sub_44FBE0(_this, edx, x,y,w,h,a6, a7);
}



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        {
            WriteHook((void*)0x5C3377, (void*)(BuildingCoordsHook), HOOKTYPE_CALL);
            
            break;
        }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
tolich
А-а-а, мои глаза!
packa
А как ставить то и на что? smile.gif
Vade Parvis
Что тут можно сказать — жжёшь! smile.gif
feanor
Цитата
А-а-а, мои глаза!

Верхние или правые? А что?

Цитата
А как ставить то и на что?

На Эру. Лод в дату (либо его содержимое раскидать по соответствующим лодам), библиотеку - в папку с плагинами.
hippocamus
Это, конечно, классно. Феанор, а нельзя ли сделать, чтобы в игре города были и такие и зеркальные? Чтобы, например, это зависело от чётной-нечётной координаты по x, или от контрольного номера города? Это намного сложнее?
Etoprostoya
Было бы ещё идеальнее, если бы использовались те же самые дефы, а не перевёрнутые, что и в оригинале. И размер мода исчислялся бы килобайтами, а не мегабайтами smile.gif
feanor
Цитата
Феанор, а нельзя ли сделать, чтобы в игре города были и такие и зеркальные? Чтобы, например, это зависело от чётной-нечётной координаты по x, или от контрольного номера города? Это намного сложнее?

Можно. Более того, иногда мне хочется сделать поддержку скинов для городов и использование нескольких скинов на одной карте. А потом, по примеру МоР'а, привязать нанимаемых существ не к фракции, а к городу. И абилки строений привязать к скину.

Цитата
Было бы ещё идеальнее, если бы использовались те же самые дефы, а не перевёрнутые, что и в оригинале.

Влоооом..это в графику лезть, причем два раза - для масок и для дефов.
Doomђammer
А Некрополис зеркальный очень даже ничего.
hippocamus
Цитата(feanor @ 05 Jul 2011, 22:49) *
Более того, иногда мне хочется сделать поддержку скинов для городов и использование нескольких скинов на одной карте. А потом, по примеру МоР'а, привязать нанимаемых существ не к фракции, а к городу. И абилки строений привязать к скину.

Это был бы большой прорыв!
Есть ведь уже изменённые Оплот и Инферно.
Только насчёт привязки существ не совсем понимаю - т.е. в разных подвидах городов одной фракции строились бы разные строения? Это как идея ХотА с альтернативами, только безо всякой альтернативы?
Vade Parvis
Цитата
Это был бы большой прорыв!
Есть ведь уже изменённые Оплот и Инферно.
Однозначно!
Да и Замок в своё успешно заснеживали и делали пасмурным небо его экрана, кажется. Думаю, вполне можно потянуть для части городов "зимний" и/или "пасмурный" варианты (причём для Темницы, Инферно и Некрополя другие варианты и не нужны в силу "универсальности" их ландшафта на экране города; для Сопряжения — тоже, ибо почва там сплошь элементально-магического типа; и т. д., и т. п.).
ArtisanDen
Цитата(hippocamus @ 06 Jul 2011, 01:05) *
Только насчёт привязки существ не совсем понимаю - т.е. в разных подвидах городов одной фракции строились бы разные строения? Это как идея ХотА с альтернативами, только безо всякой альтернативы?

Я думаю, роль всего этого чисто эстетическая
Vade Parvis
Цитата(hippocamus @ 06 Jul 2011, 00:05) *
Только насчёт привязки существ не совсем понимаю - т.е. в разных подвидах городов одной фракции строились бы разные строения? Это как идея ХотА с альтернативами, только безо всякой альтернативы?
Насколько я понимаю, Феанор имеет в виду привязку производимых существ к каждому конкретному городу, а не к типу — т. е. возможность их настройки для каждого города одного типа отдельно. Это может быть и основой для альтернативных веток (кстати, Феанор как раз недавно выкладывал пробный вариант альтернативного двеллинга для Темницы на основе бета-версии её экрана города, попутно рассказав о своей идее сделать в городе пару альтернативных вариантов существ и частично переназначить функции построек), и "сюжетными" особыми списками нанимаемых существ в стандартных двеллингах для ключевых городов в кампаниях, и много ещё чем.
feanor
Цитата
Инферно.

Хде? Вроде, Морн только показывал скриншот начала работы.

Из б/м готового (т.е, имеются дефы): красный Замок видел, заснеженный и пасмурный Замок видел, осенний Оплот видел. Ну и отдельные экраны типа двух Форджевских, Пучины, Причала и Рощи.
Цитата
т.е. в разных подвидах городов одной фракции строились бы разные строения?

В разных подвидах городов строились бы разные строения и нанимались бы разные существа. К примеру к Замку с подтипом 3 прикручивается внешний вид Причала и существа Причала, угу.

Но разделение существ - это на дальнюю перспективу (читать как: может выйти МоР и удастся стащить оттуда).
hippocamus
Цитата(feanor @ 06 Jul 2011, 07:46) *
К примеру к Замку с подтипом 3 прикручивается внешний вид Причала и существа Причала, угу.

А, ясно smile.gif
Тоже решение.
Но Причал уже встроен отдельной dll, а вот Рощу так точно можно встроить. И Пучину!
И тогда связанный вопрос - а миниатюры городов тоже можно подставить? И названия?
Etoprostoya
Кстати, очень интересная идея вместо новых N-дцати городов налету при генерации карты ставить те города, которые захочет игрок, но так, чтобы в игре были те же 9 городов и фракций. Естественно, для игры и ИИ будет всё по-прежнему - И Цитадель и Замок и Темница, за исключением того, что юниты будут обладать другими характеристиками, но для игрока-человека это будут Бастион, Причал и Пучина. Как пример.

Очень многого для этого не надо: 1) пропатчить код, ответственный за расположение зданий для конкретных городов; 2) добавить код для спецстроений (опционально, то бишь не критично);3) переименовать или заменить дефы этих зданий; 4) заменить\переименовать всех монстров (портреты и анимация в бою и на карте); 5) заменить характеристики этих монстров; 6) может чего-то ещё не учёл.
Конечно, если известно как вмешаться в генерацию карты, но на крайний случай можно и после неё, банальной заменой.
hippocamus
Монстры добавляются дополнительно, а не на замену! Дефы тоже не должны идти на замену - иначе ты описываешь архитектуру Рощи.
Doomђammer
Цитата(feanor @ 06 Jul 2011, 07:46) *
осенний Оплот видел

Можно ссылку?
feanor
Цитата
И тогда связанный вопрос - а миниатюры городов тоже можно подставить? И названия?

Можно, думаю. Если быть точным: можно все, но кое-что лень.
Цитата
1) пропатчить код, ответственный за расположение зданий для конкретных городов; 2) добавить код для спецстроений (опционально, то бишь не критично);3) переименовать или заменить дефы этих зданий; 4) заменить\переименовать всех монстров (портреты и анимация в бою и на карте); 5) заменить характеристики этих монстров; 6) может чего-то ещё не учёл.

Экран осады. Иконки. Название города. Причем если все это сделано - то проще и удобней менять это в рантайме.
Цитата
Можно ссылку?

0.9

http://df2.ucoz.ru/2011/07/06/655182330-1309943934.wog
_Sorcerer_
ссылка-то не работает.
feanor
Всё работает.
_Sorcerer_
А у меня не работает rolleyes.gif
dik X.B.
А зачем это? Или для чего?
Doomђammer
Цитата(dik X.B. @ 06 Jul 2011, 19:02) *
А зачем это? Или для чего?

just for lulz, спрашиваете ещё
nosferatu
Цитата(dik X.B. @ 06 Jul 2011, 20:02) *
А зачем это? Или для чего?

Некоторым может наскучить несколько лет подряд играть в игру, в которой ничего не меняется. А это будет небольшой эстетической заменой.
feanor
Для того, чтобы я мог воткнуть в подзаголовок строчку из Блиндов.
feanor
Так. Кто-то там учил, что сначала надо составлять техдокументацию a потом сдавать её как курсовой и лишь потом писать софт.

1. Сменяемый вид городов.
1.1. Функционал: поддержка разных видов городского экрана (скинов) для одного и того же вида городов (т.е, динамическая смена координат строений, их дефов, масок и обводок). Привязка скина к городу с возможностью сохранения в течении всей игры. Возможность управления отображаемым скином (т.е - возможность задавать скин, узнавать текущий используемый скин, наличие сообщения, сигнализирующего о начале отрисовки городского экрана).

1.2. Основной проблемой в данной задаче является достаточно надежный механизм закрепления скина за конкретным городом.
Возможные пути решения:
  • случайная раздача скинов городам на старте карты.
  • возложить это на ERM-скриптера. В таком случае от системы потребуются:
    • наличие триггера на начало отрисовки города
    • возможность грузить заданный скин во время этого триггера.

    Определение того, какой конкретно скин будет грузиться, возлагается на ERM-скриптера. С одной стороны, это усложняет его работу, с другой - повышает гибкость системы
  • хранить номер последнего заданного скина в структуре города, к примеру - на месте неиспользуемых битов в поле для строений. При этом уменьшается сложность скрипта (фактически - достаточно один раз задать требуемый вид города)
  • хранить номер последнего заданного скина во отдельной таблице. Это увеличит сложность, но вместе с тем увеличит и надежность.


1.3. Детали технической реализации.
За отрисовку экрана города отвечает функция 005C6C70
За используемый фон: таблица префиксов в 00643050, формирование имени происходит в 005C6E52
За глубины отрисовки: таблица в 00642EC4
За имена дефов строений: 00643074
За координаты: 68AA0E
За имена масок и обводок: 68A3DC

Всего зданий - 44

Таким образом, скин должен менять достаточно большое количество разнородных параметров, притом его формат должен быть открыт для дальнейших изменений и легок для обработки.
_____________
Писать фигню в час ночи - весело!
feanor
Япапко сдохло, залил пока на дропбокс.
Заодно переименовал файлы под Эру.

http://dl.dropbox.com/u/61759222/quartz.7z
hippocamus
Как с реализацией этого при рантайм-отражении дефов?
feanor
Никак.
packa
Ужасное майндфакерство))) Я мозг сломал
Bes
готовлю репак для ERA, потому встал такой вопрос:
взять ли исправленные кадры для экранов городов из HotA? вдруг в ERA2.5 включат эти правки, а мод будет вновь возвращать зеркальные кривости?
FallenAngel
Bes, так придется же координаты менять в исправлениях.
Bes
Цитата(FallenAngel @ 17 Jan 2013, 21:37) *
Bes, так придется же координаты менять в исправлениях.

там уже всё есть же, feanor в dll уже всё включил... я про только те кадры, которые достаточно обновить через def.
feanor
Цитата
Bes, так придется же координаты менять в исправлениях.

Не придется, координаты правятся автоматически при отрисовке.
FallenAngel
feanor, я как-то всю графику конфлюкса из хотовского лода скопировал на чистый вог. Что-то ужасное получилось.
hippocamus
Конечно. Координаты же изменены.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.