Применение изменений в скриптах
Внимание, все скрипты сохранены в кодировке ANSI-1252 (латиница-1, Западно-Европейская). Изменение кодировки может привести к ошибкам чтения скрипта.
Вероятность есть, что скрипты сохранены в двоичном ASCII виде, на что указывает наличие во многих скриптах пустых символов (0x00). Эти символы прерывают чтение скрипта, всё, что написано после них, не читается движком игры. Обычно они замыкают скрипты, но есть и специально оборванные этим символом скрипты до их конца.
Для добавления чего-либо в инвентарь NPC (персонажей) или сундуков, бочек, мешков, и изменения прочих команд, входящих в "ON INIT {}" и "ON INITEND {}" всего и вся, после первого посещения локаций, нужно в их скрипт добавить:
ON GAME_READY { // вход Ам Шегара на локацию, загрузка сохранения на ней INVENTORY ADD "" // для добавления вещей из корневых скриптов, без номеров. Некоторые предметы можно добавить во множественном числе командой "ADD_MULTI", например золотые монеты. // сюда можно добавлять те команды, которые вам нужны. ACCEPT // конец чтения функции. }
Между "" прописать то, что вам нужно, например для добавления сыра и 10-ти монет:
INVENTORY ADD "Provisions\\cheese\\cheese" INVENTORY ADD_MULTI "JEWELRY\\GOLD_COIN\\GOLD_COIN" 10
Если в скрипте уже есть функция "ON GAME_READY {}", то инвентарь и команды можно прописывать в неё, учитывая информацию о заморозке скриптов ниже, а не создавать новую функцию.
То, что уже добавлялось в инвентарь при инициализации, прописано в "ON INIT {}" оттуда можно скопировать в "ON GAME_READY {}" желаемые вещи.
После загрузки сохранения и получения желаемого из инвентаря сундука или персонажа нужно удалить добавку из скрипта, если не желаете получать вещи каждый раз при загрузке сохранения в текущей локации, или после входа на неё.
Также последующие получения можно исключить например вот так:
IF (§give == 1) ACCEPT SET §give 1
А после уже писать команды добавления вещей, и прочие. Команда "ACCEPT" прервёт чтение функции, если условие верно.
INVENTORY ADD_FROM_SCENE "" — команда добавления предметов с локации, с номерами, не подействует (если предмета уже нигде нет на текущей локации, в том числе и у Ам Шегара), или же предмет вернётся в сундук или к персонажу (если находится у Ам Шегара или на текущей локации), и получить его снова может оказаться невозможным, так как у некоторых таких вещей стоит параметр "SET_STEAL 100", что фактически означает, что вещь невозможно украсть (не убивая персонажа), такие вещи даёт сам персонаж во время диалогов, если даёт… Доспехи (скрытые вопросиками) с персонажа можно «снять» лишь после его смерти…
Но есть возможность получить вещи от персонажа или сундука при выполнении ими любого действия, это команда добавления вещей в инвентарь Ам Шегара:
INVENTORY PLAYER_ADD "" INVENTORY PLAYER_ADD_FROM_SCENE "" INVENTORY PLAYER_ADD_MULTI ""
Так, например, можно добыть ключ от ворот на поверхность, прописав в скрипте короля Ланшира (HUMAN_BASE_0082) в подходящее место "ON CHAT {}" (разговоры) или в ближайший диалог:
INVENTORY PLAYER_ADD_FROM_SCENE "KEY_BASE_0057"
Заморозка скриптов
Если изменять количество символов в скриптах объектов уровня до строк ранее запущенных таймеров:
TIMERимя -параметры разы_выполнения время_действия команды_после_завершения… \n
PLAYANIM -параметры имя_анимации (команды_после_завершения… \n)
с -параметром -e
SPEAK -параметры (под-параметры) [фраза] команды_после_завершения… \n
действующих во время сохранения игры или перехода Ам Шегара на другую локацию, то при следующем его входе на локацию этого уровня, или загрузке сохранения на нём, персонаж или другой интерактивный объект или их группа с изменёнными скриптами могут замереть и стать синими — скрипты заморозятся. Заморозка происходит когда таймер заканчивает отчёт времени, и не находит то, что должен выполнять — команды, находящиеся следом за прежним положением последнего символа его параметров время_действия, имя_анимации или [фраза] до символа новой строки \n, считываются с ошибкой.
Если по завершению действия любого таймера происходит переход по командам GOTO или GOSUB, скрипт читается уже до команд ACCEPT или REFUSE.
Всегда после запуска действуют таймеры "TIMERимя", пока не будут отключены командой "TIMERимя OFF " или "TIMER KILL_LOCAL ", в командах которых разы_выполнения равны 0. Именно этим таймерам нужно уделять особое внимание.
Команда SPEAK, содержащая [] в качестве [фразы] (ссылки на текст фразы в файле локализации и одновремено на файл звука), сама не добавляет таймер, но вызывает завершение всех воспроизводимых в этот момент речей объекта и выполнение команд_после_завершения этих речей. Также не добавляется таймер, если после [фразы] строка закачивается.
Таймеры, действующие в роликах в киношном режиме (чёрные полосы вверху и внизу, с субтитрами или без них), можно особо не учитывать, если их действие не продолжается после ролика, и сами они действуют недолго. Сохранение игры во время роликов невозможно.
Заморозка происходит и при явных ошибках в скриптах.
Чтобы избежать заморозки скриптов существует правило — новые функции следует добавлять в их конец. Если в конце скрипта имеются пустые символы (шестнадцатеричный код 0x00), их следует удалить или сместить в самый конец скрипта.
Если нужно сильно изменить имеющуюся функцию, находящуюся до действующих в момент сохранения игры или перехода на другой уровень таймеров, нужно исключить функцию из поиска в скрипте заменой первого символа имени функции на "_" (ON _AME_READY ), и скопировать функцию в конец скрипта, и уже там её изменять. Иногда есть возможность изменять (и сильно) функции с сохранением общего количества символов до таймеров.
Если же нужно изменить с перемещением в конец скрипта ветку якоря (метки, label) для перехода по "GOTO" или "GOSUB", например якоря ">>TRAMPLE_ATTACK ", то нужно его исключить из поиска в скрипте так: ">>_RAMPLE_ATTACK ". Если якори содержатся в перемещаемой в конец скрипта функции, то и они должны быть исключены из поиска вместе с ней. Но если вы не изменяете часть функции после якоря внутри функции, то из перемещённой функции можно сделать переход по "GOTO" к этому якорю (например "GOTO SPELL_SUITE " — переход к якорю ">>SPELL_SUITE " внутри функции "ON SPELLDECISION {}"), вместо написания всей функции заново целиком, но не забывая поставить в конце закрывающую фигурную скобку ("}") и перед ней команду "ACCEPT" (конец чтения функции) или "REFUSE" (отключение чтения функции из корневого скрипта объекта, Class Script). Впрочем, при переходе к якорю по "GOTO" эти две команды необязательны, а "REFUSE" не будет иметь эффекта отключения чтения функции из корневого скрипта, ведь переход происходит сразу, и возвращения в функцию уже не будет. А вот переход по "GOSUB" возвращает обратно, когда встречается команда "RETURN".
Перед //, начинающими комментарий, обязательно должен быть пробел или отступ, если комментарием не является вся строка.
Комментарии в скрипты нельзя добавлять между именем функции и открывающей фигурной скобкой ("{"). Т. е. нельзя писать например вот так:
ON GAME_READY // вход Ам Шегара на локацию, загрузка сохранения на ней {
Это вызывает сбой чтения функции.
Нельзя добавлять комментарии в одну строку с таймерами (командами "TIMERимя", "PLAYANIM" с -параметром -e, и "SPEAK"). По истечению времени действия таймера это вызовет чтение следующей строки скрипта и так далее, пока не встретится символ новой строки \n. Последней будет читаться строка, не содержащая символы // или >>, вызывающие переход к символу, следующему за \n следующей строки. Если же до \n встретится переход по командам GOTO или GOSUB, скрипт будет читаться уже до команд ACCEPT или REFUSE. Как видите, всё это может привести к большим проблемам.
Можно вставлять комментарий в строку таймера только после имени_якоря в команде "GOTO имя_якоря ". Также можно добавить комментарий после команды SPEAK, содержащей [] в качестве [фразы]. Ещё можно добавлять комментарий после команд "TIMERимя OFF " и "TIMER KILL_LOCAL ". Допускается, но не рекомендуется, добавление комментария в строку с любым таймером, когда следующая строка начинается c команд ACCEPT или REFUSE.
Комментарии можно вставлять на русском, но при сохранении скриптов в правильной кодировке они ломаются (получаются ??????? ). Поэтому возможна их вставка при открытии скриптов в русской кодировке (ANSI-1251) и при сохранении их в ней. Читать русские комментарии возможно только при открытии скриптов в русской кодировке.
Скрипты, открытые в ANSI-1251 (Кириллица-Windows), можно сохранять после редактирования только если при нём не вводились вручную символы, неверно отображаемые в ANSI-1251. Например, символ "£" кодировки ANSI-1252, означающий локальную текстовую переменную в начале её имени, выглядит как "Ј" в кодировке ANSI-1251.
Для ввода таких символов нужно использовать копирование имеющихся в скрипте, или использовать этот символ: "Ј", имеющий такой же шестнадцатиричный код, как у £ — 0xA3.
Вводить "£" в кодировке ANSI-1251 нельзя, после сохранения он получит другой код (0x3А вместо 0xA3, обычная латинская "J" имеет код 0x4A).
Сохранение скриптов в юникоде не допускается. Оно полностью ломает их чтение движком игры.
|