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

Ребят, кто знает, подскажите какая v-переменная отвечает за вкл./откл. WoG опций?
Если не знаете то подскажите как в самом скрипте понять?

Конкретно сейчас интересует расширение "Волшебство l" (опция 23, script 23).
feanor
А причем тут v-переменные? За включение/выключение UN:P опции всю жизнь отвечали.
oleggy
Я конечно не специалист. Но перед мной стоит задача в самой игре (уже загруженной) включить WOG опцию которая была отключена изначально.
Как это сделать?
Я так понял утилита DEE не может этого сделать. Она только загружает скрипты в память. А вот будут скрипты выполнятся или нет зависит от значения соответствующей переменной, в памяти, которая и опередеяет, включена ли опция или отключена. С помощью утилиты EVME можно принудительно записать в эту переменную такое значение которое соотвествует включению WOG опции.
Я просто не до конца знаю, UN:P соответствует какой v-переменной?
feanor
Можно попробовать переписать скрипт, убрать проверки на опции и переместить инструкции в !?GM0 и загрузить его через DEE..не знаю, сработает ли.

Цитата
Я просто не до конца знаю "UN:P" соответствует какой v-переменной?

Никакой. Опции лежат в отдельной песочнице.
gamecreator
выполнение скриптов с ДЕЕ:
1) выгружаем скрипт
2) дописываем триггер с нужным нам кодом
3) загружаем скрипт
4) запускаем триггер
5) выгружаем скрипт
6) убираем дописанный нами код
7) загружаем скрипт
8) ????
9) PROFIT
feanor
А, кстати да - можно попробовать выполнить скрипт типа

!?GM0;
!!UN:P23/1;
Berserker
Столько советов - и все неправильные )
Это я сказал Олегу, что v-переменные. Потому что большинство, если не все, воговские скрипты в инструкциях сохраняют опции в переменные и в условиях используют уже их.
Ищем: !#UN:P[#]/?v[...]; и запоминаем v.
feanor
Ага, щас.

Код
[Start of CM trigger]
!?CM;

[Check if Sorcery script is enabled]
!!UN:P23/?v1;

!?CM&v1=1; [Continue trigger if Sorcery script is enabled]

[Check item area clicked]
!!CM:I?v1;

[If item area is adventure map, call Function 5000]
!!FU5000&v1=37:P;
oleggy
Т.е. переменная которая отвечает за включение данной опции это v1 ?
Начал проверять ее значения, и они всегда разные для каждого сейва (от разных дней). Данные не постоянные. Так и должно быть?
Я ожидал увидеть значение 1 или 0.
Ладно, я еще поразбираюсь.
gamecreator
нет, феанор предложил другой способ: если опция выключена, то передавать управление основной функции нужного скрипта
Berserker
Большинство, не все. Если найти адрес начальной опции, через Evme можно и их править.
feanor
Цитата
Так и должно быть?

Да. v1 временная переменная и её правка скрипт не изменит.

Цитата
Большинство, не все. Если найти адрес начальной опции, через Evme можно и их править.

А чем предложенный мной способ с !?GM0; !!UN:P23/1; не катит?

Цитата
нет, феанор предложил другой способ: если опция выключена, то передавать управление основной функции нужного скрипта

Это просто кусок кода из 23его скрипта.
Berserker
Цитата
А чем предложенный мной способ с !?GM0; !!UN:P23/1; не катит?

Он катит, но вечная подгрузка-сохранение-правка мутнее, чем работа с Евме на мой вкус (при тестировании опций как хочет автор). Впрочем, решать автору запроса.
oleggy
Предложенное Берсом мне больше всего подходит. Более изящное решение, хотя требует более глубокого понимания.
Самое сложное это:
Цитата(Berserker @ 15 Aug 2011, 23:14) *
Если найти адрес начальной опции, через Evme можно и их править.

Я так понимаю v1 это временная переменная. И ее изменение ничего не даст.
Я тут бегло посмотрел основываясь на полученных знаниях, заметил что сторонние скрипты (не в изначальном WOG) используют различные переменные (не временные). К примеру строка кода:
!#UN:P878/?v5078 P879/?v5079 P880/?v5080 P881/?v5081 P882/?v5082;
Из такого кода понятно что опции 878 соответствует v5078, 879 соответст. v5079 и так далее. (Или я ошибаюсь?)
А в скрипте волшебства не так выходит?
Я просто думаю что временная переменная тоже должна откуда то брать свое значение, или записывать его куда-то. В какую то постоянную переменную. Там и нужно менять.
Это можно как то через скрипт выяснить? Какая переменная не временная?
Читая начало скрипта
Код
[Check if Sorcery script is enabled: v1=1]
!#UN:P23/?v1;

[Set Flags 410 to False]
!#IF&v1=1:V410/0;

Догадываюсь что если опция включена то идет установка флага 410 в ложь. Я вот не понял, флаг это переменная v410 ? Ее и нужно менять?
Berserker
Скрипт волшебства всегда получает опцию через ЕРМ, а не хранит в переменной. Если я не ошибаюсь, адрес - $2771920. Это в шестнадцатиричном виде. Массив чисел по 4 байта. В десятеричном адрес любой опции вычисляется как 41359648 + 4 * Номер опции.

