Пытаюсь замутить свой симулятор.
| |
V9 | Дата: Воскресенье, 10.08.2025, 10:16 | Сообщение # 541 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
|  Это GID.txt. Нева "убирает" 380й по НВ1 и "выставляет" 379. Но время одинаковое и id поезда тоже одинаковое. Загрузчик физической модели мира охреневает и уходит бесконечный цикл. Хорошо что нашел свою ошибку. Плохо что потратил на поиск много времени.
upd. Пояснение. Загрузчик пробегает по каждому поезду с его ID и обновляет "последнее событие" по нему. Тогда мы знаем какие команды можно будет отдать по поезду и когда. Если четный поезд проехал чумпас пять минут назад, мы не можем дать ему команду "прибудь-ть сейчас в Сургут!" Мы можем дать команду "прибудь в Лагнепас" или "проследуй Лангепас" и только. Может быть еще можно добавить в список возможных команд "тормозни и приступи к работе на таком-то км и пк". И всё это с учетом перегонного времени.
Соответстенно, когда следующая точка времени по этому поезду меньше предыдущей, ее не учитываем - "плохой GID!" Но не было учтено, что следующая точка времени может быть равна предыдущей, и ее надо обработать.
Сообщение отредактировал V9 - Воскресенье, 10.08.2025, 10:57
| |
| |
V9 | Дата: Воскресенье, 10.08.2025, 12:29 | Сообщение # 542 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| (мысли)  3305 только что протарахтел Лангепас. ПодистимаГид взял сведения из GID.txt и отрисовала.
 21:10:13 поезд 3305/123 проследовал станцию Лангепас по I-му главному пути.
C Гидом все хорошо. Но подсистема пульт тоже анализирует GID.txt. Если поезд прибыл - мы рисуем занятость пути. Поезд уехал? Свободность. Но не видно прохода поезда на пульте. Момент прохода - вспышка.
Возникла мысль: "добавить дополнительные записи в gid.txt о том, что путь занялся и путь освободился. По замыслу выглядело бы так:

