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

Эта функция позволяет заменять следующие виды строк:
- Названия заклинаний
- Тексты типа "атака, защита, к. сила, знание", тексты в теверне, кузнице, логове воров, тексты "журнал" и "уволить героя"
- Тексты "базовое, продвинутое, экспертное"
Это далеко не все, но я пока что подружил ее только с этими строками. Если функция будет нормально работать на всех компах, то я могу забить сюда же описания заклинаний и практически все что хотите.

Синтаксис функции: !!FU25001:P#1/#2/#3;
Где
#1 - тип строки
#2 - подтип строки
#3 - индекс z-переменной (только глобальные!)

Типы строк: На текущий момент поддерживается всего 3
0: Общие строки
1: Строки уровня умений
2: Заклинания

Подтипы строк зависят от типа.
Общие строки
*** Экран героя ***
0-3: Названия первичных навыков героя
5: "опыт"
6: "количество маны"
7: "Журнал"
8: "Уволить героя"
*** Экран верфи ***
12: Текст сверху
13: Текст "стоимость ресурсов"
*** Экран логова воров ***
12-22: Тексты "1-ый", "2-ой" ... "8-ой"
23-34: Тексты "Кол-во героев", "кол-во городов" и т д (сверху - вниз)
*** Экран таверны ***
36: Надпись сверху
37: надпись "купить героя"
*** Экран кузницы ***
42: текст "стоимость"

Уровни умений
0-2: Базовое, Продвинутое, Экспертное
3-5: То же самое но сокращенно (баз, продв, эксп)

Название заклинания
Номер заклинания (Format S)

Теперь о неприятном.
1) Новое название должно быть не длиннее старого. Если длиннее - обрезается, если короче - остаток забивается пробелами (могу сделать забивание нулями, но тогда обратный возврат будет затруднен.
2) Эти изменения не сбрасываются при смене карты. Я предлагаю самому сбрасывать их когда юзер щелкает на кнопку "компьютера" (опции и выход), и устанавливать при загрузке карты или если юзер ничего не вышел (хз как, нужно думать)...

Сама функция, собственно, вот
Код
!?FU25002;
!!VRy1:Sx1+x16;
!!VRy2:Sx2+x16;
!!UN:Cy2/1/?y3;
!!VRy3&y3=0:S32;
!!UN:Cy1/1/?y4;
!!UN&y4<>0:Cy1/1/y3;
!!VRx16&y4=0:S256;

!?FU25001;
* x1 - string type
* x2 - string subtype
* x3 - index of z string
!!VRv451:C61593540/61332112/6961792;
!!VRy4:S451+x1;
!!VRy5:Svy4;
!!VRy1:Sx2*4+y5;
!!VRy2:Sx3*512+40225400; <- Для TE заменить число на 9597416 (адрес начала z строк)
!!UN:Cy1/4/?y3;
!!DO25002/0/255/1:Py3/y2;


Использование, например
Код
!!VRz100:S^Лодку мне!^;
!!FU25001:P2/0/100;


Меняет название заклинания "вызвать лодку" на "Лодку мне!".

В общем если хотите, чтобы я подружил функцию с другими строками - пишите!
Если у кого-то не работает отпишитесь!
Миханик
Цитата(ShadowTheAge @ 23 May 2007, 19:25)
Теперь о неприятном.
1) Новое название должно быть не длиннее старого. Если длиннее - обрезается, если короче - остаток забивается пробелами (могу сделать забивание нулями, но тогда обратный возврат будет затруднен).
по-моему, надо просто отредактировать текстовые ресурсы, удлинив строки пробелами до 32 или даже 64 символов. тогда всё будет нормально.
Demiurg
Если будет несложно, глянь плз на предмет редактирования лога битвы. Ну или хотя бы чтения того, что в этот лог уже записано.
ShadowTheAge
Без проблем, схожу в больницу, приду - напишу laugh.gif если возможно.
З.Ы. Чтобы не постить много - гляньте на скрин, делаю для своей карты новый экран героя:



