Что делать, если автор не дал psc файлы?

...В помощь переводчику...

Перевод - это великое дело, но что делать, если переводимый текст записан в функции MessageBox "ля ля - фа фа", а исходника (.psc файла) этого скрипта злобный автор не предоставил.

Не унываем - выход есть: Bethesda снабдила нас возможностью дезассемблировать скрипты, просто не сказала нам об этом. Итак, как это сделать:

  • Ну это в принципе ясно - ставим "конструктор"
  • Находим папку %gamedir%\Papyrus Compiler и обращаем в ней внимание на файл PapyrusAssembler.exe - это и есть ассемблер скриптов, а он-же и дезассемблер, если задать соответствующий ключ.

Как им пользоватся? А всё просто:

  • Устанавливаем рабочую папку в папку с .pex файлом, который нужно дезассемлбировать

Ну, это сделать так, чтоб в утилите cmd перед курсором писалось например e:\Skyrim\data\Scripts, короче путь к интересующей нас папке. Это можно сделать набором команд cd или перейти в файлменеджере (напр. Total commander) в нужную папку и в командной строке набрать cmd и нажать "ввод".
В командной строке (можно, даже лучше, создать .bat файл) пишем:

"%gamedir%\Papyrus Compiler\PapyrusAssembler" <имя интересующего нас pex файла, только без расширения> -D

  • Жмём ввод.
  • Итого, если всё написано правильно т. е. если программа написала:
0 error(s), 0 warning(s)
Disassembly succeeded
  • То ищем в папке с .pex файлом файл формата "имя нашего pex файла.disassemble.pas" - это и есть дезассемблированный файл, который хоть и имеет специфический формат, сильно отличающийся от формата psc файла, но уже являющийся текстовым и его можно редактировать.

