Реально крутой скриптинг - статья 2
Автор статьи: mordvin.
14 сентября 2006.
Реально крутой скриптинг.
В этих статьях я расскажу вам, как создавать миссии и не только к GTA:VC. Для SA всё немного сложнее, но я уверен, что вы сами разберётесь. Уже была статья с сайта gtazone.ru, но 1) неудобный общий код 2) неясность того, что же именно писать в одной из меток сподвигла меня на статьи.
СТАТЬЯ 2.
Структура миссий.
Вы должны иметь представление, что такое thread и как они запускаются. И как миссии определяются и запускаются. Но миссии устроены иначе.
Одновременно должна работать только одна миссия, запущенная только один раз (без параллельности). Миссии имеют свои свойства.
Будучи убит или арестован во время миссии, выполняется код return, даже если его нет. Если вы напишете код миссии:
;---mission 1----
;Test mission
:ToMis1St
018A: $m = create checkpoint at -1492.5 -996.0 20.0
:M1_chkEnd
0001: wait 0 ms
00D6: if 1
00F7: player $PLAYER_CHAR 0 ()near point in car -1492.5 -996.0 20.0 radius 15.0 15.0 15.0
004D: jump_if_false ЈM1_chkEnd
004E: end_thread
и умрёте, не доехав, то и выполнится код return. А так как процедуры нет, игра начнёт глючить. А именно весь мейн пойдёт заново, появится новый игрок и т. д.
(то же самое будет, если вы сделаете так:
;---mission 1----
;Test mission
:ToMis1St
0051: return
)
Прим. авт. (а чь. ж. ещ.?): круто я скобки поставил. Сразу чувствуется программист.
Поэтому настоятельно рекомендую пользоваться схемой, ниженапечатанной:
:CodeStart
0317: increment mission attempts
00BE: text_clear_all
03A4: name thread "M"
054C: use GXT table "GXT_T"
0004: $ONMISSION = 1 ;; integer values
016A: fade 0 () 500 ms
00BA: text_styled "nazv" 4000 ms 2 ;; название
02A3: toggle_widescreen 1 (on)
01B4: set player $PLAYER_CHAR frozen state 0 (frozen)
03BF: set player $PLAYER_CHAR ignored by everyone to 1 (true)
01F7: set player $PLAYER_CHAR ignored by cops state to 1 (true)
0394: play_music 1
01E3: text_1number_styled "M_PASS" 5000 ms 1 ;; МИССИЯ ПРОЙДЕНА! $~1~
030C: set mission points += 1
0318: set latest mission passed "nazv" ;; название
0109: player $PLAYER_CHAR money +=
0051: return
Копируем схему в билдер, выделяем, проводим ряд замен. В окошке "Поиск и замена" каждый раз ставим Replace In Selection.
Что заменять - чем заменять
название - ну, как ваша миссия называется
- номер миссии
GXT_T - GXT - таблица, где хранятся языковые ключи вашей миссии
nazv - имя ключа обязательно в таблице Main, в котором хранится название миссии
- целочисленная сумма денег, которую дают за миссию.
:ToMis0St ;; метка начала, описана в define missions
0050: gosub ЈCodeStart0 ;; идём в процедуру кода миссии. Когда вернулись, то
00D6: if 0
0112: wasted_or_busted ;; сразу проверили: вдруг замочили ненароком или арестовали.
004D: jump_if_false ЈToSkipFail0
0050: gosub ЈFail0ByWOB ;; если так, идём в Fail0ByWOB, где написано, что провалена
:ToSkipFail0
0050: gosub ЈM0_cleanup ;; теперь идём в метку очистки
004E: end_thread ;; и заканчиваем миссию
:CodeStart0
0317: increment mission attempts ;; увеличиваем попытки миссии
00BE: text_clear_all ;; стираем текст с экрана
03A4: name thread "M0"
054C: use GXT table "TAXICUT" ;; это просто так, я в GXT текст не вставил.
0004: $ONMISSION = 1 ;; integer values ;; мол, на миссии
016A: fade 0 () 500 ms ;; гасим экран
00BA: text_styled "..." 4000 ms 2 ;; Учебная миссия - название жёлтыми буквами
02A3: toggle_widescreen 1 (on)
01B4: set player $PLAYER_CHAR frozen state 0 (frozen)
03BF: set player $PLAYER_CHAR ignored by everyone to 1 (true)
01F7: set player $PLAYER_CHAR ignored by cops state to 1 (true) ;; эти четыре команды переводят игрока в неуправлямый режим. Сами разберёте каждую из них
;; Здесь у нас будет код миссии. Читайте ниже, как его писать
0394: play_music 1 ;; Звуковой проигрыш
01E3: text_1number_styled "M_PASS" 2000 5000 ms 1 ;; МИССИЯ ПРОЙДЕНА! $~1~
030C: set mission points += 1 ; +очки миссий
0318: set latest mission passed "..." ;; Учебная миссия - установка текста для сохранялки
0109: player $PLAYER_CHAR money += 2000 ;; деньги
0051: return ;; возвращаемся.
:Fail0ByWOB
00BA: text_styled "M_FAIL" 4000 ms 1 ;; МИССИЯ ПРОВАЛЕНА!
;004F: create thread ЈЈmission0 ;; раскомментируйте строку и впишите имя потока, когда тот будет готов для перезапуска миссии в случае провала.
0051: return
:M0_cleanup ;; метка очистки
;; команды здесь должны стереть всех созданных актёров (remove_references тоже сгодится), машины, объекты, маркеры, выгрузить модели всё такое прочее.
А теперь перейдём к самому сочному - что именно, как, какими методами писать в ;; Здесь у нас будет код миссии. Совсем скоро вы такое заделаете, что у всех остальных скриптеров от зависти руки зачешутся скачать эту статью.