Предложение: триггерная логика между сигналами.

Вопросы разработки OpenTTD, обсуждение новых сборок и патчей, решение проблем новых версий.

Модераторы: Smoky555, Группа модераторов

Предложение: триггерная логика между сигналами.

Сообщение Оборотень » Чт мар 06, 2008 15:33

(Перенесено из темы Управление движением (обсуждаем перспективу), т.к. ответов не получено, а идея начала развиваться)
Сначала был мой вопрос:
Есть ли следующая реализация? Или ее полный логический аналог?
Имеем семафор с разделенными "контактом" и "сигналом". Как в одном симуляторе городской трамвайной сети (не помню названия). Т.е. семафор срабатывает не от того, что поезд его проезжает (в случае обычного сигнала) или дистанционно-зависимо (пресигналы), а в случае пересечения некоторым поездом "контакта"; "сигнал" при этом может находиться на любом расстоянии от оного.
Один из логических аналогов - пресигналы, "вход" зависит от срабатывания "выходов". Но это не всегда подходящее решение.
А вот есть ли такая вешь с полной независимой расстановкой "контактной" и "сигнальной" частей?
Зачем это может понадобиться:
- На линии подряд идет n семафоров. Требуется зажечь красный на 1-м, если красный зажигается на, напр., 3-м. Можно сделать комбинацию "вход"-обычный сигнал-"выход". Но если обычный сигнал не получается поставить (ответвления и т.п.)?
- Если пересекаются 2 сигнальных блока, как например, на рисунке. Поезд из верхнего депо в данной ситуации может проследовать налево. А мне надо, к примеру, чтобы поезд из правого депо ходил только по горизонтальной (косой) линии, а из верхнего - только по вертикальной! В принцыпе, можно поставить точку пути, но это усложняет схему...
- Требуется поставить в зависимость семафор на одном участке пути от состояния семафора на другом, в т.ч. отдаленном (и даже не связанным полотном). Скажем, 2 станции RoRo, между ними кольцевая линия. Станции - 2..n-путки, с обычным расположением пресигналов на входе. Есть 2 поезда, надо, чтобы 1-й отправлялся со станции А только когда 2-й, например, прошел уже половину пути от А до Б, где мы поставим "контакт". А "сигнал" - перед выходом из станции А. На простой кольцевой линии сейчас можно обойтись, например, без входных пресигналов на станциях и сделать "контакт" в виде пресигнала "вход", а "сигнал" - пресигнал "выход". Но если кольцевая является частью сложной сети? Логический аналог здесь - это как я понимаю, расписания (сам пока что их не пробовал использовать).
И т.д. ИМХО, такая система сразу сделает реальностью многие текущие пожелания и сильно упростит алгоритмы уже имеющихся. Особенно если "контакт" и "сигнал" можно будет встраивать в станции и в депо.

Искать тут и на английском форуме не пытался - комбинацию слов трудно сформулировать, а по запросу "сигнал" - сами знаете, сколько сообщений найдется %) Так что если такая схема уже разработана (или создается) - просьба просветить.
Готов поробовать скодить сам, тем более, что доп. графики, наверно, много не потребуется.
Вложения
SCR12.gif
Пример пересечения 2 сигнальных блоков.
Оборотень
Машинист
Машинист
 
Сообщения: 46
Зарегистрирован: Вс окт 21, 2007 23:24
Откуда: Томск

Идея получила дальнейшее развитие...

Сообщение Оборотень » Чт мар 06, 2008 16:06

Чтобы не прослыть фантазером, решил изучить вопрос сам. Скачал исходники, любезно предоставленные Smoky555, отсюда: http://forums.ttdrussia.net/viewtopic.php?p=22337#22337 . Долго медитировал. К сожалению, Microsoft Visual Studio .NET у меня нету (стоит MSVS 6.0), поэтому сам поправить код пока не могу. Собираюсь попробовать Cygwin. Но можно ли там дебаггерить? И можно ли обойтись моей версией MSVS?
В Сях профан, хотя Дельфи или там Asm знаю. Но кое-что докумекал. В результате появилость следующее развитие идеи.