Вместо одной записи стало три. В 21:09 подсистема Пульт получила сигнал, что главный путь по Лангепасу занялся (это въехала голова 3305), минуту голова ехала до выходного и зафиксировала проследование Лангепаса в 21:10.. Проехав головой поезда выходной сигнал, километровый хвост еще минуту занимал главный путь и уехал в 21:11, освободив его.
К счастью, вовремя я упоролся в ошибку и выяснил, что при отдаче команды происходит пересканирование поездной ситуации, что защищает от отдачи "неправильной команды", смотреть чуть выше.
Но! Последний момент времени уже 21:11, а не 21:10. Команда уже "выключить лампу главного пути Лангепаса", а не "Проследование Лангепаса". Перегонное время до УЯ уже точно не рассчитается. Нужно править код загрузчика поездной обстановки, чтобы он не учитывал лампочки.
Мысленно посокрушавшись, я понял, что можно лампы просто писать в отдельный текстовый файл. Тогда GID.txt остнается чистым, где будет только движение. Подумав еще немного я понял, что нет смысла хранить записи по лампочкам по "движению поездов". Какая разница как они там загорались пять минут назад, если для лампочек нас интересует ситуация "здесь и сейчас"? Можно просто хранить "карту" ламп и обновлять ее. А подсистема пульт будет читать и по карте обновлять свои лампы. То есть надо иметь файл save.sav.
Но save.sav я планировал делать только в релизе 0.6, когда будет делаться "физическое движение поездов". Иил "физическая модель мира".Добавлено (10.08.2025, 14:10) --------------------------------------------- upd. Долго размышлял и делаю вывод, что пока будет всё таки не карта ламп на данном этапе, а список событий под названием pultlamps.txt, где будут движком фиксироваться последние события с лампами.
Возьмем предыдущий пример c 3305м. В GID.txt попадет запись:
Цитата 21:10:13;3305;50;1001;;3;123 А вот pultlamps.txt попадет другая запись: Цитата 21:09:13;3305;50;1001;;3;123 Похожая, но на минуту раньше. Что это даст? Пользователь, наведя мышь на главный путь Лангепаса, увидит подсказку "3305 проследует станцию".
Проехал поезд, пора лампу делать красной. Движок переписывает файл pultlamps, удаляя запись по 3305му нет, лампа автоматически становится желтой.
Бенефит: можно поставить несколько хозяек на один путь. Можно локотив резервом загнать в хвост грузовому поезду, чтобы пропустить встречный пакет(одиночный) поездов. И т.п.Добавлено (10.08.2025, 16:39) --------------------------------------------- Смотрю свою подсистему "Движок игры", тот кусок кода, который следит за временем и отрабатывает именно движение поездов. Начинается на строке 8684. Заканчивается на строке 8723. 40 строк кода. Из 7512 всего.
ps. Он предельно простой и тупой на данный момент. Если наступает момент времени, он переводит событие из "будущего" в "выполненное", переписывая GID.txt. Что вызывает обновления ГИДа и т.п. Добавлено (10.08.2025, 17:08) --------------------------------------------- upd. Физический движок сейчас "халявный". При запуске открывает ГИДы(тексты) и сканирует только на время, пытаясь определить "максимальный момент". Этот момент считается стартом отсчета. Далее сканируем распоряжения. И по мере протекания времени, распоряжения о движении переводим в выполненные.
Но это не работает с лампочками пульта. Тут надо делать разбор всего чтобы понять четко состояние лампочек пульта на момент начала запуска осчета. И сканирвать распоряжения, так как лампочки "прибытия" и "прохода" загораются до самого момента прибытия и прохода.
| |
| |
V9 | Дата: Понедельник, 11.08.2025, 09:52 | Сообщение # 543 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| Релиз 0.3.3. 1. Обеспечена совместимость в релизом Невы 0.9.3.6 для работы в качестве ГИДа. Но обспечена и обратная совместимость с Невой 0.9.3 и ранее. 2. Вся информация для конструирования полигона теперь берется из строго из .dat файлов, нет "зашитых внутри кода особенностей полигонов". 3. Появилась альфа версия окна пульта для режима симулятора DSim. Но поезда с пульта не отправляются.
Релиз выпущен так как дальше планируется дошлифовка окна пульта и некоторое время код будет неработоспособен. Поэтому сделан апдейт под новую Неву.
| |
| |
olegpersh999 | Дата: Понедельник, 11.08.2025, 09:56 | Сообщение # 544 |
Начальник станции
Группа: Пользователи
Сообщений: 252
Награды: 3
Репутация: 0
Статус: Offline
| Совместимость с исправленной версии Невы 0.9.3.6 ? Потому что были какие-то косяки, Zork писал, что исправил, а файл перезаливался или нет?
| |
| |
V9 | Дата: Понедельник, 11.08.2025, 10:32 | Сообщение # 545 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| Цитата olegpersh999 (  ) Потому что были какие-то косяки, Zork писал, что исправил, а файл перезаливался или нет? Zork сообщал, что исправил ошибку по вылету по отдаче приказа на отмену стоянки пассажирскому по Силинскому. Исправленный релиз им не выложен.
| |
| |
olegpersh999 | Дата: Понедельник, 11.08.2025, 19:33 | Сообщение # 546 |
Начальник станции
Группа: Пользователи
Сообщений: 252
Награды: 3
Репутация: 0
Статус: Offline
| Цитата V9 (  ) Прикрепления: dsim_0_3_3_0.zip (83.2 Kb) Не работает. В том плане, что нет изменений. Функции формирования длинносоставных по Покачевскому нетДобавлено (11.08.2025, 19:35) --------------------------------------------- Я скачал версию 0.9.6, поставил сверху вот этот архив и перенес свои сохранения и текстовые файлы. Пишет Неверный формат загрузки
| |
| |
V9 | Дата: Понедельник, 11.08.2025, 20:06 | Сообщение # 547 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| Нужно взять папку из ветки "реконструкция участка Сургут-НВ1", из поста http://pultneva.ru/forum/24-347-16750-16-1754329590
Там упакованная Нева 0.9.3.6 и адаптированные под нее data.dat с расписаниями от 2005 и 2012 годов. И вот на эту папку надо ставить Dsim 0.3.3 и туда копировать сохраненнки. Тогда должно заработать.
Если ничего не получится, упакуй сохраненки, gid.txt, gid_bmp &gid_dop.bmp и отправь мне. Я подготовлю полный рабочий готовый релиз.Добавлено (11.08.2025, 20:08) --------------------------------------------- upd. Просто Zork поменял формат данных в data.dat. 1. Я сначала мои модифицированные data.dat "реконструкции участка" адаптировал под зорковские изменения, чтобы они могли загружаться Пультом Нева. 2. А сейчас я адаптировал DSim чтобы DSim мог понимать новый формат data.dat.
| |
| |
olegpersh999 | Дата: Вторник, 12.08.2025, 06:58 | Сообщение # 548 |
Начальник станции
Группа: Пользователи
Сообщений: 252
Награды: 3
Репутация: 0
Статус: Offline
| вот Добавлено (12.08.2025, 06:59) --------------------------------------------- Data.dat я вижу, а упакованную Неву нет. Там даже exe файла нет Добавлено (12.08.2025, 10:50) --------------------------------------------- V9, все я разобрался) Добавлено (12.08.2025, 11:12) --------------------------------------------- Только ГИД не быстро обновляется. Что нужно сделать подскажи, пожалуйста?
| |
| |
V9 | Дата: Вторник, 12.08.2025, 11:33 | Сообщение # 549 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
|  Скорей всего тут проблема.
| |
| |
olegpersh999 | Дата: Вторник, 12.08.2025, 12:42 | Сообщение # 550 |
Начальник станции
Группа: Пользователи
Сообщений: 252
Награды: 3
Репутация: 0
Статус: Offline
| Спасибо)
| |
| |
V9 | Дата: Вторник, 12.08.2025, 21:16 | Сообщение # 551 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| Буквально вчера сообразил как сделать то, что пока не знал как сделать. Вводная. Игрок-диспетчер отдает приказ симулятору отправить поезд, Скажем, 2502, скажем в 18:05. Ок! Движок симулятора получает распоряжение и сравнивает свое время и указанное игроком. Если свое время меньше, то движок запоминает приказ и исполнит его в 18:05 игрового времени. Но если Диспетчер опоздал со временем, и сейчас на полигоне, скжаем, 18:07, то поезд отправится по времени движка. Это полная симуляция отдачи команды от ДНЦ к ДСП. "Если опоздал, то как получится!"
То есть, если время в приказе меньше времени движка, берется время движка.
И появилась проблема "перевалки" в новые сутки. В игре, к примеру, 11 июня 23:55. Пользователь отдает приказ отправить поезд в 00:06. И... Движок сима же видит, что в приказе время меньше! И движок отправит поезд в 23:55! А надо в 00:06 след дня!
Далее была мысль писать следующие сутки как +24 часа. То есть, если мы сегодня в 23:05, а хотим отправить в 00:06, то в приказе пишем: 24:06! С точки зрения движка, 24:06 > 23:06, приказ попадет в отложенные. Ок! Но дальше проблема. Пусть мы перевалили в новые сутки, у нас 00:01, и тут игрок закрывает игру. Приходит потом, запускает, движок снова сканирует приказы, и там видит ... 24:06! А сейчас 00:01 12 июня! "Ну ок!" - думает движок - "Значит пользователь хочет отправить поезд завтра, 13 июня! Он же сам написал 24:06!" И поезд едет не через 5 минут, а через 24 часа и 5 минут! Не 12го, а 13го.
И вот вчера пришла в голову мысль, как решить проблему. Итак! Движок запускается. 1. Движок при запуске скаинурует GID.txt чтобы определить момент времени. Тут все по прежнему, ничего не меняется. 2. Движок определяет, какая половина дня текущего времени - утро до 12 или день после 12. 3. а) Если у нас вечер, то приказы сканируем и вносим в список исполнения без корректировки времени. б) Если у нас утро, у при загрузке приказов очищается часовое время в том смысле, что если 24 и более, то минусуем 24. И учитываем время уже скорректированное "к нулю".
И все проблемы решены! Повторно разбираем пример выше. 1. 11 июня 23:55, пользователь отдал приказ отправить в 24:06. Ок, приказ не корректируем, он попадает в лист ожидания. Поезд не едет. Переваливаем через ноль, у нас в списке только приказы с 24+. минусуем 24 часа, получаем запись вида "00:06". Все, поезд поедет в 00:06! 2. 11 июня 23:55, пользователь отдал приказ отправить в 24:06. Ок, приказ не корректируем, он попадает в лист ожидания. Поезд не едет. Игрок вышел из игры в 23:59. Приказ остался без изменений. Загрузил сим, приказ прочитался без изменений. Перевалием через ноль, далее см. п.1. 3. 12 июня 00:02. Загружаем симулятор. Читает приказы из листа приказов. Видит приказ на 24:06. Так как у нас утро, очищаем 24 часа, остается 00:06. Отправляем в 00:06.
При любом развитии, аккуратно перевалили через 00:00, отправив все поезда вовремя.
ps. Забыл уточнить в чем весь сыр-бор! В DSim можно отправить, к примеру, с Куть-Яха и то НВ1 "ходом". Сим рассчитает время прохождения по всем промежуточным станциям и по каждой станции запишет свой приказ. В Куть-Яхе - "отправление", по всем промежуточным - "время проследования", по НВ-1 - "время прибытия". Соответственно, очень легко нарываемся на ситуацию отправления 11 июня, а прибытия - 12 июня.Добавлено (13.08.2025, 22:57) --------------------------------------------- offtop. Открыт к идеям, как переименовать сеё произведение.
| |
| |
V9 | Дата: Четверг, 14.08.2025, 11:34 | Сообщение # 552 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| Урямс!
В режиме симулятора DSim научился успешно "переваливать" через 00:00. Самый первый работоспособный вариант был сима был календарно год назад. И вот, спустя год, мой сим в режиме сима научился "переходить на новые сутки". Лол. блн!
ps. Пока делал, множество ошибок было найдено и исправлено:.
 Как вам дата "04:33:36;2"?
