Потоки, миссии, внешние скрипты

Как и в Sanny Builder, мы "разбиваем" наш код на отдельные части, именуемые как "Поток", "Миссия" и "Внешний скрипт". Чтобы генератор знал что где находится, используются атрибуты, которые устанавливаются к методам. Первым методом с атрибутом должен всегда быть поток с именем "MAIN". Ниже в коде мы можем писать методы в произвольном порядке. Методы должны быть открытыми ( public ), не возвращать или принимать параметров, не должны быть "static" или "abstract".

Атрибуты "Thread", "Mission" и "External" будут частью MAIN.SCM. Все другие методы будут игнорироваться при генерации. Ниже я привёл пример того, как "разбить" скрипт на отдельные его составляющие:

using GTA;
using GTA.SA;

namespace demo_app {

    public sealed partial class MAIN_SCM : Script {

        [Thread]
        public void MAIN() { // Первым потоком ВСЕГДА должен быть метод с именем "MAIN"
            end_thread();
        }

        [Thread]
        public void SAVEGM() {
            end_thread();
        }

        [External]
        public void EXR() {
            end_thread();
        }

        [Mission]
        public void MYMISS() {
            // end_thread(); // здесь не нужно!
        }
		
        [Mission( false )]
        public void MYMIS1() {
            end_thread(); // здесь нужно!
        }

    }

}

Если мы скомпилируем приложение ( Клавиша F5 ), то на выходе будем иметь следующий код:

DEFINE OBJECTS 0

DEFINE MISSIONS 2
DEFINE MISSION 0 AT @MYMISS // 0
DEFINE MISSION 1 AT @MYMIS1 // 1

DEFINE EXTERNAL_SCRIPTS 1 // Use -1 in order not to compile AAA script
DEFINE SCRIPT EXR AT @EXR_LOOPING_ERROR_SKIP // 0

DEFINE UNKNOWN_EMPTY_SEGMENT 0

DEFINE UNKNOWN_THREADS_MEMORY 2048

//------------- MAIN ---------------

:MAIN
03A4: name_thread 'MAIN'
0180: set_on_mission_flag_to $409 // Note: your missions have to use the variable defined here
0004: $14 = 250 // $ = ? (int)
0914: register_streamed_script_internal 0
004E: end_thread

//------------- SAVEGM ---------------

:SAVEGM
03A4: name_thread 'SAVEGM'
004E: end_thread

//------------- Mission: MYMISS (0) ---------------

:MYMISS
03A4: name_thread 'MYMISS'
0050: gosub @MYMISS_START
00D6: if
0112:     wasted_or_busted // mission only
004D: jump_if_false @MYMISS_END
0050: gosub @MYMISS_FAILED

:MYMISS_END
0004: $409 = 0 // $ = ? (int)
00D8: mission_cleanup
004E: end_thread

:MYMISS_START
0317: increment_mission_attempts
0004: $409 = 1 // $ = ? (int)

:MYMISS_PASSED
0050: gosub @MYMISS_CLEAR
0051: return

:MYMISS_FAILED
0050: gosub @MYMISS_CLEAR
0051: return

:MYMISS_CLEAR
0051: return

//------------- Mission: MYMIS1 (1) ---------------

:MYMIS1
03A4: name_thread 'MYMIS1'
004E: end_thread

//------------- External script: EXR (0) ---------------

:EXR_LOOPING_ERROR_SKIP
03A4: name_thread 'EXR'

:EXR
004E: end_thread

Как видим, мы написали небольшие участки кода и в итоге всё "это" сгенерировало код для MAIN.SCM, который очень нудно и долго набирать или копировать вручную в Sanny Builder. Особенно для миссий :) В этом и суть генератора - избавить нас от рутины.

Главный поток генерирует дополнительную информацию в начале - это переменная для состояния мисии, время задержки по-умолчанию и регистрирует все внешние скрипты. Другие потоки создают только метку и дают название скрипту. Конец скриптов нужно вручную завершать командой "end_thread()". Внешние скрипты имеют начальную метку с другим названием, чтобы предотвратить ошибку "Переход на нулевой оффсет".

Миссии имеют два варинта генерации: "классический" и "кастомный". Первый вариант ( он по-умолчанию ) генерирует код, который уже имеет реализацию и требует только написать условия провала и победы. "Кастомный" позволяет написать миссию на основе потока. Для его генерации нужно в атрибуте указать в круглый скобках "false".

Таким образом Вы можете добавить требуемое количество скриптов. В случае, если лимит на скрипты будет превышен или в ходе выполнения была допущена ошибка, генерация кода прекратится и будет показано сообщение о том, где была ошибка и её суть.

P.S. Внешние скрипты не используются в GTA III и VC.