Внимание!

Форум находится в режиме Архива! Ответы в темах закрыты. Личные сообщения и пользователи сохранены.
Восстановлен исключительно из за информации, которая актуальна до сих пор

Скриптинг для OMSI

Различные вопросы и ответы на них.

Скриптинг для OMSI

Сообщение FRENZYMAX » 29 июл 2011, 21:38

Что-ж комраден, я долго не решался создать эту тему из-за отсутствия заинтересованных людей, но всё-таки желание поделится с народом инфой взяло верх.

Правила данной темы:
- Просьбы попрошаек типа "Cделайте мне XXX пли-ии-из !!!" будут удаляться !
- Просьбы научить тому или иному будут игнорироваться иили удаляться !

Всё остальное соответствует [url=http://omnibussimulator.ru/forum/topic_67/1#reply#post-2]правилам форума[/url]
Аватара пользователя
FRENZYMAX
Заяц
 
Сообщения: 439
Зарегистрирован: 25 ноя 2010, 22:54
Откуда: Teh Bearland

Скриптинг для OMSI

Сообщение FRENZYMAX » 29 июл 2011, 23:32

================================================================================


Миниатюрный хелп по скриптингу от FRENZYMAX

================================================================================



ВВЕДЕНИЕ

================================================================================



Wikipedia писал(а):Скриптовый язык (англ. scripting language, в русской литературе принято название язык сценариев) — язык программирования, разработанный для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере


Скрипты в OMSI применяются для создания [url=http://ru.wikipedia.org/wiki/Интерактивность]интерактивности[/url] окружающей среды, будь то это объект на карте, ИИ-трафик или автобус Игрока.
В OMSI используется оригинальный скриптовый язык, использующий [url=http://ru.wikipedia.org/wiki/Обратная_польская_запись]Обратную Польскую запись[/url] в связке со стеками.
================================================================================


Важный момент ! СЯ OMSI чувствителен к реестру !
================================================================================



Любой работоспособный скрипт обязан состоять из 2-4 файлов (в зависимости от скрипта):

1. ScriptСкрипт - Файл с кодом скрипта. Расширение - .osc
2. ConstfileКонстфайл - Файл со значениями константпостоянных. Расширение - txt
3. VarlistВарлист - Файл с полным списком переменных, использованных в скрипте. Расширение - txt
4. StringvarlistСтрингварлист - Файл со списком строковых переменных. Расширение - txt

Для корректной работы автобуса все файлы скриптов должны быть перечислены в cfg-файле объектаавтобусамашины (.SCO.BUS.OVH)
================================================================================


Важный момент ! При перечислении скриптовКонстфайловВарлистовСтрингварлистов в прописи мы должны указать их общее количество
================================================================================


Код: Выделить всё
    ////////////////////////////////////////////////////////

        Scripts
    ////////////////////////////////////////////////////////


[varnamelist] <= Прописываем Варлисты
20 <= Общее количество прописанных файлов
scriptCollision_varlist.txt <= Путь к файлу и его имя с указанием расширения

[stringvarnamelist] <= Прописываем Стрингварлисты
3 <= Общее количество прописанных файлов
scriptIBIS_stringvarlist.txt <= Путь к файлу и его имя с указанием расширения

[script] <= Прописываем Скрипты
23 <= Общее количество прописанных файлов
scriptman_sd80_main.osc <= Путь к файлу и его имя с указанием расширения

[constfile] <= Прописываем Констфайлы
17 <= Общее количество прописанных файлов
scriptcollision_constfile.txt <= Путь к файлу и его имя с указанием расширения


================================================================================


СОВЕТ
================================================================================


Для редактирования скриптов подходит любой текстовый редактор. Лично я советую Notepad++ т.к. он может менять кодировку текста на ISO 8859-2, что позволяет читать закомментированные аннотации авторов скрипта + много других полезных плюшек необходимых для комфортной работы. В принципе область применения Notepad++ не заканчивается на скриптах. Всюду, где есть заботливо оставленные разрабами аннотации на неподдерживаемом руской виндой немецком языке можно шарить Notepad++ и копировать нормальные тексты в гугль-переводчик[/QUOTE]

================================================================================



================================================================================



КОМАНДЫ & ОПЕРАТОРЫ

================================================================================


МАТЕМАТИЧЕСКИЕ
================================================================================



+ = Сложение
- = Вычитаение
* = Умножение
/ = Деление
% = Остаток от деления
/-/ = Смена знака на противоположный
sin = Синус
min = Минимум
max = Максимум
exp = Экспонента (???)
sqrt = Корень квадратный
sqr = Возведение в квадрат
sgn = Вернуться на знак (???)
pi = Число пи (3,14)
random = Случайное число (???)
abs = Абсолютное значение (???)
trunc = Округление до ближайшего целого числа

================================================================================


СРАВНЕНИЕ
================================================================================



= = Равно
$= = То-же для строковых переменных
< = Меньше
$< = То-же для строковых переменных
> = Больше
$> = То-же для строковых переменных
<= = Меньше или равно
$<= = То-же для строковых переменных
>= = Больше или равно
$>= = То-же для строковых переменных

================================================================================


СТРОКОВЫЕ ПЕРЕМЕННЫЕSTRING
================================================================================



" " = Форма ввода строковой переменной
$+ = Сложение строковых переменных ("Omnibus" "simulator" $+ получится "Omnibussimulator" )
$* = Умножение строковых переменных ("nu" 6 $* получится "nununu" )
$length = Количество символов в строке
$cutBegin = (???)
$cutEnd = (???)
$SetLengthR = (???)
$SetLengthL = (???)
$IntToStr = (???)
$IntToStrEnh = (???)
$StrToFloat = (???)

================================================================================


ЛОГИЧЕСКИЕ
================================================================================



&& = И
|| = ИЛИ
! = НЕ

================================================================================


ОПЕРАЦИИ СО СТЕКАМИ*
================================================================================



%stackdump% =
s0, s1, ..., s7 = Сохраняет значение в стек.
l0, l1, ..., l7 = Загружает значение стека с указанным номером.
d = (???)
$msg = (???)
$d = (???)

*Работа со стеками пока не до конца понятна, ибо более-менее человеческого перевода с немецкого пока нет.

================================================================================


ПЕРЕМЕННЫЕ
================================================================================


--------------------------------------------------------------------------------

----------------------------------------------------------------

Все переменные в OMSI приведены к такому виду:

(1#.2#.name)

Где:

--------------------------------------------------------------------------------

----------------------------------------------------------------

1# - Первая буква

L = Загрузка
X = Текст
T = Звуковой триггер
S = Сохранение
C = Постоянная (Константа) из Констфайла
F = Кривая значений константы из Констфайла
M = Отсылка к макросу

--------------------------------------------------------------------------------

----------------------------------------------------------------

2# - Вторая буква

L = Локальная (например, скорость машины и пр.)
M = Карта (например, внутриигровое время и пр.)
S = Системная (например, разрыв времени, пауза и пр.)
$ = Строковая переменная (например, текст на ЭМУ и пр.)

--------------------------------------------------------------------------------

----------------------------------------------------------------

name - Имя переменной

--------------------------------------------------------------------------------

----------------------------------------------------------------

================================================================================


ОСНОВЫ
================================================================================



Принцип написания скриптов на СЯ OMSI весьма своеобразный. Попросту говоря, все команды в скриптах пишутся "шиворот навыворот".
Например нам надо сложить 1 и 1. В привычном виде мы-бы написали
Код: Выделить всё
1+1

На СЯ OMSI это будет выглядеть так:
Код: Выделить всё
1 1 +

Т.е. мы сначала ставим первый оператор(переменную), второй и затем пишем операцию.

Другой пример:
Код: Выделить всё
50 2 /

502=25

Просто, но в то-же время запутанно, не так-ли ?

Теперь добавим некую переменную:
Код: Выделить всё
1 1 + (S.L.Var)

Это значит то, что мы складываем 1+1 и затем полученный результат (2) сохраняем (S) в локальную (L) переменную Var

А теперь мы сделаем наоборот:
Код: Выделить всё
(L.L.Var) 1 +

Мы загружаем (L) локальную (L) переменную Var и прибавлем (+) к ней 1

Пример, более приближённый к реальности:
Код: Выделить всё
(L.L.n_Wheel) (C.L.antrieb_i_achse) * (S.L.antrieb_getr_n_ab) (L.L.engine_n) / (S.L.antrieb_wandler_ny)

1) Загружаем n_Wheel, умножаем его на константу antrieb_i_achse и сохраняем результат в antrieb_getr_n_ab
2) Делим этот результат на engine_n и сохраняем новый результат в antrieb_wandler_ny

================================================================================


ВЕТВЛЕНИЕ, ТРИГГЕРЫ И МАКРОСЫ
================================================================================


Весь код в скрипте должен быть заключён в триггерыфреймы и содержать какое-либо ветвление. Иначе ничего не будет работать

Wikipedia писал(а):Триггеры - участки игровых скриптов, которые при выполнении определённых условий запускают заданные команды (то есть это аналоги if).


Самый простой пример триггера в OMSI - это кнопка открытия дверей. По её нажатию двери открываются и закрываются. Также триггеры необходимы при присваивании маусивента([mouseevent]) той или иной детали (НО НЕ АНИМАЦИИ) в автобусе.
В СЯ OMSI триггеры имеют подобный вид:
Код: Выделить всё
{trigger:name}
<условия для выполненияотсыл к макрокоманде
{end}

где name - это имя триггера.

================================================================================


Важный момент ! Каждый триггермакросфрейм должен заканчиваться тэгом {end}
================================================================================



Ветвление позволяет нам при выполнении того или иного условия приступить к действию. Всё ветвление сводится к 2 командам: {if} и {else}

================================================================================


Важный момент ! Каждое ветвление должно заканчиваться тэгом {endif}
================================================================================



На практике это выглядит примерно так:

Для неполного ветвления:
Код: Выделить всё
<условие>
{if}(если условие выполняется)
<действие>
{endif}(конец ветвления)


Для полного ветвления:
Код: Выделить всё
<условие>
{if}(если условие выполняется)
<действие1>
{else}(если условие не выполняется)
<действие2>
{endif}(конец ветвления)


Фреймы Frame - это своеобразная сердцевина скрипта, которая будет производить необходимое вам действие. В OMSI Фреймы и макросы повторяются раз за разом, как кадры в анимации.
Существует несколько фреймов:

{frame} - сам фрейм. после этого тэга мы начинаем писать процессы, которые должны происходить по срабатыванию ссылки на этот фрейм

{frame_ai} - то-же что и фрейм, но для ИИ. Не требует ссылок на себя.

{init} - иницализация фрейма, т.е. описание его начального состоянияусловий

================================================================================


ИТОГ
================================================================================



Кончено, всё сделано через #$&у, но при некоторой сноровке разобраться вполне можно.
Списки варлистов и маленький хелп по скриптингу на немецком можно найти в папке program в корне OMSI

================================================================================


ПОЛЕЗНЫЕ ССЫЛКИ
================================================================================




Немецкая страничка OMSI-Wiki
Более подробное описание скриптового языка. Achtung ! Немецкий язык !
Более подробное описание системы макросов. Achtung ! Немецкий язык !
Более подробное описание триггеров. Achtung ! Немецкий язык !
Подробный список системных и локальных переменных с их описанием. Achtung ! Немецкий язык !

by FRENZYMAX 02.11.2011
Аватара пользователя
FRENZYMAX
Заяц
 
Сообщения: 439
Зарегистрирован: 25 ноя 2010, 22:54
Откуда: Teh Bearland

Скриптинг для OMSI

Сообщение Андрюха_54 » 03 авг 2011, 18:03

спасибо за информацию, но тут же возник вопрос, если с текстовым форматом .txt все понятно, тогда чем открыть или какой программой открыть формат osc???
Андрюха_54
Заяц
 
Сообщения: 27
Зарегистрирован: 01 авг 2011, 12:50

Скриптинг для OMSI

Сообщение Икарыч » 03 авг 2011, 18:19

Андрюха_54,
тем же блокнотом
Икарыч
Заяц
 
Сообщения: 363
Зарегистрирован: 25 ноя 2010, 20:49
Откуда: Москва

Скриптинг для OMSI

Сообщение FRENZYMAX » 12 авг 2011, 23:06

О да - как я вижу, число заинтересованных в скриптинге лиц растёт не по дням а по часам...ну да ладно...

Собсно говоря появилась новая инфа..вернее мышления...для начала обнаружились 2 новых символа для переменных

-(C.X.YYY), где C - постоянная, константа (отсюда и первая буква - Сonstant). Константа прописывается в constfile в таком виде
Код: Выделить всё
[const]<= обозначаем блок новой константы
automatic_battery_switch<= указываем имя константы (берётся из скрипта на месте YYY)
1<= значение константы


-(F.X.YYY), где F - кривая значений константы (new curve). Прописывается всё в том-же constfile. Используется ТОЛЬКО в паре с другой переменной.
Код: Выделить всё
[newcurve]<= обозначаем блок новых значений кривой
cockpit_oeldruck <= указываем имя константы (берётся из скрипта на месте YYY)

[pnt]<= указываем "точку"
300<= значение 1 ("при значении 1, равном 300...")
0 <= значение 2 ("...значение 2 равно нулю")


Вы спросите - откуда берутся значения 1 и 2 ? элементарно - я уже писал, что для начала в скрипте надо написать ещё одну переменную рядом с F-кой..типа этого
Код: Выделить всё
(L.L.engine_n) (F.L.cockpit_oeldruck)

Вот вам и значение 1 - engine_n, соотв-но значение 2 - cockpit_oeldruck.
Т.е. выходит, что запись в constfile значит "при значении engine_n=300, cockpit_oeldruck равен нулю"

(M.X.YYY) - отсылка к макрокоманде - фреймуинициализиции(init)

Кстати...ЛЮБОЙ автобус имеет свой main-скрипт в котором в обязательном порядке должны быть перечислены все init-ы и frame-ы, используемые в данном автобусе. Если будет больше чем используется - не совсем страшно..а вот наоборот чревато
Аватара пользователя
FRENZYMAX
Заяц
 
Сообщения: 439
Зарегистрирован: 25 ноя 2010, 22:54
Откуда: Teh Bearland

Скриптинг для OMSI

Сообщение BIGMAN » 08 окт 2011, 10:19

FRENZYMAX писал(а): О да - как я вижу, число заинтересованных в скриптинге лиц растёт не по дням а по часам

Вообще- то есть заинтересованные, однако есть ли мануал по скриптам в целом для OMSI? (можно на англ.)
BIGMAN
Заяц
 
Сообщения: 13
Зарегистрирован: 04 окт 2011, 18:50
Откуда: Россия, г. Москва

Скриптинг для OMSI

Сообщение FRENZYMAX » 08 окт 2011, 10:52

BIGMAN писал(а):однако есть ли мануал по скриптам в целом для OMSI? (можно на англ.)

Да, есть. Недавно появилась страничка [url=http://www.omnibussimulator.de/omsiwiki.de/index.php?title=Kategorie:Nachschlagewerk_fГјr_Addon-Entwickler]OMSI-Wiki[/url], на которой есть ответы на большинство интересующих вопросов. Одна беда - всё написано на немецком, а с переводом на инглиш гансики основательно затягивают...
Аватара пользователя
FRENZYMAX
Заяц
 
Сообщения: 439
Зарегистрирован: 25 ноя 2010, 22:54
Откуда: Teh Bearland

Скриптинг для OMSI

Сообщение snowman7300 » 02 ноя 2011, 17:38

Я решил по колдовать над модом на дворники для МАНа.Получилось включение дворников не одновременно.На медленной скорости включается водительский а при переключении на быструю пассажирский.Но проблема:при включении пассажирского появляется текстура воды на всей лобовухе, а при включении водительского пропадает на всей.Как сделать так,чтобы при включении дворника "очищалось" только то пространство,за которое отвечает дворник?И можно-ли перевести этот мод на другие МАНы?
Аватара пользователя
snowman7300
Заяц
 
Сообщения: 35
Зарегистрирован: 24 янв 2011, 22:55
Откуда: Мурманск

Скриптинг для OMSI

Сообщение FRENZYMAX » 02 ноя 2011, 18:24

snowman7300, выходит ты как-то задеваешь триггер омывателя или скрипт дождя, других обьяснений не вижу...
Аватара пользователя
FRENZYMAX
Заяц
 
Сообщения: 439
Зарегистрирован: 25 ноя 2010, 22:54
Откуда: Teh Bearland

Скриптинг для OMSI

Сообщение FRENZYMAX » 02 ноя 2011, 21:37

ГЛОБАЛЬНЫЙ АПДЕЙТ ХЕЛПА, подымаем страницу и смотрим вверх Изображение
Аватара пользователя
FRENZYMAX
Заяц
 
Сообщения: 439
Зарегистрирован: 25 ноя 2010, 22:54
Откуда: Teh Bearland

Скриптинг для OMSI

Сообщение opel323 » 21 дек 2011, 18:43

понятно, что все скрипты состоят из триггеров и макросов. я понял, что макросы инициирует нажатие на клаве или мышкой, но что запускает триггеры? как запустить триггер сразу после начала игры? или они все сразу в начале игры инициируется?
я состряпал простой тестовый скрипт, засунул в engine.osc
если температура больше или равна 20, то выключаем двигатель и включаем определенный звук
Код: Выделить всё
{trigger:engine_temper}
    {if}
        (L.L.engine_temperature) 20 >=
{endif}
        (T.L.ev_engineshutdown)
    0 (S.L.engine_on)
        (T.L.ev_loesezischen)
{end}

не бычит
opel323
Заяц
 
Сообщения: 21
Зарегистрирован: 16 дек 2011, 16:06

Скриптинг для OMSI

Сообщение Wizard » 21 дек 2011, 18:57

Попутно моделингу я изучаю скрипты, и на сколько мне известно триггер должен быть выполнен от mouseevent. То есть он сам по себе не работает. Попробуйте вместо триггера использовать макрос.

Add: и не важно в конец или начало файла osc вы его засунете, он будет сидеть в памяти и ждать вызова)
Wizard
 

След.

Вернуться в Обсуждение OMSI Der Omnibussimulator

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
cron