В EVME r [адрес] i для чтения, w [адрес] i [новое значение] для записи,
oleggy
1. Берс, выходит что для волшебства 1 (опция 23) вычисления будут следующие, (для DEC): 41359648 + 4 * 23 = 41359740 (в HEX ->) $277197C. И именно в HEX виде вводить в [адрес] ? (сам в игре не проверял еще).
2. И еще, ты написал (как я понял) что все опции в WOG хранятся в массиве, где каждый элемент по 4 байта. А размер массива какой? Динамический?
3. Как я знаю во всех скриптах присутствуют порядковые номера опций, так эти номера выходит нигде не пересекаются? Ошибится то легко. Скриптов то много, причем не только в WOG но и от сторонних скриптописателей...
4. Берс, я выше привел код одного стороннего скрипта, вот он:
Код
!#UN:P878/?v5078 P879/?v5079 P880/?v5080 P881/?v5081 P882/?v5082;

Выходит при таком способе написания (без временных v1), по каждей опции можно понять включена ли она или нет? Т.е. каждой опции заданы явно переменные, т.е. №878 - v5078 и т.д. Или не так?
5. Ранее, когда была проблема с гарнизонами на XXL карте, ты предложил простое решение, отключить все опции через переменную v576, т.е. обошелся без поиска самого адреса. В каких случаях лучше искать переменную и отключить ее а в каких случаях искать/вычислять адрес?
gamecreator
Цитата(oleggy @ 16 Aug 2011, 05:18) *
В каких случаях лучше искать переменную и отключить ее а в каких случаях искать/вычислять адрес?
если в скрипте в инструкции есть считывание значения опции в переменную, то работать с переменной, иначе работать с опцией (адресом).
oleggy
Цитата(gamecreator @ 16 Aug 2011, 15:42) *
если в скрипте в инструкции есть считывание значения опции в переменную, то работать с переменной, иначе работать с опцией (адресом).

имеешь ввиду что в таком коде:
Код
!#UN:P878/?v5078 P879/?v5079 P880/?v5080 P881/?v5081 P882/?v5082;

флаг опции сохраняется в переменные? не временные?
feanor
Цитата
2. И еще, ты написал (как я понял) что все опции в WOG хранятся в массиве, где каждый элемент по 4 байта. А размер массива какой? Динамический?

Нафиг динамический? Статический, думаю, на тыщу возможных опций.

Цитата
3. Как я знаю во всех скриптах присутствуют порядковые номера опций, так эти номера выходит нигде не пересекаются? Ошибится то легко. Скриптов то много, причем не только в WOG но и от сторонних скриптописателей...

Такова карма ВоГа. Войны за всевозможные индексы, lists of the claimed etc etc

Цитата
5. Ранее, когда была проблема с гарнизонами на XXL карте, ты предложил простое решение, отключить все опции через переменную v576, т.е. обошелся без поиска самого адреса. В каких случаях лучше искать переменную и отключить ее а в каких случаях искать/вычислять адрес?

Зависит от скрипта, очевидно же.
gamecreator
Цитата(oleggy @ 16 Aug 2011, 12:23) *
имеешь ввиду что в таком коде флаг опции сохраняется в переменные?
очевидно же
Berserker
Статический массив на 1000. Он же и сохраняется в файл таким же размером. А так выше уже написали, что если получения в v с индексом хотя бы больше 1, то скорее всего дальше в скрипте везде проверки только переменных.

Цитата
1. Берс, выходит что для волшебства 1 (опция 23) вычисления будут следующие, (для DEC): 41359648 + 4 * 23 = 41359740 (в HEX ->) $277197C. И именно в HEX виде вводить в [адрес] ? (сам в игре не проверял еще).

Вычисление вроде верное, а так EVME два формата понимает: $hex или decimal.
oleggy
Цитата(Berserker @ 16 Aug 2011, 20:33) *
если получения в v с индексом хотя бы больше 1, то скорее всего дальше в скрипте везде проверки только переменных.

Не понял это. Поясни.
Berserker
UN:P?v[>1] - запоминаешь и меняешь переменную, иначе опцию через адрес.
tolich
Кэп замечает, что переключение некоторых опций не будет иметь никакого эффекта (например, замена сод-объектов воговскими).
oleggy
Цитата(tolich @ 17 Aug 2011, 12:04) *
Кэп замечает, что переключение некоторых опций не будет иметь никакого эффекта (например, замена сод-объектов воговскими).

Само собой. Тут конечно обсуждаем такие скрипты которые в игре работают постоянно.

Цитата(Berserker @ 17 Aug 2011, 10:56) *
UN:P?v[>1] - запоминаешь и меняешь переменную, иначе опцию через адрес.

Понял. Имеешь ввиду что если в скрипте опция имеет переменную с v2,v3 и то ее можно отключить методом изменения значения этой переменной, а если v1 то надо вычилять/изменять ее адрес.

Еще вопрос, во время игры когда заходишь в сохранить->WOG опции там отмечено какие опции включены/отключены.
И если опцию отключить/включить с помошью EVME, вот в окне WOG опций они будут отмечены что они отключены/включены или они быдут иметь тот же статус который был задан при создании игры?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.