Назовем "контактную" часть некоторого сигнала - триггером. Сам сигнал в этом случае - Зависимый Сигнал (ЗС).
- Триггер цепляется на любой существующий сигнал, без различия его типа.
- Также вводится отдельный тип сигнала в enum SignalType - SIGTYPE_TRIGGER. Данный тип сигнала сам по себе НЕ влияет на движение поездов (не запрещает въезд в сигнальный блок, не влияет на состояние пресигналов и PBS), а влияет только на контролируемые им ЗС. Короче, обычный контакт на рельсах, срабатывающий при прохождении поезда.
- ЗС может быть также ЛЮБЫМ сигналом. Т.е. добавляется лишняя проверка для его триггеров в перечень обновления состояний сигналов в signal.cpp.
- Каждый триггер имеет состояние вкл/выкл. Срабатывает, при срабатывании сигнала, на который повешан - т.е. при прохождении через него поезда и/или нахождении поезда в сигнальном блоке (далее СБ). Триггеры могут быть обычные (включается при входе поезда в СБ, выключается при выходе; аналог например обычная кнопка в Win) и с фиксацией - срабатывает ТОЛЬКО при вхождении поезда в СБ, при выходе состояние НЕ меняется. Для изменения состояния требуется повторное вхождение поезда в СБ. Аналог - RadioButton.
- В массивы сигналов в signal.cpp - struct SmallSet (если правильно понял) добавить свойство - массив триггеров для данного ЗС.
- Каждый триггер самостоятелен, может влиять на n ЗС. БЕЗ различия физического местоположения, наличия связи через клетки с путями или станциями. Даже на разных типах рельс!
- Поэтому каждый ЗС имеет список ссылок на свои триггеры. Если я правильно понял код, сейчас сигнальный блок обсчитывается поклеточно и в комплексе графа связей между сигналами. ЗС придется обрабатывать отдельно, поочередно, после того, как обсчитаны состояния всех обычных сигналов (некоторые из которых являются триггерами). Добавляются функции добавления, исключения, модификации списка триггеров, как пользователем, так и в случае уничтожения имеющихся.
- Каждый ЗС имеет маску состояний своих триггеров, настраиваемую пользователем. Логика двоичная, банальная - И, ИЛИ, НЕ. Принцип визуального управления логикой - по аналогии любого редактора запросов SQL ;) (если уж в TTDP сделали управление сигналами по переменным, то здесь такой вариант будет ИМХО попрощще). Для каждого триггера отображается кнопка "Показать" (перемещает камеру на карте, либо в отдельном окне); при редактировании списка для ЗС на карте подсвечиваются его триггеры (ну хоть и белой рамкой). Триггеры в списке обозначаются, например, координатами клетки.
- ЗС при изменении своего состояния влияют на другие сигналы соответственно их типу. Проблема возникает в том, что а) возникает рекурсия; б) затем может возникнуть зацикленность - устраняется принудительным сбросом ЗС в состояние "красный". Или проверять на рекурсию по мере постройки сигналов и/или установки логики ЗС.
- ЗС можно сделать "безопасными" - в логику его триггеров включается по умолчанию также состояние СБ, следующего за самим ЗС. Т.е. при любых комбинациях, ЗС будет реагировать также на нахождение поезда в сигнальном блоке, куда ЗС является входом. Короче, работать, как обычный сигнал соответствующего типа.
- Либо для полноты контроля сделать это настраиваемым - ЗС ведет себя, как обычный сигнал соотв. типа ТОЛЬКО при отсутствии у него триггеров. Иначе - пользователь сам разруливает затыки и старается предупредить возможные столкновения.
- Короче, ЛЮБОЙ сигнал является по умолчанию зависимым; только при отсутствии триггеров он работает стандартно, а при наличии - уже в зависимости от состояния триггеров.

