Расстановка машин, пикапов и пр.
by ScrewBoy
Wednesday 07 April 2004 - 06:12:41
В этом учебнике я попробую затронуть все аспекты скриптинга для Vice City(дальше - вайс) насколько могу. Ну ладно, начнем! Если ты еще не скачал builder (в дальнейшем просто билдер), то тебе следует прогулятся в наш файловый архив . Теперь я думаю можно начинать. Запускай билдер, выбирай File->Open File и выбирай файл main.scm который лежит в папке data в директории с игрой. Подожди немного пока файл декомпилируется. Итак, ты увидел множество циферок, ну пугайся щас в общем, на примере одной команды, я опишу структуру команд билдера:
00A1: put_actor $my_actor at - перенос NPC в точку с координатоми x, y и z
00A1 - это так называемый opcode (в дальнейшем просто опкод), он указывает игре что собственно говоря делать, у некоторых опкодов есть параметры, но о них позже.
put_actor и at - это зарезервированные слова, они существует только для скриптера, билдер же их почти игнорирует, то есть если мы напишем
00A1: $my_actor
то разницы никакой не будет, эти слова созданы для удобства
$my_actor - это первый параметр в этой команде, он является указателем на актера, которого создали раньше (но об создании актеров чуть позже).
и - тоже параметры, могуть быть как переменными так и значением, но обязательно должны быть дробным числом, то есть если вы напишете
00A1: put_actor $my_actor at 100 200 10 то игра проигнорирует эту команду, правильно будет 00A1: put_actor $my_actor at 100.0 200.0 10.0
Так, тут, думаю, разобрались. Теперь поговорим о структуре скрипта.
Скрипт состоит из label (в дальнейшем лэйбл), thread'ов и миссий.
Лэйблы - самая простая единица иерархии в скрипте, используется как указатель для перехода от одной части скрипта к другой, то есть если мы напишем
0002: jump J то все что следует после этой команды проигнорируется и пойдет действие после строчки
:
или если написать 0050: gosub J, то действие данного лэйбла остановиться, далее выполниться все что указано в лэйбле и затем действие снова вернется к тому что идет поcле 0050: gosub J
Если что не ясно, задавайте вопросы на форуме. Далее идут thread, я не знаю как их назвать по русски поэтому и буду назвать thread'ами. Они используются для создания паралельных основному скрипту действий. Например, спидометр сделан как thread. Thread создается командой 004F: create_thread ЈЈ, где - имя лэйбла, откуда начинаются команды данного thread. Команду create_thread лучше всего использовать в самом начале скрипта. Найдите подобные команды. Так же thread можно назвать. Это делается командой 03A4: name_thread "". Чтобы завершить выполнение thread до его логического конца, используется команда 004E: end_thread. Так же thread можно завершить из другого thread. Делается это командой 0459: end thread named "", где - имя того thread, который вы хотите завершить. Сами thread лучше писать над строчкой -------Mission 0--------, это если в оригинальном файле.
Thread может состоять из нескольких лэйблов, а вот миссия, которая сама по себе является огромным thread, может состоять из нескольких thread.
Миссии начинаеют не как thread, для начала нужно описать, какой по счету миссии относится какой лэйбл. Делается это почти в самом начале скрипта:
DEFINE MISSION 1 JJ
Но миссия только объявлена, нужно ее еще начать. Делается это командой 0417: start_mission 1
Но написание миссий - самая сложная часть скрипта, так что пока отложим ее, а перейдем к тем вопросам, которые очень часто задают на форумах:
1) Как сделать припаркованную машину
2) Как сделать сердечко, бронижилет, оружие и тп.
Чтобы сделать припаркованную машину, нужно найти в скрипте строчки вроде
014B: $my_car = init_parked_car_generator #ADMIRAL 8 8 0 alarm 50 door_lock 0 0 10000 at -401.2715 -534.6655 11.7534 angle 149.2032
014C: set_parked_car_generator $my_car cars_to_generate_to 101
Разберем эти две команды подробно. Для начала первую
014B: $my_car = init_parked_car_generator #ADMIRAL 8 8 0 alarm 50 door_lock 0 0 10000 at -401.2 -534.6 11.7 angle 149.2032
$my_car - идентификатор, может быть любой, только не должен повторяться
init_parked_car_generator, alarm, door_lock, at, angle - зарезервированные слова
#ADMIRAL - показывает какая машина должна быть припаркована, для правильного описания посмотрите в блокноте файл default.ide, там есть точные описания ID машин.
Цифры 8 8 обозначают цвет машины в формате игры. Цифра 50 после слова alarm показывает возможность установки сигнализации на машине. Цифра 0 после слова door_lock показывает какова возможность того, что дверь машины будет закрыта (0 всегда открыта, 50 - каждое второе появление машина будет закрыта).
Цифра 0 после lock 0 и перед 10000 указывает будут ли менты реагировать на то, угнали ли вы машину или нет (1 - не будут, 0 - будут). Цифра 10000 указывает цену машины. В VC вещь ненужная, но, похоже, осталась от GTA3. После слова at идут координаты x y z, причем в ПРАВИЛЬНОМ формате. После слова angle идет угол поворота машины в градусах относительно севера против часовой стрелки, по есть если вы встанете так, что буква N на радаре будет строго наверху, то тогда угол равен 0.
Далее вторая команда, она показывает насколько часто там эта машина появялется, то есть это показывает цифра 101 (101 - всегда, 0 - никогда).
Для примера, давайте создадим припаркованный инфернус перед клубом малибу, с сигнализацией 50
014B: $my_car = init_parked_car_generator #INFERNUS 8 8 0 alarm 50 door_lock 0 0 10000 at 499.8 -95.3 10.4 angle 90.0
014C: set_parked_car_generator $my_car cars_to_generate_to 101
Нажимайте клавишу F9 и начинайте !!!новую игру!!! При ЛЮБОМ изменении нужно начинать новую игру, даже если вы просто изменили одну цифру.
Потренеруйтесь в добавлении машин, меняйте марки машин, координаты и тд...
Теперь перейдем к созданию сердечек, оружия, бронижилетов и тп...
Все, что в игре можно поднять называется pickup (далее - пикап). Начнем с сердечка. Делается это командой:
0213: $heart_pickup = create_pickup -86 (HEALTH) type 15 at -113.2 -975.7 10.4
Разберем параметры этой команды. -86 показывает какой именно объект создается, в скобках расшифровка этой цифры, но она существует только для скриптера, то есть если вы напишете create_pickup -86 (YA_KRUTOY_KODER), то все равно создадиться сердечко. Далее, после слова type, следует тип пикапа. Бывают следующие типы:
1 - за деньги, (цены кажется от GTA3), регенерируется почти сразу
2 - бесплатно, регенерация 30 минут игрового времени, надо отойти недалеко
3 - бесплатно, одноразовый (инфо-пикапы создаются с этим типом)
9 - бомба, активируется когда Томми садится в машину, взрывается через 10 минут игрового времени, или раньше при наезде машиной
11 - тоже бомба, но рвет через 10 минут после появления, или раньше если наехать машиной
15 - эти регенерятся через 6 часов игрового времени
В данном случае я использовал тип 15. Ну и как вы поняли, после слова at идут координаты. Бронежилет, адреналин, звездочка от ментов и значок "i" (инфо пикап) создаются той же командой, только вместо -86 ставиться:
-18 для бронижилета
-87 для адреналина
-4 для звездочки от ментов
-7 для инфо-пикапа
-17 для значка кассеты (значок сохранения, это просто значок, для сохранения есть другая команда)
Чтобы вставить какой-либо пикап в игру нужно найти похожий пикап и вставить свой выше. Теперь расставим оружие. Команды для рукопашного и стрелкового оружия отличаются, мы разберем обе команды.
Для рукопашного оружия импользуется команда
0213: $2035 = create_pickup #brassknuckle type 2 at 30.0 -1330.9 13.0 где #brassknuckle - тип оружия. Может быть
#brassknuckle - кастет
#screwdriver - отвертка
#golfclub - клюшка для гольфа
#nitestick - ментовская дубинка
#knifecur - ножик
#bat - бейсбольная бита
#hammer - молоток
#cleaver - мясной топорик
#machete - мачете
#katana - катана
#chnsaw -бензопила
Думаю, остальные параметры команды понятны. А вот чтобы создать огнестрельное оружие нужно использовать команду
032B: $2000 = create_weapon_pickup #COLT45 15 ammo 34 at -228.4 -1318.2 9.1 Где #COLT45 - тип оружия. Может быть
#grenade - граната
#teargas -слезоточивый газ
#molotov - коктель молотова (для тех, кто не знает - бутылка с зажигательной смесью)
#colt45 - кольт
#python - револьвер
#chromegun - дробовик
#shotgspa - скорострельный дробовик
#buddyshot - обрез
#tec9 - пистолет-пулемет tec9
#uzi - пистолет-пулемет uzi
#ingramsl - инграм с глушителем
#mp5lng - пистолет-пулемет mp5, известный по игре Counter-Strike как 3.1
#m4 - м4
#ruger - Ругер
#rocketla - гранатомет
#flame - огнемет
#M60 - пулемет M60
#minigun - шестистволка
#sniper - снайперская винтовка
#laser - снайперская винтовка с лазерными прицелом
Число 15 - тип пикапа, о которых говорилось выше. После слова ammo идет количество патронов в пикапе. Но, думаю, лучше всего для пикапов и тачек создать свой thread. Заодно и потренеруемся в создании thread. Для начала найдите строку -------------Mission 0--------------- и над ней пишите
ickTest
0001: wait 0 ms
0213: $heart = create_pickup -86 (HEART) type 15 at 492.5 -95.2 10.4
0213: $armor = create_pickup -18 (BODYARMOR) type 15 at 490.0 -95.2 10.4
0213: $katana = create_pickup #katana type 15 at 486.8 -95.2 10.4
032B: $m4 = create_weapon_pickup #m4 15 ammo 60 at 482.8 -95.2 10.4
004E: end_thread
Затем найдите строчку 0417: start_mission 0 и над ней напишите это:
004F: create_thread ЈЈPickTest
004F: create_thread ЈЈCarTest
То, что мы сейчас сделали создаст пикапы сердечка, бронижилета, катаны и м4 возле малибу. Там же будет стоять инфернус. Добавляйте в соответствующие thread свои пикапы и машины. На этом я завершаю первую главу учебника. В следующей главе вас ждет материал о созданни собственных актеров и уникальных машин.