Все что есть уже работает - одевание/раздевание артефактов/свитков, характеристики (они все 0 но работают, так как загружаются и самообновляются), выбор героя. Три рюкзака пока одинаковые (можно перекладыцвать из одного в другой), потом может разделю по функциям.
Так что !!DL рулит laugh.gif
ShadowTheAge
2Demiurg
Задачку для ума задал жжесть, как найти плавающие по памяти строки, на которые ссылается плавающий по памяти класс laugh.gif Причем этот класс даже внутри одного боя умудряется прыгать из одного адресного пространства в другое.

Вот. Написал, но результатом недоволен...

Во-первых, я так и не нашел где можно узнать количество строк в логе. Поэтому провожу простую проверку на правильность адреса, но эта проверка (теоретически) может пропустить неправильный адрес (шанс невелик но...)

Во-вторых, в TE и WOG разные адреса z-переменных. Указаный скрипт для TE, если будешь использовать под WOG нужно слегка поменять.

В третьих запись работает, но за результат я не ручаюсь (опять же в 99,9% случаев все должно быть норм). Если новая строка короче старой то 100% норм.

А В остальном же все работает.
Использование:
x1 - номер строки в логе (сверху вниз, начиная с 0)
x2 - действие (0-чтение, 1-запись)
x3 - номер z переменной куда/откуда записать/считать данные

Код
!?FU24660;
!!UN:C61479708/4/?y1;
!!IF:V1/0;
!!VRy1:+88;
!!UN:Cy1/4/?y2;
!!VRy3:Sx1*4+y2;
* Very simple test for error
!!VRy98:Sy3+3;
!!UN:Cy98/1/?y99;
!!FU|y99<3/y99>10:E;
* end
!!UN:Cy3/4/?y4;
!!VRy4:+4;
!!UN:Cy4/4/?y5;
!!VRy6:Sx3*512+9597416; <- ДЛЯ ВОГ ЗАМЕНИТЬ ЧИСЛО НА 40225400
!!DO24661/0/511/1:Py5/y6/x2;
!!IF:V1/1;

!?FU24661;
!!VRy1&x3=0:Sx1+x16;
!!VRy2&x3=0:Sx2+x16;
!!VRy1&x3=1:Sx2+x16;
!!VRy2&x3=1:Sx1+x16;
!!UN:Cy1/1/?y3;
!!UN:Cy2/1/y3;
!!VRx16&y3=0:S511;


Проверяй и отпишись.
Если такой строки нет (вернее, если сработала проверка на ошибку) то флаг 1 устанавливается на 0, иначе на 1 (короче флаг 1 - индикатор успешности)

З.Ы. Народ, отпишитесь по поводу скрина двумя постами выше laugh.gif
gamecreator
Цитата(ShadowTheAge @ 19 Sep 2007, 14:57)
З.Ы. Народ, отпишитесь по поводу скрина двумя постами выше laugh.gif

ну что я могу сказать. ты псих smile.gif
Druin
gamecreator, а ты сам побалуйся с диалогами... Тоже психом станешь... crazy.gif
gamecreator
мне что, нечего делать? smile.gif
ты лучше скажи что надо сделать чтобы земля выставлялась не "квадратиками", а как в редакторе (!!TR)
Druin
2ShadowTheAge
Красиво... тока кой где на пиксел два подровнять мона... например стрелочки рюкзака(ов) вниз на пиксел опустить... И если хошь это пообсуждать то лучше создай отдельную тему... тут оффтопом будет... а посты я тогда перенесу...
sergroj
Да, чувствую, пора редактор диалогов выпускать в свет.
Druin
Пора пора... smile.gif Бо много времни уходит на подбор координат...
ShadowTheAge
2Druin
Не, обсуждать не нада... Просто я просмотрел форум сразу после того как полностью отладил работу артефактов, и на повышенном настроении и выложил сюда скрин... Обсуждать, надеюсь (если не случится чего, самое страшное - забью я на это дело до выхода 359), обсуждать надеюсь будем саму карту laugh.gif быть одновременно и сценаристом, и скриптописцем тяжело, зато нет никакой мороки с распределением обязоностей/состыковкой работ разных людей.
Demiurg
2ShadowTheAge
В функции для работы с Battle log'ом происходит вылет на строчке
Код
!!UN:C61479708/4/?y1;
ShadowTheAge
У тебя WOG или TE? Я тестил под TE все работает. Сейчас проверю для WOG...