Это была описательная часть. Теперь как это будет выглядеть в коде.
- КАЖДЫЙ сигнал АВТОМАТИЧЕСКИ становится триггером для некоторых других ПО МЕРЕ УСТАНОВКИ. А именно, согласно связи между ними по ходу ж\д пути, при прокладке пути и при изменении уже установленных сигналов. Ссылки сигналов друг на друга при этом становятся АБСОЛЮТНЫМИ. Это позволяет сохранить логику пресигналов и PBS, только обсчитываться она будет не по графу связей, как сейчас, а линейно-рекурсивно - для каждого сигнала обсчитывается состояние его триггеров, при возникновении цикла сигнал блокируется в некотором состоянии (вкл. или выкл.). Обсчет по моим прикидкам будет на порядок быстрее.
- Стандартный сигнал имеет в качестве триггера сам себя. Точнее, состояние СБ, в который он вход.
- Пресигнал "вход" имеет триггерами "выходы" и "комбо" (с логикой ИЛИ). И сам себя, при наличии поезда в блоке. Т.е. пресигналы становятся готовыми шаблонами триггерной логики для постройки.
- PBS... Его логику я пока и сам не понимаю, к тому же есть разные варианты реализации. К примеру, здесь триггер будет срабатывать ТОЛЬКО при прохождении поезда через сигнал, но НЕ при нахождении поезда в СБ. Причем триггером будет сигнал, ведущий ИЗ развязки, а контролировать он будет вход в развязку и альтернативные выходы! Но это еще недостаточно, надо додумывать по PBS...
- ЗС добавляется также в логику входа в депо.
- "Логические" триггеры, не являюшиеся сигналами, добавляются пользователем по вкусу. Строятся как обычные сигналы, как из общего меню, так и из меню логики ЗС.
- Графика... Больной вопрос. Синий фонарь для "логического" триггера, синяя лампочка у сигнала, включенного в триггерную схему. Или соотв. полоска. Пресигналы отображаются как обычно, для ясности.
- Поскольку триггеры вряд ли будут расстанавливаться пользователем слишком часто, скорость обработки уменьшится непринципиально, зато старая логика обработки пресигналов станет более линейной, т.е. быстрой!
- В настройках патча, ессно все это можно отключить.
- Насколько я понимаю, меняется только 2 файла - signal.cpp и rail_map.h (ну и соответствующие GUI). Т.к. логика обработки сигнала поездом (красный/зеленый) сохраняется.

Дальнейшее развитие логики триггеров:
- Триггер, без различия его типа, реагирует на: 1) массу прошедшего через него состава; 2) скорость его прохождения (через СБ или через сам триггер). Это сразу решает проблему разделения путей по скорости и отчасти - по типу груза.
- То же, но указывается при настройке ЗС. Нечто вроде АЦП, когда некий ЗС сам имеет критерии состояния своих триггеров по вышеуказанным параметрам.
- Но это приведет к уменьшению скорости обработки :( Зато понадобится меньше триггеров.

Пока у меня все.
Просьба покритиковать и указать на недочеты. Если подсоветуете с компилером, попробую закодить.
Оборотень
Машинист
Машинист
 
Сообщения: 46
Зарегистрирован: Вс окт 21, 2007 23:24
Откуда: Томск

Сообщение Q » Чт мар 06, 2008 22:32

Я сейчас как раз копаюсь в коде сигнализации Опена, поэтому немного в курсе, чего и как. Посему кину свои 5 копеек.
Во-первых, насчет студии. Кажется, 2005 Студия распространяется относительно свободно, т.е. достаточно зарегиться где-то на мелкомягком сайте, и они вышлют ключ. Разумеется, это относится к Express Edition, но она для компиляции и отладки вполне сгодится. .Net там вроде бы включен.
Во-вторых, как я понял, предлагается:
а) хранить информацию о конфигурации сигнального блока в отдельном массиве вместо того, чтобы высчитывать ее каждый раз заново. (точнее, в нескольких массивах, по числу сигналов)
б) иметь настраиваемую функцию обработки значений сигналов в сигнальном блоке.