Итак. Редактировать. А что редактировать? А то же (названия функций принципиально не изменены т. е. забивай в поиск название функции напр. MessageBox (или Message), находи строку, в которой она встречается и редактируй текст в "кавычках".

Оригинальный скрипт

Scriptname _test_testscript extendsObjectReference   
{Тестовыйскрипт
"Привет мир!"}
EventOnActivate(ObjectReference akActionRef)
Debug.MessageBox("Привет, мир!")
endEvent

Дезассемблированный скрипт

 

 .info
        .source "_test_testscript.psc"
        .modifyTime 1336688266;FriMay1101:17:462012Local
        .compileTime 1336688290;FriMay1101:18:102012Local
        .user "Администратор"
        .computer "USER-B390813CF2"
.endInfo
.userFlagsRef
        .flag hidden 0  ;0x00000000
        .flag conditional 1     ;0x00000001
.endUserFlagsRef
.objectTable
        .object _test_testscript ObjectReference
                .userFlags 0    ;Flags:0x00000000
                .docString "Тестовый скрипт\n\"Привет мир!\""
                .autoState 
                .variableTable
                .endVariableTable
                .propertyTable
                .endPropertyTable
                .stateTable
                    .state 
                           .functionOnActivate
                                    .userFlags 0    ;Flags:0x00000000
                                    .docString ""
                                    .return NONE
                                    .paramTable
                                          .param akActionRef ObjectReference
                                    .endParamTable
                                    .localTable
                                          .local::nonevar NONE
                                    .endLocalTable
                                    .code
                                  CallStatic debug MessageBox::nonevar "Привет, мир!"  ;@line6
                                    .endCode
                            .endFunction
                            .functionGotoState
                                    .userFlags 0    ;Flags:0x00000000
                                    .docString "Function that switches this object to the specified state"
                                    .return NONE
                                    .paramTable
                                           .param newState String
                                    .endParamTable
                                    .localTable
                                           .local::nonevar NONE
                                    .endLocalTable
                                    .code
                                            CallMethod onEndState self::nonevar                     ;@line??
                                            Assign::state newState                                  ;@line??
                                            CallMethod onBeginState self::nonevar                   ;@line??
                                    .endCode
                            .endFunction
                            .functionGetState
                                        .userFlags 0    ;Flags:0x00000000
                                        .docString "Function that returns the current state"
                                        .returnString
                                        .paramTable
                                        .endParamTable
                                        .localTable
                                        .endLocalTable
                                        .code
                                    Return::state                                 ;@line??
                                   .endCode
                            .endFunction
                        .endState
                .endStateTable
        .endObject

Просмотрел? Увидел строку

CallStatic debug MessageBox ::nonevar "Привет, мир!" ;@line 6

Это и есть интересующее нас место. Что тут менять - это и ежу понятно: "Привет мир!" (кавычки сохраняем - они - техническая часть текста)

Ну поменяли. А что дальше? Да всё просто - ассемблируем!

  • стираем из имени файла участок .disassemble
  • и пишем всё то же, что и при дезассемблировании, только без ключа -D :

"%gamedir%\Papyrus Compiler\PapyrusAssembler" <имя интересующего нас pex файла, только без расширения>

Если всё введено правильно то программа выдаст:

0 error(s), 0 warning(s)
Assembly succeeded

И создаст вожделенный .pex файл, который, ну, используем по назначению.  Всё! Скачать описание: в помощь переводчику.zip

И ещё по одной...

PapyrusAssembler

Использование: PapyrusAssembler файл [-D] [-V] [-Q] [-A] [-S] [-?]

Файл имя файла (путь берётся только из "рабочей папки", больше никак), который будет скомпилирован или декомпилирован. файл должен указыватся без расширения! Компилятор ищет файл с расширением ".pas". Декомпилятор ищет расширение ".pex". Внимание! декомпиляция не происходит, если имя файла скрипта не совпадает со стокой, начинающейся с байта 0Х12h в теле скрипта! (в нормальном состоянии строка дублирует имя файла)

  • -D Дезассемблировать объект, если не указан - ассемблирует его.
  • -V Включить подробный режим. (выводит туеву хучу всякой техинфы)
  • -Q Включает тихий режим. (выводятся только сообжения об ошибках)
  • -A Только анализ. Ассемблирование/дезассемблирование не производится.
  • -S Удаляет отладочную информацию из скомпилированного (.pex) файла. Нельзя использовать с -A или -D
  • -? Выводит справочную информацию

PapyrusCompiler

Использование: PapyrusCompiler <файл или папка> [<аргументы>]

Объект

  • Файл Указывает файл для компиляции. (-all не указан)
  • папка Указывает папку для компиляции. (-all указан)

Аргументы

Один или несколько из следующих:

  • -debug -d Включает режим отладки компилятора, на экран выводится техническая информация.
  • -optimize -op Включает режим оптимизации кода скрипта.
  • -output -o=<путь к каталогу> Указвает каталог для записи скомпилированных скриптов.
  • -import -i=<путь к каталогу> Указвыает папки для импорта библиотек (тоже psc файлы) компилятором, разделённые ";". Обязателен для указания. Путь по умолчанию %gamedir%\data\scripts\source\
  • -flags -f=<путь к файлу> Указывает путь к файлу с флагами, определёнными пользователем. Обязателен для указания. "дефолтный" файл флагов лежит по пути %gamedir%\data\scripts\source\TESV_Papyrus_Flags.flg
  • -all -a Задаёт компилятору скомпилировать все psc файлы в заданной папке. (в качестве объекта должна быть заданна папка).
  • -quiet -q Тихий режим. Отображаются сообжения только об ошибках.
  • -noasm Ассемблер не вызывается и не производится ассемблирование скрипта. (короче только анализ)
  • -keepasm Сохраняет ассемблер файл после завершения работы ассембера. (сохраняет pas файл)
  • -asmonly Создаёт ассемблер файл, но не вызывает ассемблер. (создаёт pas файл, но не создаёт pex файл)
  • -? Выводит справочную информацию.

Файл TESV_Papyrus_Flags.flg (по умолчанию лежит в %gamedir%\data\scripts\source\TESV_Papyrus_Flags.flg.  Начинка по умолчанию и её описание:

/*
Формат строк задаётся следующим образом (пробелы игнорируются, index должен содержать 0 - 31 символов):
Flag // Флаг применяется для всех типов
или:
Flag { <список скриптов, параметров, переменных или функций> } // флаг применяется только для указанных типов
*/

// Список флагов для TESV - НЕ РЕДАКТИРОВАТЬ

// Флаг прячет скрипт или параметр от игрового редактора. (ну небось типа в редакторе не отображается)
Flag Hidden 0
{
Script
Property
}

// Флаг на объекте определяет его как скрипт, который будет рассматривать система состояний.
// Флаг на переменоой определяет переменную скрипта как исследуемую системой состояний.
// Сам нихера не понял, что это значит, но самый близкий перевод.
Flag Conditional 1
{
Script
Variable
}

Скачать описание: папирус-справка.zip
 
® Кащей tesall.ru

Автор: Пакость
5

Комментарии

Добавить комментарий

У меня неработает PapyrusComplier КОГДА Я ДЕЛАЮ ТОРГОВЦА пишу akSpeaker,ShowBarterMenu()  и сразу же вылетает папирус компилер

У меня неработает PapyrusComplier КОГДА Я ДЕЛАЮ ТОРГОВЦА пишу akSpeaker,ShowBarterMenu()  и сразу же вылетает папирус компилер

TESV_Papyrus_Flags.flg нужен

Авторизуйтесь, чтобы оставить новый комментарий. Или зарегистрируйтесь.