BW's Vice Mission Builder
Описание интерфейса программы BW's Vice Mission Builder. (Я ретроман.) Пишу
руководство по версии 1.5. Если у вас есть более новая,
ничего страшного. Возможности старого есть и в новом.
Интерфейс основан на специальной
платформе что ли, я точно не знаю, называется PowerBasic
IDE. Многие из опций связаны с ним, но не употреблены.
Строка меню (описываю не все команды, а только нужные
на мой взгляд!):
File
New File... (Ctrl-N) - создать новый файл
Open File... (Ctrl-O) - открыть текстовый файл или
декомпилировать scm (name.scm --> name.scm.txt,
name.txt.scm --> name.txt в той же папке)
Insert File... (Ctrl-I) - вставить содержимое текстового
файла
Save (Ctrl-S) - сохранить текущий файл
Save As... (Ctrl-A) - сохранить текущий файл
под новым именем
Close File - закрыть файл
Close All - закрыть все файлы
Print File... - распечатать файл
Recent Files (всегда использую) - список последних
файлов для открытия
Exit (Alt-F4) - выйти из программы
Edit
Undo (Ctrl-Z) - отмена изменений
Redo (Ctrl-D) - возврат изменений
Remark Text - выделенные строки спереди снабжаются ; и
пробелом, считаясь комментариями (программа игнорирует).
Повторное действие - снятие комментария. Полезно для
временного отключения команд.
Cut (Ctrl-X) - вырезать выделенный текст в карман
Copy (Ctrl-C) - копировать выделенный текст в карман
Paste (Ctrl-V) - вставить текст из кармана
на место курсора/выделения.
Select All (Ctrl-A) - выделить целиком весь текст.
Не знаю почему, но указанная в меню клавиатурная
комбинация у меня не работает. Впрочем, это не настолько часто
используемая опция.
Find... (Alt-F3) - открыть окно поиска
Find Next (F3) - продолжить поиск последнего запроса
окна поиска вниз от положения курсора
Find & Replace (Ctrl-Alt-F3) - открыть окно поиска и замены
Go To Line (Ctrl-G) - перейти на строку под указанным номером
Compiler - настоятельно не рекомендую изменять что-либо в этом
меню, но всё же опишу.
Show Report When Compiling Successful - показывать отчёт
о завершении компиляции. Рекомендую использовать.
Disable/Enable Custom IDs when decompiling -
отключить/включить замену цифр идентификаторами людей, машин,
оружия, объектов (см. далее). Не рекомендую отключать.
Source Converter - преобразовать код в текущую версию
компилятора, если возможно.
If commands check - проверка правильности написания параметра
в опкоде условия. Некоторые советуют отключать, чтобы быстрее ком-
пилировалось. Я не отключаю, так как не уверен в том, что написал
всё правильно. Некоторые отключают, так как не знают, как писать
правильно. Изучите мои статьи и поймёте. Отключать не надо.
Duplicate Labels Check - проверка, существуют ли разные метки
(это такие указатели для перехода) с одинаковыми номерами. Повторяюсь,
я и здесь не уверен, что не повторюсь в метках, поэтому опцию держу
включенной. И не зря.
Window - команды для выстраивания окон документов. Также
их список с возможностью перехода.
Run
Compile (F7) - скомпилировать текущий файл
(name.txt --> name.txt.scm, name.scm.txt --> name.scm)
в его директорию.
Compile & Copy (F6) - скомпилировать текущий файл в его
директорию и создать копию под именем main.scm в подпапке
data папки игры, адрес которой программа спросит при первом запуске.
Run Grand Theft Auto Vice (F8) - запустить игру
(gta-vc.exe)
Compile Copy & Run GTA Vice (F9) - скомпилировать текущий
файл в его директорию и создать копию под именем main.scm
в подпапке data папки игры, после чего запустить игру.
Tools
Color Picker - выбрать цвет в палите и вставить в текст
в виде RGB(красный, зелёный, синий). Нужно будет для некоторых опкодов, где указывается цвет, но синтаксис в них другой. Но нам-то нужны цифры.
Macros - возможность ввести несколько строковых значений и вставлять их в текст с помощью горячих клавиш Ctrl+номер макроса.
Help - вывод файла ReadMe.txt билдера.
Панель инструментов.
Пройдитесь мышью по ней. Кнопки повторяются в меню.
Их удобнее использовать.
Открытые файлы.
Правый щелчок мышью по заголовку - данные о файле.
Сам код - это декомпилированные текстовые данные.
Код - из нескольких частей:
DEFINE VERSION VICE 1.5 ;; версия компилятора
0002: jump ЈЈSecondSegment
DEFINE MEMORY 34329 ;; память. Не знаете - не меняйте.
:SecondSegment
0002: jump ЈЈThirdSegment
DEFINE OBJECTS 3 ;; количество 3D-объектов, повязанных на мейне - N (см. "Класс Object") плюс один.
DEFINE OBJECT (no name) ;; This is an unused object. You can put anything here.
DEFINE OBJECT FAKETARGET ;; их таблица из N строк, каждая из которых DEFINE OBJECT
DEFINE OBJECT BARREL2
:ThirdSegment
0002: jump ЈЈLabelMAIN
DEFINE MISSIONS 1 ;; это описание количества потоков типа Missions (к которым относятся не только сами миссии, но и другие. В дальнейшем под термином "метапоток" подразумевается именно такой поток). Свойства метапотоков мы обсудим позже.
DEFINE MISSION 0 at ЈЈStartM1 ; номер метапотока, метка начала.
;; Здесь начинается управляющий поток (thread).
;-------------MAIN---------------
;Вы можете видеть ниже структуру команд. Сначала идёт опкод - 4 16-ричных
;цифры (в это множество относятся цифры от 0 до 9 и латинские буквы
;A, B, C, D, E, F). Потом двоеточие и набор параметров (разделённых символами
;и пробелами. Символы без кавычек и указателей служат только для программиста.
;Программа их игнорирует, смотрит только на опкоды, определяющие суть команды)
;Параметры также называются аргументами. Основаны на числах,
;строках и переменных
;Любые локальные переменные выглядят как @.
;В каждом потоке или метапотоке у них может быть своё значение.
;Любые глобальные переменные выглядят как $
;(напр., $mashina, $chislo, $PLAYER_ACTOR).
;В любом потоке или метапотоке у них одно и то же значение.
;Изменяются только во времени.
:LabelMAIN ; это метка. Метки в месте, где стоят, выглядят как :
03A4: name_thread "MAIN" ; этой командой начальному потоку присваивается имя "MAIN"
016A: fade 0 () 0 ms ;; этой командой экран затемняется
01F0: set_max_wanted_level_to 6 ;; максимальные звёзды розыска
0111: set_wasted_busted_check_to 0 (disabled) ;; НЕ МЕНЯТЬ!!!
00C0: set_current_time_hours 5 minutes 0 ;; Время при запуске
0180: set on mission flag to $ONMISSION ;; НЕ МЕНЯТЬ!!!
030D: set_total_mission_points_to 20 ;; Количество макс. очков миссий. При выполнении миссий они увеличиваются (для чего есть специальная команда., см. ниже). Отношение набранных к максимуму есть процент выполнения в игре (percentage completed в статистике)
04E4: unknown_refresh_game_renderer_at -1532.524 -625.5527; Первые две координаты старта
03CB: set_camera -1532.524 -625.5527 14.46319
0053: $PLAYER_CHAR = create_player #NULL at -1532.524 -625.5527 14.46319; В этой и предыдущей команде - все 3 координаты старта, этой командой числу, указывающему на игрока, сопоставляется переменная $PLAYER_CHAR, а сам игрок создаётся по указанным координатам
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR ;Создаётся ($PLAYER_CHAR) ссылка на актёра, который является игроком. Об актёрах см. ниже
0001: wait 0 ms ; ждать 0 миллисекунд. Используется для противостояния зависаниям.
01B6: set_weather 0 ;; погода по умолчанию. См. справочник
00D6: if 0
8118: NOT actor $PLAYER_ACTOR dead
004D: jump_if_false ЈЈLabelMAIN2
0352: set_actor $PLAYER_ACTOR skin_to "PLAYER"
038B: load_requested_models
0353: refresh_actor $PLAYER_ACTOR
:LabelMAIN2
016A: fade 1 (back) 1000 ms ; осветление экрана в течение 1000 миллисекунд.
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ЈЈLabelMAIN3
04BB: select_interiour 0 ;; select render area - интерьер по умолчанию
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
01B7: release_weather
;; Предыдущими командами мы выполнили инициализацию игрока.
;; Следующими мы начнём потоки:
004F: create thread ЈЈToSP
;(их тут может быть много)
;; И замкнём управляющий в бесконечный цикл:
:LabelMAIN3
0001: wait 2500 ms
0002: jump ЈЈLabelMAIN3 ; эта команда указывает, что нужно перейти в этом же потоке на метку LabelMAIN3.
:ToSP
0001: wait 0 ms
0417: start_mission 0
004E: end_thread
:StartM1
0001: wait 0 ms
016A: fade 0 () 2000 ms ;; экран затемняется в течение 2 с
0001: wait 2000 ms ;; ждать 2 с
016A: fade 1 () 2000 ms ;; экран начинает осветляться
004E: end_thread ;; Метапоток вырубается.
Так устроен простейший MAIN. Давайте разберёмся,
как он работает.
Сначала устанавливаются основные параметры - время запуска,
переменная $ONMISSION (она имеет два целых значения - 0 (по
умолчанию) и 1),
"очки (не линзы, а баллы) миссий".
Потом по неким координатам
(04E4: unknown_refresh_game_renderer_at -1532.524 -625.5527)
идёт быстрая прорисовка местности.
В принципе, прорисовка местности начинается автоматически
при размещении камеры, но эта команда ускоряет прорисовку.
Потом по заданным координатам появляется игрок и ему
присваиваются две хендл-переменных ($PLAYER_CHAR класса PLAYER
и $PLAYER_ACTOR класса actor).
Разберём, для чего это надо. Классы - некие наборы
хендл-объектов, которые имеют определённые свойства. Player
(игрок) - это только игрок.
Actor (актёр) - это уникальные люди, используемые
в миссиях, и многие другие.
Команды, в описаниях которых (1) стоит actor перед хендлом
(к примеру, 0239: actor $1036 run_to 65.8001 -1443.9999
- актёру бежать в заданную точку),
применяются к актёрам, а через переменную $player_actor
(2) - и к игроку.
К примеру, набор команд
0239: actor $anton run_to 65.8001 -1443.9999
0239: actor $strykov run_to 65.8001 -1443.9999
заставит бежать в точку с указанными координатами
актёров $anton и $strykov, а если к ним дописать такую:
0239: actor $PLAYER_ACTOR run_to 65.8001 -1443.9999
, то и игрок составит им компанию.
[Примечание 1: несмотря на игнорирование слов - непараметров,
без описаний скриптеру не сориентироваться. Описания хранятся
в файле opcodes.txt (в папке программы. Если я не буду
указывать, где лежит тот или иной файл - он в папке программы).
Можно вызвать опкод по описанию, как я всегда и пишу скрипты.
Нужно ввести описание и нажать F1, поставив на него курсор.
Можно то же самое проделать с опкодом и даже с параметром.
Подробнее об этом написано в описании файлов папки программы.]
[Примечание 2: регистр букв значения не имеет. Что $player_actor, что $PLAYER_ACTOR,
что $PlaYer_AcTOR - разницы нет. Как и между опкодами 004F и 004f.]
Теперь пропустим следующие строки с проверками, это вам не надо,
и перейдём к строке 004F: create thread ЈЈToSP. Будет найдена метка
:ToSP и параллельно потоку "main" будет создан ещё один.
Потоки работают одновременно, поэтому если после строки
создания потока будут другие, то и они запустятся.
И, пройдя метку :LabelMAIN3, игра начнёт зацикливать этот поток,
так как завершить его нельзя. Другие - можно, этот - нет.
В потоке, который мы создали, следующие команды:
0001: wait 0 ms ; ждать 0 мс
0417: start_mission 0 ; запустить метапоток 0
004E: end_thread ;чтобы завершить поток, используется эта команда
Где начинаются метапотоки, обычные заканчиваются. Это две части скрипта.
В таком языке, как, к примеру, Pascal принято начинать
каждый оператор с новой строки и выделять блоки отступами.
Есть подобные правила и в скриптинге, необязательные, но
очень желательные.
Начало метапотоков показывают так:
;----------Missions---------
или
;----------Meta-------------
Начало каждого из них:
;----------Mission -------------
;
Если вам надо быстро найти метку метапотока, то в окне поиска
лучше всего ввести:
-[-]
К примеру, 5-, 0--, 1-.
После нуля -- ставится потому, что по 0- может найтись
команда 03C8: rotate_player-180-degrees.
Метапотоки имеют свои свойства, их мы рассмотрим позже.
Здесь же работа единственного метапотока описана.