Касательно а - очевидно, увеличатся накладные расходы на поддержание актуальности конфигурации, однако несильно.
Обработка значений существенно упростится.
Касательно б - есть сомнения в целесообразности. На практике используется лишь несколько вариантов таких функций. Есть мысль, что надо выписать эти варианты и тупо сделать по ним несколько типов сигналов. причем чем меньше, тем лучше, иначе будет неиграбельно.

Теперь о развитии. Мне например хочется сделать больше двух сигналов светофора (т.е. кроме красного и зеленого, например, сигнал "два красных", который говорит, что где-то впереди на перегоне есть встречный поезд). Ввиду полезности а), хочется его использовать, но при этом совместимость с б) будет нулевая, ибо бинарность логики пропадает.

И еще пара технических вопросов:
массивы очевидно будут динамически создаваться при загрузке игры (не вижу смысла в том, чтобы сохранять инфу, которую можно посчитать), верно?
каким образом предполагается организовать хранение ссылок на эти массивы (будет ли использована структура Tile, или созданы дополнительные переменные)?
все равно потребуется проверка на наличие поезда в сигнальном блоке, или этот момент тоже можно каким-то образом обойти? если нет, то по всей видимости, ожидать ускорения обработки сигналов не следует :(

Пожалуй, все
Если красный зажигают, значит это кому-нибудь нужно
Аватара пользователя
Q
Диспетчер
Диспетчер
 
Сообщения: 174
Зарегистрирован: Вс апр 03, 2005 23:07
Откуда: Москва, Солнцево

Сообщение Sky-Clad » Чт мар 06, 2008 22:44

А может вообще лучше разработать новый тип сигнализации (наподобии ИСИ РФ)?
Аватара пользователя
Sky-Clad
Директор
Директор
 
Сообщения: 314
Зарегистрирован: Чт июн 28, 2007 18:06

Сообщение Q » Чт мар 06, 2008 23:43

Sky-Clad писал(а):А может вообще лучше разработать новый тип сигнализации (наподобии ИСИ РФ)?

Вообще, если дальше развивать тему реалистичных ускорений/замедлений, то что-то похожее потребуется.
Ну и вообще, такая штука будет больше для красоты, поскольку все равно выбор маршрута на стрелках и разветвлениях определяется далеко не показанием сигнала.
Если красный зажигают, значит это кому-нибудь нужно
Аватара пользователя
Q
Диспетчер
Диспетчер
 
Сообщения: 174
Зарегистрирован: Вс апр 03, 2005 23:07
Откуда: Москва, Солнцево

Сообщение Sky-Clad » Пт мар 07, 2008 08:40

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


Ну упростить хотя бы насколько можно :)
Наоборот, чтобы показания сигнала определялись приготовленным маршрутом :)
Аватара пользователя
Sky-Clad
Директор
Директор
 
Сообщения: 314
Зарегистрирован: Чт июн 28, 2007 18:06

Сообщение Q.W.E.R. » Пт мар 07, 2008 13:41

Добавлю от себя еще про прохождение светофоров и торможение поездов

Q.W.E.R. писал(а):В игре очень бросается в глаза то, что поезд как-то странно тормозит. На станции он тормозит плавно и постепенно, что не вызывает никаких претензий, при принудительной остановке, поезд тормозит как-то более резко, но проезжает все-таки некоторое расстояние, на сфетофоре же поезд ПОЛНОСТЬЮ останавливается с ЛЮБОЙ скорости всего за 1(!) ОДНУ клетку (это примерно 50 метров)

Теперь представьте: MagLev, 400 км/ч, впереди вдруг ни с того ни с сего за 50м от поезда обнаруживается светофор!

Не знаю, как вы, но я не хотел бы оказаться на месте пассажиров этого поезда...


Q.W.E.R. писал(а): Предлагаю новый алгоритм торможения: за одну клетку поезд весом 100 тонн тормозит на 100км/ч. Тогда он за полклетки врядли остановится...