Для вога попробуй число 60951908 в той строчке. Если не работает, значит все, акоп, постоянные скачки адресов будут давать нормальные результаты только для каждой конкретной копии героев. Чуть изменение ресурсов - сбой.

Вообще структура класса такова:

Начало класса
(смещение от начала класса $58 - 88 байт) - ссылка на массив строк.

Массив строк:
Каждое смещение на 4 байта дает адрес следующего ресурса строки.

Ресурс строки:
Смещение 4 байта от начала - адрес, собственно строки.

Вот.

Осталось только найти адрес начала класса. Я думал он статичный (так как при каждом перезапуске героев/боев оставался на местах) но оказалось зависит от версии героев.

З.Ы. Artmoney rulz.
Berserker
ShadowTheAge, респект!
Demiurg
У меня TE
Попробую в артмани глянуть эти адреса. Может я конечно в скрипте неправильно что-то делаю.

Добавлено ([mergetime]1190232546[/mergetime]):
У меня просто адрес памяти 61479708 не определен. Включая значительную его окрестность.
ShadowTheAge
Последний шанс - попробуй адрес 6901840
Он в 10 раз меньше предыдущего и остается надеятся, что он пришел к нам из статичной области памяти.

Хотя нет, не последний. Есть у меня еще один занимательный адресок. Так что если не получится, надо будет слегка скрипт переделать
Demiurg
Этот тоже не дал результатов
ShadowTheAge
Так, переписал. Вот теперь результатом я доволен laugh.gif
Во - первых, вроде бы теперь должно нормально работать во всех версиях (но адреса z переменных придется менять на 3.58)
Во - вторых, я таки нашел где, а точнее как хранится количество строк в логе.

