Kompozitor, то, что ты предложил, конечно очень близко к идеальному графику движения поезда. Но это уже из области "Нью-Васюков", куда "автоматически переезжает столица".
Не нужно, не нужно всё усложнять! Это, если вообще реализуемо, настолько сложно, что даже если скриптеры это и напишут, чтобы в этом потом обычному пользователю разобраться и, что главное, правильно настроить, чтобы это всё как надо ездило, как минимум нужно походить на курсы ДСП, ДНЦ, если таковые существуют.
Вот если реализуют то, что в первом сообщении, то есть мою идею, то это уже будет колоссальный прорыв! А уподобляться Манилову из "Мертвых душ" Гоголя - неблагодарное занятие.
Тем более, что, как сказал TRam_, многое уже есть. Достаточно только это всё правильно применить. Например, в твоём случае и грузовой и скорый за ним идут в одном направлении, как я понял. Следовательно, электра никогда навстречу до прохождения скорого не выйдет. А на грузовой либо сработает правило Overtaking at trackside, либо при грамотном составлении ситуации в зависимости от значений определенных переменных грузовой пойдет на боковой чтобы либо отдать вагоны под маневры, либо забрать их после маневров. Тут разветвленная сеть команд помогла бы, конечно, но это не критично, так как и без неё ситуация реализуема.
Иногда мы принимаем такие решения, которым тараканы в голове аплодируют стоя.
Итак, создан гибрид CopyCommand и CheckVariable. Первая команда, которая работает по принципу си-шной
Код:
if()
{
}
else
{
}
VariableIfElse
В зависимости от выполнения условия, заданного в ней, убирает из списка команд либо следующую, либо "через одну" команду. Соответственно в эти 2 места можно поместить CopyComand из SheduleRule, благодаря чему ряд команд будет настолько разветвлённым, насколько мы этого пожелаем.
Но есть одно "но". Список переменных, задаваемых дефолтным правилом Variable Modify , не виден в редакторе. Поэтому было сделано дополнительное правило, которая позволяет уже в редакторе добавлять переменные - VariableAdd . Правда, правило с очень ограниченной функциональностью...
TRam_, посмотрел, отличная штука. Что не очень нравится - то, что в правиле можно добавить только одну переменную и то, что значения ограничены диапазоном 1-10 (даже 0 нет). Я бы предложил задавать условия аналогично команде SVariable - в правиле InputTable вписывать условие целиком. Если тут есть какие-то подводные камни, то хотя бы добавить в VariableAdd возможность указать несколько переменных. В принципе никакого другого функционала от него и не требуется.
Раз уж появилась такая команда, выскажу свою идею, какой команды не хватает в дополнение к ней. Которая бы собственно меняла значение переменной. Смысл не в том, чтобы сделать альтернативу правилу. Главное, что команда позволит проверить правилом Variable Check выполнение команды ботом, что во многих случаях гораздо удобнее, чем проверять события наезда на триггер, остановки поезда итп. Еще это позволит увязать выполнение команд одного бота с выполнением команд других. Конкретных вариантов применения может быть сколько угодно, большой простор для создания сложных логических взаимосвязей в сессии.
Здесь тоже можно задавать операции целиком в InputTable, например "mvar,x,set,10", "mvar,y,add,5", "mvar,z,sub,3", где "mvar" - префикс, по которому команда определяет, какие записи выводить в список условий, далее переменная, оператор и значение. Все эти условия в правиле легко клонируются и редактируются, работать с ними не труднее, чем с раскрывающимися списками.
VariableAdd возможность указать несколько переменных.
а что мешает добавить сразу несколько этих правил ? Просто мне не хотелось долго возиться с ним, чтоб получить ещё один аналог Variable Modify с добавлением условий, как в SetJunctions. Кстати в Variable Modify я сколько не пытался задать 0 переменной, этого у меня не вышло. Потому и сделал в команде с 1.
---------- Сообщение добавлено в 14:55 ---------- Предыдущее сообщение размещено в 14:27 ----------
Здесь тоже можно задавать операции целиком в InputTable, например "mvar,x,set,10", "mvar,y,add,5", "mvar,z,sub,3",
ну так есть же такая команда, ChangeSVariables . Поддерживает, судя по скрипту, префиксы set, inc и dec . Соответственно инкриментирование и декриментирование - сложение и вычитание. Если нет доступа к DLS - http://narod.ru/disk/51542527001.96f...ables.cdp.html
---------- Сообщение добавлено в 15:01 ---------- Предыдущее сообщение размещено в 14:55 ----------
У WaitUntilSVariable список знаков таков:
eq =
gt >
lt <
ge >=
le <=
Но всё равно, мне подход с InputTable не нравится. Почему - не знаю.
Последний раз редактировалось TRam_; 03.06.2012 в 15:04.
а что мешает добавить сразу несколько этих правил?
в принципе ничего
Кстати в Variable Modify я сколько не пытался задать 0 переменной, этого у меня не вышло.
вообще 0 прекрасно задается... Если помнишь, в моем сценарии я для наглядности вводил переменную "движение", которая принимала значение 0 при остановке и 1 при начале движения.
Сообщение от TRam_
ну так есть же такая команда, ChangeSVariables
Видимо я плохо искал Или же она появилась на DLS недавно. В любом случае спасибо за наводку.
вообще 0 прекрасно задается... Если помнишь, в моем сценарии я для наглядности вводил переменную "движение", которая принимала значение 0 при остановке и 1 при начале движения.
задать 1 а потом вычесть 1 можно, да. А вот задать именно 0 сразу - нельзя.
Между прочим, будьте осторожны с правилом Scheck Variables! Она как-то странно реагирует на 0. При старте сессии, когда с переменной ничего не делалось, у неё не 0, а некое "ПустоеЗначение". Более того, даже когда вы значению переменной прибавите 1, а затем вычтете 1, если в этот момент никакой ПС не ждет значения 0 этой переменной WainUntilSVariables, то впоследствии этот 0 ПС и не увидит. Так и будет стоять ждать. Поэтому в своё время я не стал работать с нулем, а со значимыми значениями (1,2 и т.д.)
---------- Сообщение добавлено в 17:36 ---------- Предыдущее сообщение размещено в 14:45 ----------
Володя, отлично твоё новшество сработало! Это то, что мне надо было!
"Теперь пойдет уж музыка не та!
У нас запляшут лес и горы!"
Спасибо!
Только, правда, я не понял, почему оно "помнит" какие-то другие переменные, в отличие от тех, которые я задал в VariableAdd.
---------- Сообщение добавлено в 18:12 ---------- Предыдущее сообщение размещено в 17:36 ----------
Сообщение от TRam_
задать 1 а потом вычесть 1 можно, да. А вот задать именно 0 сразу - нельзя.
Почему нельзя? И в InputTable тоже нельзя? Или это как раз тот самый Ахтунг, о котором я писал выше?
Иногда мы принимаем такие решения, которым тараканы в голове аплодируют стоя.
Или это как раз тот самый Ахтунг, о котором я писал выше?
видимо да.
---------- Сообщение добавлено в 18:29 ---------- Предыдущее сообщение размещено в 18:25 ----------
Сообщение от NickLon
Только, правда, я не понял, почему оно "помнит" какие-то другие переменные
все переменные, которые оказались в библиотеке SessionVariables, отображаются в команде. Видимо какие-то правила всё же могут их сохранять в редакторе.