Допустим у нас есть поезд массой 1000 тонн едущий на 74 км/ч. Это значит, что тормозить ему 8 клеток (округление в большую сторону).
1. В начале каждой клетки он сканирует 8ую на предмет красных светофоров/станций/конца пути.
1,1. Если нет сигнала/станции/зеленый - поезд резервирует эту клетку/закрывает переезд и едет пункта 1.
1,2. Если зеленый ПМС - резервирует свой путь как обычно до конца развилки и спокойно едет до того, как следующей "8ой" незарезервированной клетки
1,3. Если есть любое из вышеперечисленных или др препятствий - начинает тормозить и запоминает это место
ПРИМЕЧАНИЕ: Если есть "округление в большую сторону" - поезд тормозит до 10 км/ч по формуле из цитаты, дальше доползает до конца и останавливается.
Есть другие варианты 1)не округлять, а смотреть на нецелое число клеток 2)растягивать расстояние торможения до 8 клеток и тормозить плавно до конца. Так вот, я считаю, что это сложно реализуемо и/или добавит большие тормоза.

1,3,1 Если во время торможения поезда светофор зеленеет - поезд продолжает тормозить до конца клетки, затем по порядку просматривает дальшеследующие клетки.
1,4. Если есть развилка - выбирает путь, как YAPF посоветует
2. Когда поезд разгоняется, расстояние для торможения естесственно тоже увеличивается, и когда переваливает за каждые 10 км/ч (при весе 1000т) расстояние увеличивается на одну клетку. Как только в поле зрения появляется непроверенная клетка - она проверяется сразу же, не дожидаясь, пока поезд доедет до границы клеток.

Это еще не все. Есть куча нюансов, которые еще не пришли мне в голову.

Преимущества игровые: Увеличит реализъм. Даст возможность строить поистине ГИГАНТСКИЕ линии. Быстрее будут застраиваться большие карты. Исчезнет смысл строить светофоры на каждой клетке (под вопросом)

Недостатки физические: К сожалению, я не знаю кода, поэтому не могу сказать про прохождение на диагональных путях, также возможно еще много др проблем при реализации. Ну и естесственно данный патч может добавить тормозов игре

Недостатки игровые: Увеличит сложность игры. Будет тесно на малых картах. Не всем понравится.