Новое использование:
x1 - действие:
0 - чтение, 1 - запись. х2 - номер строки в логе (от 0). x3 - номер z переменной куда/откуда читать.
2 - Посчитать количество строк лога (возвращает в х2, т.е. !!FU#:Р2/?v1;)
3 - Очистить лог (вызов !!FU#:Р3;)

Флаг 1 больше не используется за ненадобностью. Чтение/запись несуществующей строки игнорируется.

Код
* Version 2.1
!?FU24660;
!!UN:C5613845/4/?y1;
!!VRy1:+672;
!!UN:Cy1/4/?y2;
!!VRy2:+88;
!!VRy3:Sy2+4;
!!UN:Cy2/4/?y4;
!!UN:Cy3/4/?y5;
!!UN&x1=3:Cy3/4/y4;
!!VRx2&x1=2:Sy5-y4:4;
!!FU&x1>=2:E;
!!VRy6:Sx2*4+y4;
!!FU&y6>=y5:E;
!!UN:Cy6/4/?y7;
!!VRy7:+4;
!!UN:Cy7/4/?y8;
!!VRy9:Sx3*512+9597416; <- Для ВОГ менять на 40225400
!!DO24661/0/511/1:Py8/y9/x1;

!?FU24661;
!!VRy1&x3=0:Sx1+x16;
!!VRy2&x3=0:Sx2+x16;
!!VRy1&x3=1:Sx2+x16;
!!VRy2&x3=1:Sx1+x16;
!!UN:Cy1/1/?y3;
!!UN:Cy2/1/y3;
!!VRx16&y3=0:S511;
Druin
Цитата(ShadowTheAge @ 19 Sep 2007, 18:23)
2Druin
Не, обсуждать не нада...

А придецца idontno.gif
Ну или стучись мне в асю бо есть пару вроде здоровых на голову мыслей...
MasterOfPuppets
Скрипт ShadowTheAge (чтение/запись строк лога битвы) даёт вылет, если у героя есть Тактика.
MasterOfPuppets
Мене. Тэкел. Упарсин.

*Функция записи/чтения строк в/из TXT------------------------------------------*
Параметры:
x1 - тип текстовика
x2 - номер строки (начиная с нуля)
х3 - мод: 0 - чтение текста, 1 - полная замена, 2 - запись ссылки, 3 - чтение ссылки
x4 - для модов 0-2: число (адрес), числовая переменная или номер z-переменной
для мода 3: только числовая переменная (?$Var$)

Код
!?FU1;
!!VRy100&x1=0:S6970820; GENRLTXT.TXT
!!VRy100&x1=1:S6971564; ARRAYTXT.TXT
!!VRy100&x1=2:S6909120; ARTEVENT.TXT
!!VRy100&x1=3:S6908520; ADVEVENT.TXT
!!VRy100&x1=4:S6976900; PLCOLORS.TXT
!!VRy100&x1=5:S6968376; MINENAME.TXT
!!VRy100&x1=6:S6971364; MINEEVNT.TXT
!!VRy100&x1=7:S6968208; RESTYPES.TXT
!!VRy100&x1=8:S6910692; RANDTVRN.TXT
!!UN:Cy100/4/?y1;
!!VRy1:+32; [смещение]
!!UN:Cy1/4/?y2; [получить адрес начала таблицы ссылок на строки]
!!VRx2:*4+y2; [переход к ссылке на конкретную строку]
!!UN:Cx2/4/?y1;
!!VRx4&x4<1001/x3<3:*512+9597416;
!!DO2/1/512/1&x3=0:Py1/x4;
!!DO2/1/512/1&x3=1:Px4/y1;
!!UN&x3=2:Cx2/4/x4;
!!VRx4&x3=3:Sy1;
!?FU2;
!!UN:Cx1/1/?y1;
!!if&y1=0;
!!UN:Cx2/1/0;
!!VRx16:S600;
!!FU:E;
!!en;
!!UN:Cx2/1/y1;
!!VRx1:+1;
!!VRx2:+1;


*Пример 1: замена названия Гарнизона во внутреннем диалоге объекта
Код
!#VRz999:S^Сторожевой пост^;
!#FU1:P0/595/2/999;


*Пример 2: получить в z1 текст внутреннего диалога Арены
Код
!#FU1:P3/0/0/1;
!#IF:M1/1;


*Пример 3: заменить все слухи в Таверне, кроме слухов о Граале.
Код
!?FU3;
!!FU1:P8/x16/1/2;
!#VRz2:S^Конец света близок!^;
!#DO3/0/300/1:P;


*Пример 4: Изменить текст сообщения при поднятии Топора Свирепости
Код
!#VRz1:S^Эх, наточил я свой топор - головешек полон двор!^;
!#FU1:P2/158/1/1;


*Пример 5: Изменить имя красного игрока и текст принадлежности для всех его объектов с флагом
Код
!#VRz1:S^Вася Пупкин^;
!#VRz2:S^Принадлежит Васе Пупкину^;
!#FU1:P4/0/1/1 P1/23/1/2;


*Примечание 1:
Полная замена даёт возможность изменять переменную после замены строки, но текст замены в таком случае должен быть не длиннее, чем стандарт.
Запись ссылки даёт возможность использовать текст в пределах длины z-переменной, но переменную после этого изменять нельзя. Впрочем, если это делается на краткое время, то неважно.
*Примечание 2: для многих текстовиков доступна лишь полная замена строки - изменение ссылок не работает. Если результатов для мода 2 нет, рекомендуется выйти из игры и попробовать мод 1.


P.S. в свободное время дополню функцию поддержкой текстовиков табличного типа.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.