| |
| |
olegpersh999 | Дата: Четверг, 14.08.2025, 15:38 | Сообщение # 553 |
Начальник станции
Группа: Пользователи
Сообщений: 252
Награды: 3
Репутация: 0
Статус: Offline
| У меня он до сих пор переходит на ноль вытирая все нитки графика. Только после перезапуска работает. Но дата не меняется в углу)
| |
| |
V9 | Дата: Четверг, 14.08.2025, 16:30 | Сообщение # 554 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| Доберусь рано или поздно до всех ошибок. =) Хотелось бы рано. Добавлено (15.08.2025, 04:40) --------------------------------------------- Когда я начинал делать сим, я, по приколу, наложил такие ограничения: 1. Разработка в java 1.0. 2. Весь текст проги в одном файле, должен быть один "класс". 3. Вся обработка должна, насколько возможно, идти в одной функции main().
Это люто усложнило разработку, но, тем не менее, разработка двигалась. И тут я уперся в стену. Старый компилятор больше не может компилировать текст программы превращая в мою прогу. Java контролирует возможные места ошибок и если ошибки возникают, то сообщает разработчику и пользователю место ошибки в программе. Он формирует таблицу соответствия мест в программе и текст программа. При ошибке в программе, обработчик покажет ошибочное место в тексте программы.
Но старый компилятор не может компилировать столь большие единые куски программы. Компилятор неверно формируют таблицу соответствия кода программы и текста программы. При возникновении ошибки, прога указывает в случайные места исходного текста. Ошибка происходит в 9831й строке исходного текста, а прога указывает 478ю.
Чтобы продвигаться дальше, нужно: 1. Или отказаться от принципа "все в одном классе и в одной функции", но можно остаться на java 1.0. 2. Или перейти на старшие варианты Java и компилировать ими. Добавлено (15.08.2025, 19:07) --------------------------------------------- ух! нарвался на очередной caveat у Java 1.0. жосский. Три часа разбирался. =) Если передать Строку в вызов метода в другом классе, Java 1.0 ее скопирует, вместо того, чтобы отправить ссылкой. А у меня в коде есть определенные моменты где строго сравниываются Строки именно по ссылке, там это критично. Добавлено (15.08.2025, 23:13) --------------------------------------------- Когда разрабатывал структуру хранения полигона, сделал ошибку. Для сокращения разработки сделал хранение структуры полигона "линейно по станциям", а перегоны "подвязал" к станции, причем - между двумя станциями может быть один перегон. Это было сделано чтобы ускорить продвижение разработки. В итоге, в режиме симуляции мой же полигон "двухпутка симуляции реконструкции" не может быть корректно обработан так как там двухпутные перегоны между станциями имеют разную разрешенную скорость и разное перегонное время. Вилка: 1. Переписывать структуру хранения данных, чтобы можно был иметь двух-(многопутные) перегоны. 2. Пока что забить на переписывание структуры, дописывать графику пульта.
| |
| |
V9 | Дата: Суббота, 16.08.2025, 10:03 | Сообщение # 555 |
Поездной диспетчер
Группа: Пользователи
Сообщений: 596
Награды: 12
Репутация: 3
Статус: Offline
| Выписал шесть задач "на первое время" по DSim. а) 6. Отправление-прием-проследование с пульта. 6.1 Отправление. б) 12. Ошибка отрисовки ГИД: линия уходит на север от НВ1. в) 13. Ошибка отрисовки ГИД: дважды дублируется час справа. г) 14. Ошибка отрисовки ГИД: поезд, вставший перед Сурмятиным, рисуется за ним. д) 15. Проект: Переделка структуры stationStretchInfo. е) 16. Ошибка отрисовки ГИД: перелом суток очищает нитки. После рестарта нитки восстанавливаются.
Сгенерировал через онлайн генератор случайное число от 1 до 6:
 Генератор мнге выбрал делать "отправление поезда с пульта". Да будет так!  Добавлено (16.08.2025, 18:40) --------------------------------------------- Нечеловечески сложно вести разработку с учетом моих же ограничений на разработку. Пора самому себе снимать ограничения. Хотя бы по минимуму. Потому что черезчур медленно и сложно получается в данный момент. Добавлено (17.08.2025, 21:47) --------------------------------------------- Придумал красивое решение одной проблемы. До сего момента текущее симуляторное время вычислялось по последнему событию в GID.txt.