ЗЫ люблю работать генератором идей, жаль, что не все из них доходят до кодеров :(
Q.W.E.R.
Диспетчер
Диспетчер
 
Сообщения: 126
Зарегистрирован: Вс сен 10, 2006 14:59
Откуда: Рязань

Сообщение Q » Пт мар 07, 2008 14:54

Во-первых, расстояние между клетками не 50 метров. Уже обсуждалось, что в ОТТД размер клетки переменный, от 20м до нескольких км. Так что тут-то все нормально.
Но. Есть одно но. Действительно на станции и перед светофором поезд тормозит по-разному. Что выглядит некрасиво.
Если сделать как ты предлагаешь, то появятся некоторые проблемы:
например, есть соединение путей, стоят два светофора на каждой ветке. два поезда практически одновременно подъезжают к развилке, один успевает выехать на нее. А теперь представим себе машиниста второго поезда: едет он, едет, и тут бац, светофор перед носом закрывается! все как положено, экстренное, все дела, но все равно проезд красного обеспечен, да и до аварии недалеко. Теперь посмотрим на реакцию игрока: вот он построил развязку, пустил поезда и тут хрясь: "произошла авария, погибло 264 человека включаю двух машинистов", и закономерный вопрос "а какого, спрашивается, хрена, я же ставил светофоры!, че за хня?!".
Короче логику работы сигналов придется кардинально переделывать тогда.
Если красный зажигают, значит это кому-нибудь нужно
Аватара пользователя
Q
Диспетчер
Диспетчер
 
Сообщения: 174
Зарегистрирован: Вс апр 03, 2005 23:07
Откуда: Москва, Солнцево

Сообщение Q.W.E.R. » Пт мар 07, 2008 15:48

Я думал об этом, но нрно поезда будут разъезжаться как обычно, только за n клеток до перекрестка.
Если же это действительно не реально - можно добавить лазейку: поезда тормозят по моему варианту, а если вдруг не успевают - просто обрубать скорость. Или же на последней клетке включать старый алгоритм. Думаю после продолжительного плавного спада скорости такое увеличение может быть незаметным хотя хз. В реале же поезда последние метры тормозят более интенсивно, что пассажирские, что грузовые
Q.W.E.R.
Диспетчер
Диспетчер
 
Сообщения: 126
Зарегистрирован: Вс сен 10, 2006 14:59
Откуда: Рязань

Сообщение Kalistos » Пт мар 07, 2008 18:40

на счет разности торможения можно разговаривать, а можно оставить как есть, перед свеофором, станцией, вроде как пойдет для игры
а вот знаете что я хочу, смысл в том что нло садится на рельсы и взрывает???
надо так чтобы когда поезд натыкается на конец линий, он не останавливался, а слетал с рельс и КАБУМ, столько-то-столько погибло, включаю машиниста и его собачку

или как еще, поезд едет куда-то не туда, мы убираем перед его главным паровозом релсьу и он разоварачивается, С КАКОЙ БЫ СКОРОСТЬЮ ОН НЕ ЕХАЛ, как бы не так! не реалистичнО!
надо так, поезд едет, мы убираем рельсу, и соответственно машинист:
"ААААА! БЛЯ!!! ЕБАНАВРОТ!! МАМА!! НЕ ХОЧУ УМИРАТЬ!!!"
столько-то-столько погибло, включаю машиниста и т д.
а так ща у нас как получается?
рельсу убрали,
машинист так спокойно:
"Пацаны, это типа, тормозим, тут рельсы только что убрали, ехать ну никак не получается, разворачиваемся и обратно"
поезд отпружинивает и едет обратно

чота как-то помойму нереальна ^^
Kalistos
Начальник станции
Начальник станции
 
Сообщения: 68
Зарегистрирован: Вс фев 24, 2008 20:10

Сообщение Fornet » Пт мар 07, 2008 19:21

Ну вы уж совсем развили тему) Реалистичность им такую подавай) Насчет двух поездов подъезжающих к пересечению, вообще есть еще такой замечательный сигнал: желтый. Вот после него то поезда и сбрасывают скорость, а не перед красным.
Что касается MagLev, в TTD он вообще далек от реальности. Что уж тут говорить.
Тормозов все эти идеи принесут нехилых, а незнание языков не освобождает от ответственности. Попробуй сам технологию по-простому объяснить (языком элементарной логики), а уж обработать идею и перенести в игру, если она кого-то заинтересует, тогда и проблем не составит.
Все-таки ничего не понял насчет триггеров. К чему они? И как, например, поезд будет входить в СБ, если триггер НЕ переключил светофор на зеленый после выхода другого поезда из СБ? Текущая система сигналов полностью отражает реальный аналог, разве что физика путей (стрелки и т.п.) реальности не соответствует.
По мне дак лучше бы ПБС-пресигналы сделали нормальные (логику ПМС понять пока невозможно, даже мануала к нему нет).

Да и вообще покажите мне стратегию ПОЛНОСТЬЮ соответствующую реальности. Все игры - это модели, они неизбежно упрощаются, учесть все невозможно, нереалистично, например, что дерево не может упасть на пути и к тому же порвать контактную подвеску, а еще машин в городе нет, погода всегда отличная, поезда уж очень быстро обслуживаются.
Есть куча "нереальностей" которые можно поправить причем куда проще и быстрее. Да те же крушения поездов в конце пути)
ИМХО
Аватара пользователя
Fornet
Диспетчер
Диспетчер
 
Сообщения: 166
Зарегистрирован: Вс сен 30, 2007 21:08
Откуда: Шадринcк

Сообщение Q.W.E.R. » Пт мар 07, 2008 21:18

Если поезд будет резервировать для себя путь равный тормозному пути + 1 кл, то убрать перед носом рельсу не получится
Q.W.E.R.
Диспетчер
Диспетчер
 
Сообщения: 126
Зарегистрирован: Вс сен 10, 2006 14:59
Откуда: Рязань

