Как и в 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.