Проблема. Вот запускается сим. Движок прочитал GID.txt и определился какое сейчас время внутри. И начал считать время дальше. Демонстратор Пульта тоже прочитал GID.txt, чтобы правильно отобразить занятость путей и тоже может определился по времени. Далее демонстратор считает свое время, а Движок - свое. Проблема в том, что движок может считать быстрей так как может действовать ускорение. Если у нас поезда двигаются, то GID.txt обновляется движком, а значит Демонстратор Пульта тоже может обновить свое время.
Но пусть поездов мало и они не двигались. Скажем десять минут по времени симулятора, 00:10 по 00:20, поезда не ехали на ускорении 4х - это 2.5 минуты реального. Подходит время отправлять пассажирский. Юзер с пульта дает команду на отправление. С точки зрения пульта прошло 2.5 минуты с момент последнего события. Сейчас 00:12:30. Пусть отдана команда проехать перегон с Сургута и до Силинского. Тогда Пульт запишет время отправления 00:12:30, а прибытие в Силинский, скажем, 00:24:30.
Движок же увидит распоряжение, но с точки зрения движка оно "опоздало". Он скорректирует время отправления до 00:20:00, а прибытие менять не будет и оставит 00:24:30. И нарисует нитку с Сургута до Силинского за 4 минуты 30 секунд.
Сейчас сделал так, что движок, когда определяет, что наступила новая секунда виртуального времени, обновляет дату/время в отдельном файлике.
Демонстратор Пульта при получении команды и проверки на правильность, прочитает последнее время, скорректирует на секунду и сделает расчеты "от текущего момента". В нашей ситуации, отправит поезд в 0:20:00 с прибытием в Силинский 00:32:00. Нарисуется верная нитка длиной 12 минут.
| |
| |
|