Сообщение Nedji » Пт мар 07, 2008 23:00

скажу по секрету, поезда сейчас резервируют блок до следующего семафора(или конца пути)\по крайней мере пмс\ по этому же принципу он скорее всего и работает(поиск пути от 1 семафора до нужного\не пересекая уже зарезервированные[как я понял они отдельным битом резервируются]\, если путь проложен то он резервируется и подается зеленый)

как говорится можно написать что угодно, главное чтобы руки прямые были да голова не пустая

2fornest триггерная система с доведенной до ума пмс сигнализацией это очень хороший инструмент
Nedji
Диспетчер
Диспетчер
 
Сообщения: 168
Зарегистрирован: Пт авг 24, 2007 17:49

Сообщение Оборотень » Сб мар 08, 2008 06:13

Господа, про торможение - эт интересно, но оффтоп в данной теме. Кстати, весь механизм постройки путей и дорог у нас тоже ну весьма нереалистичный %)

Q писал(а):Во-первых, насчет студии. Кажется, 2005 Студия распространяется относительно свободно, т.е. достаточно зарегиться где-то на мелкомягком сайте, и они вышлют ключ. Разумеется, это относится к Express Edition, но она для компиляции и отладки вполне сгодится. .Net там вроде бы включен.

Но всеравно дистрибутив нужен? Проще ломаную скачать, благо что у нас в городе этого полно. Или можно 6.0 проапгрейдить как-то?
Во-вторых, как я понял, предлагается:
а) хранить информацию о конфигурации сигнального блока в отдельном массиве вместо того, чтобы высчитывать ее каждый раз заново. (точнее, в нескольких массивах, по числу сигналов)
б) иметь настраиваемую функцию обработки значений сигналов в сигнальном блоке.

а - Ну как бы да, только инфо не о СБ, а о сигналах в узком смысле! Т.е. КАК Я ПОНЯЛ, сейчас есть массив: карта мира. Каждая клетка имеет в свойствах в том числе наличие на ней сигнала. При обработке состояний сигналов, КАК Я ПОНЯЛ, берется клетка, где паровоз, берутся соседние с ней клетки по графу связей через пути, ПРОВЕРЯЕТСЯ, есть ли на них сигналы, эти клетки ВНОСЯТСЯ в массивы на обработку и т.д.
Я же, по опыту программирования (только там масштабы не такие конечно были ;) Ну игра "Жызнь" например, правда не доделал) в таких случаях делаю ОТДЕЛЬНЫЙ массив данных, подлежащих некоторой обработке и делаю это В ХОДЕ поступления данных (здесь - в ходе постройки ж/д и сигналов). Массив получается (на этапе обработки данных) СТАТИЧЕСКИМ, а его элементы обрабатывается к тому же ТОЛЬКО при необходимости, т.е. в данном случае - рекурсивно, начиная с клетки, на которую заехал состав.
Так что тут мы пришли к одному положительному выводу вроде.
б - Почти так, только понятие "сигнальный блок" здесь дополняется понятием "зависимость одних сигналов от состояних других, НЕ ОБЯЗАТЕЛЬНО связанных путями или типом логики". Пример (на картинке), тут имеем 2 СБ, которые пересекаются, оба - пресигнальные. В результате влияют друг на друга. А у меня предлагается зависимость, работающая даже если подряд идет несколько СБ из пресигналов "вход+выход" (см. первый пост).
Причем еще учитывается состояние как самого СБ (есть ли в нем поезд), так и непосредственно сигнала-триггера (проехал ли через него поезд), что дает более богатую логику.
Твое мнение по б - да, так сейчас и сделано. Но я ж сказал ранее, что 1) отключаемо; 2) старые типы сигналов остаются по умолчанию, а пользователь при желании может (но не обязан!) САМ запрограммировать логику. Это особо часто и не понадобится, по прикидкам. Зато на оч. сложных развязках или в сложных схемах взаимодействия транспорта может помочь. Плюс, повторяю, ПОЗВОЛИТ РЕШИТЬ многие текущие проблемы и предложения! См. например мой предыдущий пост в конце.
Технические ответы ;) :
Массив сигналов будет создаваться по мере постройки линии и сигналов на ней. Точнее (подумав) даже не массив, а связанный двунаправленный список. Так прощще обрабатывать связи между сигналами; проще изменять содержимое списка при постройке и удалении сигналов. Структуру списка щас обдумываю.
Нахождение поезда в СБ... А ХЗ, надо это обсчитывать, тем более, алгоритмы поиска пути всякие, в которых не разбирался пока. Надо изучить матчасть...
Fornet писал(а):Все-таки ничего не понял насчет триггеров. К чему они?

