Додаткові файли до статті
Lesson1.cdp (18.5 kb) - пакет з навчальним сценарієм.
Lesson1.gs (5 kB) - вихідний текст сценарію
SP3S1DCC.gs (27.7 kB) - вихідний текст сценарію Highland Valley (DCC)
WriteScript1.rar (90.6 kB) - архів з текстом статті для друку у форматі MS Word 97
Як писати скрипти для Trainz
частина 1
Як писати скрипти для Trainz
Це перша версія статті, розрахована в основному на тих, хто вже знайомий з програмуванням, оскільки я не буду пояснювати основних понять. Тобто, вважається, що ви вже маєте уявлення про те, що таке типи даних, процедури, функції, а також об'єктно-орієнтоване програмування. Всіх, хто вперше про це почув, я для початку відправляю до книг з мов програмування, де всі ці терміни пояснюються.
Скрипти для Trainz пишуться на внутрішньому мовою, який багато в чому схожий на такі мови програмування як C ++ або Java, хоча це свою власну мову фірми Auran. Вихідний файл скрипта-звичайний ASCII текстовий файл, якому за замовчуванням дається розширення .gs
З цього файлу за допомогою програми-компілятора gsc.exe виходить виконуваний файл з розширенням .gsc, який вже буде виконуватися в середовищі Trainz. Наскільки я зміг зрозуміти, в Trainz вбудований спеціальний багатопотоковий інтерпретатор. Багатопотоковий означає, що можна паралельно запустити кілька процесів, які будуть виконуватися незалежно один від одного. Наприклад, можна написати для кожного поїзда в вашому сценарії окремий потік, який буде повністю управляти його поведінкою, далі всі ці потоки запустити на виконання, і кожен з них буде виконуватися незалежно. Точніше, майже незалежно, оскільки многопоточность в Trainz, наскільки я з'ясував, імітується. Тобто, якщо всередині одного з потоків почати виконання якоїсь довгої процедури без виклику підпрограм очікування подій, наприклад, створення складів, то всі процеси, в тому числі основний гри, призупиняються до завершення цієї процедури.
Також хочеться зауважити, що отримується на виході файл .gsc містить не команди процесора, а внутрішній байт-код інтерпретатора Trainz.
Також в цьому каталозі лежить файл makescript.bat, який фірма Auran рекомендує скопіювати в той каталог, де ви будете писати скрипт, і запускати з його допомогою компіляцію. Цей файл містить наступні команди командного процесора ОС:
for %% a in (* .gs) do% gsc% %% a -i% include%
при цьому вважається, що ваш скрипт сценарію лежить в каталозі world \ custom \ scenarios \<имя сценария>\
Іншими словами, задаються дві змінних, в яких спочатку ми повертаємося до вихідного каталогу гри, а потім в першому випадку йдемо до файлу компілятора gsc.exe, який лежить в каталозі bin, а в другому прописується шлях до папки scripts, теж знаходиться в каталозі гри , де лежать файли заголовків до всіх внутрішніх об'єктів самої гри Trainz і на який ми будемо посилатися при написанні власних скриптів.
Рядок, яка починається з for, повторює виклик компілятора для всіх файлів, які перераховані в командному рядку після самого makescript.bat
В принципі, можна користуватися цим файлом, скопіювавши його в папку зі своїм скриптом сценарію, а можна і свій написати, якщо кому хочеться.
Якщо викликати програму gsc.exe без параметрів, то ви отримаєте на екрані наступний текст:
AURAN GameScript Compiler V1.01
gsc.exe returns number of compile errors
gsc.exe
where
<-d> print documentation, u might wanna pipe it to a text document =)
<-bfilename> dump the build info (compile log) to file
<-ppathname> output path
<-ofilename> output library filename
<-ipathname> additional include path
де наводиться цілком вичерпний опис синтаксису командного рядка і тих ключів, які можна задати програмі. В даний момент нас найбільше цікавить команда -d, яка дозволяє отримати документацію з мови програмування AURAN GameScript.
Просто наберіть в командному рядку наступне:
Gsc.exe -d> gsc.txt
Натисніть enter, і ви отримаєте в файлі gsc.txt повне і докладний опис синтаксису мови. Його бажано роздрукувати і перший час, поки звикнете з мовою, тримати під рукою. Правда, як і слід було очікувати, це опис знову англійською мовою. )
Короткий опис синтаксису мови AURAN GameScript
Зарезервовані слова мови докладно описані в gsc.txt, повторюватися не буду, там все і так зрозуміло.
Синтаксис основних операторів, в тому числі оператори умови, циклів, вибору скопійований з мови C, включаючи фігурні дужки, якими оформляються блоки коду. Тобто, хто не може зрозуміти опис у файлі gsc.txt беріть книжку з мови C або C ++ і розбирайтеся. Але відразу попереджаю, що потрібно все-таки в першу чергу орієнтуватися на файл gsc.txt, оскільки є деякі відмінності.
Ідентифікатори задаються стандартно, як і в багатьох інших мовах програмування. Будь-ідентифікатор повинен починатися з літери латинського алфавіту (A..Za..z_), або символу підкреслення, а далі можуть бути ті ж букви або цифри. Відразу хочу відзначити, що великі і маленькі букви вважаються РІЗНИМИ! Тобто, компілятор розрізняє РЕГІСТР, на відміну від багатьох інших мов програмування.
Типи даних, які підтримуються мовою
Void # 9; - порожній тип даних, який використовується тільки при описі функцій
Int # 9; - 32 бітове знакове ціле число
Float # 9; - 32 бітове число з плаваючою точкою
Bool # 9; - 32 бітний логічний тип, 0 - false або НЕ 0 - true (в загальному, як в C)
String # 9; - текстовий рядок
Object # 9; - об'єкт одного з оголошених в грі класів, при цьому, коли оголошуємо змінну, то пишемо, природно, ім'я класу, а не object, оскільки object є базовим класом, від якого породжуються всі інші
int [] # 9; - цілочисельний масив
float [] # 9; - масив чисел з плаваючою точкою
bool [] # 9; - масив логічних змінних
string [] # 9; - масив рядків
object [] # 9; - масив об'єктів
Як можна помітити, набір типів даних невеликий, але насправді цілком достатній для написання найскладніших скриптів. При цьому, на відміну від універсальних мов програмування, в AURAN GameScropt ми не можемо оголошувати нові базові типи даних, в тому числі структури або об'єднання, але можемо оголошувати нові класи, чого на практиці цілком достатньо.
Всі основні оператори мови, які можна використовувати у виразах, см в розділі 2.6 файлу gsc.txt. Вони багато в чому повторюють оператори мови C, а про деякі важливі відмінності я скажу трохи пізніше, коли будемо розбирати приклади.
Трохи хочеться зупинитися на моделі об'єктно-орієнтованого програмування, яку AURAN реалізувала в своїй мові.
По-перше, все оголошуються всередині класів функції є віртуальними. При цьому, якщо ви оголошуєте в класі-нащадку функцію з тим же ім'ям, то вона завжди автоматично перекриває функцію в класі-предка. Ніяких спеціальних вказівок робити не потрібно. Якщо ж вам потрібна незалежна функція, то просто пишемо її з новим ім'ям.
Також мова підтримує множинне успадкування, коли в якості предка для нового класу вказується відразу кілька класів-батьків. При цьому в новому класі будуть доступні всі поля і функції, які були у всіх предків разом (проводиться об'єднання).
Ну ладно, на цьому вступну частину закінчимо і перейдемо до безпосередньої розробки сценаріїв.
Необхідні файли і попередня підготовка
Bogeys # 9; # 9; - візки для рухомого складу
Engines # 9; # 9; - опис параметрів двигунів для локомотивів, в тому числі тягові характеристики
Enginesound # 9; - звуки роботи двигунів локомотивів залежать від поточної потужності
Ground # 9; # 9; - текстури поверхні
Hornsound # 9; - звуки сигналу локомотивів
Html # 9; # 9; - сторінки з html, правда, в урізаної версії для внутрішнього мінібраузер. Саме з його допомогою створюються складні діалоги, що дозволяють отримувати дані від користувача.
Pants # 9; # 9; - пантографи (струмознімачі) для електровозів
Products # 9; # 9; - продукти для нових індустріальних об'єктів. Те, що потім можна буде возити. Правда, там потрібно досить багато зробити, щоб воно запрацювало, включаючи самі об'єкти виробництва і прийому продуктів, а також вагони, які їх можуть перевозити.
Profiles # 9; # 9; - це так звані профілі гри - положення складів на карті. При цьому кожен профіль в своєму файлі config.txt буде посилатися на якусь із карт, наявних в Trainz.
Scenarios # 9; # 9; - ну а це якраз той каталог, який нам потрібен. ) Тут лежать сценарії.
Scenery # 9; # 9; - різні поодинокі об'єкти, які ми розміщуємо на карті.
Splines # 9; # 9; - різні сплайни, які ми можемо розмістити на карті. Тобто дороги, мости паркани, ЛЕП і т.д. за винятком тих, які містять ЖД-шляху
Track # 9; # 9; - а ось це вже самі ЖД-шляху і все, що містить ЖД-шляху.
Trackside # 9; # 9; - об'єкти, які розставляються уздовж ЖД-шляху, типу стрілок, світлофорів, знаків і т.д.
Trains # 9; # 9; - рухомий склад, тобто локомотиви і вагони
З усіх перерахованих вище розділів нас зараз цікавить в основному Scenarios, а також Maps, якщо сценарій робиться для власної карти.
Заходимо в каталог world \ custom \ scenarios (якщо його немає, то створюємо) і всередині його створюємо новий каталог, до якого даємо то ім'я, під яким ми хочемо наш сценарій потім побачити в самому Trainz. Наприклад, Lesson1. Перше, що ми повинні створити, це файл config.txt, який створюється для будь-якого об'єкта Trainz.
f7_sfred
> - кінець таблиці KUID
description "Lesson1 Trainz Script
Маркер служить тією точкою, на яку можна поставити поїзд з нашої програми. При цьому напрямок руху буде відповідати напрямку пірамідки. В принципі, кожному маркера або триггеру потрібно дати унікальне ім'я, причому таке, яке вам буде говорити про його призначення, щоб потім не плутатися під час написання програми. Також бажано привласнити осмислені імена всім стрілочних переводах, або хоча б тим, які задіяні в програмі. Для того, щоб задати ім'я, потрібно виділити кнопку зі знаком питання, а потім вибрати потрібний об'єкт на карті.
Тригер є службовим об'єктом, який може генерувати події в програмі, пов'язані з рухом поїзда. При цьому він може реагувати на входження поїзда в зону тригера, на зупинку поїзда в зоні тригера і на вихід поїзда з зони тригера. Зона тригера (радіус тригера) задаються за допомогою спеціальної кнопки, яка знаходиться на закладці advanced, на якій намальована двостороння стрілка. Можна також задати радіус тригера в числовий формі в метрах. Так, щоб відкрити сторінку advanced, потрібно натиснути на напис "advanced" внизу панелі, редагування шляхів (див. Малюнок).
Так, відразу хочу попередити, що навіть якщо у вас буде нормально працювати перемикання між Trainz і іншими програмами, в разі зміни сценарію ви не побачите їх в грі до тих пір, поки не перезавантажте Trainz, оскільки до виходу з програми сценарій буде лежати у Trainz у внутрішньому кеші.
З повагою,
Дмитро Мильніков