1) Вся логика работы сигналов переводится в триггерную зависимость друг от друга => ускорение обработки. Внешне сигналы работают по-старому.
2) Возможность игрока контролировать зависимость состояния одних сигналов от других (и вобще от наличия состава на некоторой произвольной клетке! - на которой стоит триггер-"контакт").
3) К предыдущему - триггер и ЗС могут быть НА РАЗНЫХ перегонах, в т.ч. НЕ соединенных между собой или разного типа (пример: сигнал на монорельсе контролируется состоянием соседнего неэлектрофицированного пути).
4) Возможность контроля над пересечением СБ - см. мой предыдущий пост.
И как, например, поезд будет входить в СБ, если триггер НЕ переключил светофор на зеленый после выхода другого поезда из СБ?

Если триггер находится НЕ на выходе этого СБ - то никак ;) В этом то вся хитрость! Имеем 2 поезда. Первый поезд может стартовать только тогда, когда второй проехал определенное место.
Если триггер стоит на выходе из СБ и контролирует все входы в него и при этом не переключил их на зеленый - это криво поставленный ВРУЧНУЮ триггер.
Напоминаю, старые типы сигналов остаются - для простоты.

Кажется это был всетаки Trainz? Бесплатный симулятор трамваев, в общем. Там как раз подобная система была - контакт и сигнал разделены.

Что скажут уважаемые Гуру по поводу данной идеи?

Щас качаю Cygwin, попробую кодить. Для начала хочу сделать простую пару триггер-ЗС, 2 лишних кнопки в окне сигналов. Логика - обычный ключ. Только надо обмозговать, делать обычный "контакт" (зеленый на триггере - зеленый на ЗС) или с памятью (требуется повторное прохождение поезда для переключения).
Оборотень
Машинист
Машинист
 
Сообщения: 46
Зарегистрирован: Вс окт 21, 2007 23:24
Откуда: Томск

Сообщение Fornet » Сб мар 08, 2008 12:32

1) Вся логика работы сигналов переводится в триггерную зависимость друг от друга => ускорение обработки. Внешне сигналы работают по-старому.
2) Возможность игрока контролировать зависимость состояния одних сигналов от других (и вобще от наличия состава на некоторой произвольной клетке! - на которой стоит триггер-"контакт").
3) К предыдущему - триггер и ЗС могут быть НА РАЗНЫХ перегонах, в т.ч. НЕ соединенных между собой или разного типа (пример: сигнал на монорельсе контролируется состоянием соседнего неэлектрофицированного пути).
4) Возможность контроля над пересечением СБ - см. мой предыдущий пост.

А не кажется ли вам что такой театр выходит за рамки транспортной стратегии и стратегии вообще? Ну разок этим полюбуешь, другой, а потом то уже все равно. Я понимаю для симуля делать такие вещи, тогда сценарии просто супер получатся, красиво, как в жизни. А так, я вот в 11670 играю - построил в 45-47 годах южную ветку и почти не трогал до сих пор (сейчас 67й, длина дня=28 ), особенно ту часть, что в 1945 построена. Там кстати так те самые паровозы и гоняют, Sh40 появится, буду переводить на электричество :wink:
Аватара пользователя
Fornet
Диспетчер
Диспетчер
 
Сообщения: 166
Зарегистрирован: Вс сен 30, 2007 21:08
Откуда: Шадринcк

След.

Вернуться в Разработка OpenTTD

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

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