// //-----------------------------ГТА СА: НОВЫЙ АЛГОРИТМ ДВИЖЕНИЯ ПОЕЗДОВ, ВЕРСИЯ 5--------(by Den_spb)------------------------------------------- // // -----------------------------------------------------------------------------------------------------------------------Назначение переменных { 0@ - одноразовое дробное число (значение используется в пределах одной операции или последовательной группы операций) 1@ - одноразовое дробное число 2@ - одноразовое дробное число 3@ - одноразовое дробное число 4@ - одноразовое дробное число 5@ - указатель на маркер внутреннего поезда 6@ - одноразовое дробное число 7@ - одноразовое целое число 8@ - указатель на внутренний поезд 9@ - указатель на внешний поезд 10@ - указатель на маркер внешнего поезда 11@ - минимальное расстояние внутреннего поезда до точки остановки, при котором может включиться торможение 12@ - максимальное расстояние внутреннего поезда до точки остановки, при котором может включиться торможение 13@ - минимальное расстояние внешнего поезда до точки остановки, при котором может включиться торможение 14@ - максимальное расстояние внешнего поезда до точки остановки, при котором может включиться торможение 15@ - запись значения производится из адреса памяти при проверке траффика поездов (вкл или откл) 16@ - значение, с которым сравнивается значение таймера событий внутреннего поезда (ожидание перед созданием поезда, стоянка на станции) 17@ - значение, с которым сравнивается значение таймера событий внешнего поезда (ожидание перед созданием поезда, стоянка на станции) 18@ - статус внутреннего поезда. Значения статусов 0 - поезд не существует. Время, по истечении которого может быть создан поезд, не отсчитывается 1 - поезд не существует. Время, по истечении которого может быть создан поезд, отсчитывается или уже истекло 2 - поезд существует 3 - поезд тормозит на станции 4 - поезд стоит на станции 19@ - статус внешнего поезда. Значения те же. 20@ - одноразовое целое число 21@ - одноразовое целое число 22@ - одноразовое целое число 23@ - одноразовое целое число 24@ - одноразовое целое число 25@ - одноразовое целое число 26@ - указатель на внутренний мачтовый светофор 27@ - указатель на внешний мачтовый светофор 28@ - одноразовое дробное число 29@ - одноразовое дробное число 30@ - флаг автоведения внутреннего поезда. Значения 0 - в кабине поезда CJ либо поезд не существует - автоведение отключено 1 - в кабине поезда бот - автоведение включено 31@ - флаг автоведения внешнего поезда. Значения те же. 32@ - таймер 1. Используется в событиях внутреннего поезда 33@ - таймер 2. Используется в событиях внешнего поезда } //------------------------------------------------------------------------------------------------------------------------------Начало скрипта {$CLEO .cs} wait 1000 0A95: enable_thread_saving // чтобы объекты (светофоры), созданные скриптом, не оставались на карте после сохранения игры var // идентификация типа переменных 20@ : Integer 22@ : Integer 23@ : Integer 24@ : Integer 25@ : Integer end 16@ = 0 17@ = 0 30@ = 0 31@ = 0 32@ = 0 33@ = 0 while true //------------------------------------------------------------------------------------------------------------Главный цикл скрипта wait 0 if //--------------------------------------------------------------------------Операции для внутреннего поезда (поезд пока не существует) 856E: not car 8@ defined then if 18@ <> 1 then 18@ = 1 0209: 16@ = random_int_in_ranges 60 121 // min и max время в секундах, по истечении которого может быть создан внутренний поезд 16@ *= 1000 32@ = 0 else 0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0 // читаем адрес памяти, чтобы узнать, вкл или откл траффик поездов if and 15@ == 0 // траффик включен, следовательно ж д миссии не запущены. Можем продолжать 001D: 32@ > 16@ // (int) then actor.StorePos($PLAYER_ACTOR,3@,4@,6@) if or 3@ < 956.0 4@ < 1281.0 856E: not car 9@ defined // если игрок в однопутной зоне и существует внешний поезд, то внутренний поезд создан не будет then // вся плоскость игровой карты делится на части. Минимум - на 2, в этом скрипте - на 4 (карта делится осями Y и X) // в каждой части карты должны проходить ж д пути, иначе деление нецелесообразно if 3@ >= 0.0 // игрок в правой половине карты then if 4@ >= 0.0 then 21@ = 1 // номер квадранта else 21@ = 2 end else if 4@ >= 0.0 then 21@ = 4 else 21@ = 3 end end // Файл tracks2.dat делится на наборы в соответствии с делением плоскости карты. После того, как определено, // в какой части карты находится игрок, выбирается соответствующий набор точек. // Далее производится последовательная проверка расстояния игрока до точек набора. // Проверка осуществляется от дальних точек к ближним, по ходу движения поезда. // Расстояние между точками около 300 м (менее 300 м). Первая точка набора берётся не у границы части карты (квадранта), // а на 600 м раньше - на случай, если игрок находится вблизи границы квадрантов (частей карты). // Проверяются два набора точек - тот, который соответствует части карты и следующий, по ходу движения поезда. // Если расстояние между игроком и точкой меньше 600 м, то осуществляется переход на код создания поезда. // Иначе, после проверки двух наборов выполнение данной части кода прекращается. // Понятно, что поезд может быть создан на расстоянии 300 - 600 м от игрока. // Для внешнего поезда эта часть кода аналогична, только наборы будут проверяться в обратном порядке, // тоже по ходу движения поезда. Файл маршрута для внешнего поезда - tracks4.dat if 21@ == 1 then jump @kvad_1t1 end if 21@ == 2 then jump @kvad_2t1 end if 21@ == 3 then jump @kvad_3t1 end if 21@ == 4 then jump @kvad_4t1 end :kvad_1t1 //------------------------------------------------------------------------------Внутренний поезд. Набор точек 1 0@ = -598.09 // данная часть кода была написана pas-программой автоматически 1@ = 1188.22 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ // расстояние между игроком и точкой 2@ > 600.0 // если расстояние меньше 600 м, то перейти на код создания поезда jf @create1 // метка, где начинается код создания поезда 0@ = -325.94 1@ = 1248.88 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -35.79 1@ = 1293.15 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 241.37 1@ = 1229.34 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 536.14 1@ = 1247.17 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 739.12 1@ = 1461.33 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 742.99 1@ = 1697.59 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 742.51 1@ = 1787.34 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 740.75 1@ = 2026.49 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 726.84 1@ = 2321.07 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 801.16 1@ = 2609.48 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1072.24 1@ = 2722.62 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1236.12 1@ = 2632.27 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1481.99 1@ = 2632.34 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1774.87 1@ = 2675.03 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2021.92 1@ = 2694.18 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2229.69 1@ = 2690.17 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2519.59 1@ = 2639.43 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2552.81 1@ = 2344.89 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2735.05 1@ = 2111.73 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2781.06 1@ = 1816.16 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2856.25 1@ = 1531.03 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2864.77 1@ = 1239.22 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2764.76 1@ = 983.25 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2764.79 1@ = 743.27 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 if 21@ == 4 // если игрок находится в 4 квадранте, то заканчиваем проверку then jump @_5 // метка, расположенная после кода создания поезда end :kvad_2t1 //---------------------------------------------------------------------------Внутренний поезд. Набор точек 2 0@ = 2765.28 1@ = 528.72 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2781.32 1@ = 239.50 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2827.61 1@ = 36.33 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2763.10 1@ = -250.25 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2467.57 1@ = -275.00 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2192.47 // point 1 1@ = -357.99 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2122.11 // point 2 1@ = -647.61 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2284.98 1@ = -897.82 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2284.99 1@ = -1186.05 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2273.19 1@ = -1484.06 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 2198.65 1@ = -1760.34 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1989.68 1@ = -1953.75 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1696.98 1@ = -1953.73 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1398.43 1@ = -1948.14 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1197.64 1@ = -1779.76 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 1002.70 1@ = -1556.24 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 815.00 1@ = -1366.51 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 778.25 1@ = -1333.63 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 if 21@ == 1 then jump @_5 end :kvad_3t1 //-------------------------------------------------------------------------Внутренний поезд. Набор точек 3 wait 0 0@ = 589.52 1@ = -1187.75 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 335.44 1@ = -1061.40 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = 49.59 1@ = -1018.00 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -237.89 1@ = -1069.90 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -470.71 1@ = -1253.47 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -742.62 1@ = -1133.88 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -847.02 1@ = -1404.64 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1113.11 1@ = -1514.30 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1392.21 1@ = -1509.24 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1676.36 1@ = -1465.42 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1876.64 1@ = -1258.10 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1976.75 1@ = -995.47 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1978.81 1@ = -717.47 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 if 21@ == 2 then jump @_5 end :kvad_4t1 //--------------------------------------------------------------------------Внутренний поезд. Набор точек 4 0@ = -1980.12 1@ = -592.06 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1960.09 1@ = -296.04 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1944.42 1@ = -11.95 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1942.72 1@ = 171.88 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1756.16 1@ = 399.26 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1523.12 1@ = 568.50 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1290.21 1@ = 737.81 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -1082.96 1@ = 888.28 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -992.44 1@ = 954.08 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 0@ = -760.64 1@ = 1122.39 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create1 if 21@ == 3 then jump @_5 end jump @kvad_1t1 :create1 //---------------------------------------------------------------------------------Создание внутреннего поезда wait 0 0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0 if 15@ == 0 // траффик поездов включен (ж д миссии не запущены) then while true wait 0 0209: 21@ = random_int_in_ranges 0 16 // выбираем тип поезда (1-15) if and 21@ <> 8 21@ <> 9 21@ <> 14 // если тип поезда не трамвайный, то выбор сделан then break // выход из цикла end end 7@ = -382234 // начало блока адресов памяти, в которых записаны ИД модели вагонов всех поездов 21@ *= 16 // номер типа * максимальное количество вагонов в типе 005A: 7@ += 21@ // (int) - находим начало выбранного типа поезда 0016: 21@ /= 16 12@ = -1.0 // зависимость тормозного пути от кол-ва вагонов на скорости 60 км/ч определяется формулой // Тп = 6,643 + 6,357 * количество вагонов while &0(7@,1i) <> 0 // пока ИД вагона ненулевой wait 0 Model.Load(&0(7@,1i)) // загружаем необходимые модели 12@ += 1.0 // и одновременно считаем минимальный тормозной путь 7@ += 1 end 038B: load_requested_models if 12@ == 0.0 else_jump @NONAME_4720 12@ = 67.0 jump @NONAME_5276 :NONAME_4720 if 12@ == 1.0 else_jump @NONAME_4762 12@ = 88.0 jump @NONAME_5276 :NONAME_4762 if 12@ == 2.0 else_jump @NONAME_4804 12@ = 108.0 jump @NONAME_5276 :NONAME_4804 if 12@ == 3.0 else_jump @NONAME_4846 12@ = 128.0 jump @NONAME_5276 :NONAME_4846 if 12@ == 4.0 else_jump @NONAME_4888 12@ = 146.0 jump @NONAME_5276 :NONAME_4888 if 12@ == 5.0 else_jump @NONAME_4930 12@ = 163.0 jump @NONAME_5276 :NONAME_4930 if 12@ == 6.0 else_jump @NONAME_4972 12@ = 179.0 jump @NONAME_5276 :NONAME_4972 if 12@ == 7.0 else_jump @NONAME_5014 12@ = 195.0 jump @NONAME_5276 :NONAME_5014 if 12@ == 8.0 else_jump @NONAME_5056 12@ = 210.0 jump @NONAME_5276 :NONAME_5056 if 12@ == 9.0 else_jump @NONAME_5098 12@ = 223.0 jump @NONAME_5276 :NONAME_5098 if 12@ == 10.0 else_jump @NONAME_5140 12@ = 235.0 jump @NONAME_5276 :NONAME_5140 if 12@ == 11.0 else_jump @NONAME_5182 12@ = 245.0 jump @NONAME_5276 :NONAME_5182 if 12@ == 12.0 else_jump @NONAME_5224 12@ = 261.0 jump @NONAME_5276 :NONAME_5224 if 12@ == 13.0 else_jump @NONAME_5266 12@ = 268.0 jump @NONAME_5276 :NONAME_5266 12@ = 277.0 :NONAME_5276 0087: 11@ = 12@ // (float) 11@ += -40.0 // при скорости 60 км/ч разница между мин. и макс. тормозными путями 20 м 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 while &0(7@,1i) <> 0 // последовательно проверяем, загружены ли модели repeat wait 0 until Model.Available(&0(7@,1i)) 7@ += 1 end 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 7@ += 14 // адрес модели 14 вагона выбранного типа if and // можно сделать поезд 19 вагонным, но только если выполнены условия &0(7@,1i) <> 0 // в поезде будет существовать 14 вагон 21@ < 7 // тип поезда 0-6 (остальные типы - это трамваи и поезда, используемые в миссиях) then 22@ = &0(7@,1i) // ИД 14 вагона 7@ += 1 &0(7@,1i) = 22@ // ИД вагона 15 (0) заменена на 14 7@ += 1 23@ = &0(7@,1i) // сохраняем в памяти ИД вагона 16 (первый вагон следующего за выбранным типа) &0(7@,1i) = 22@ // назначаем ИД 16 вагона такой же, как у 14 7@ += 1 20@ = &0(7@,1i) // ИД 17 вагона &0(7@,1i) = 22@ 7@ += 1 24@ = &0(7@,1i) // ИД 18 вагона &0(7@,1i) = 22@ 7@ += 1 25@ = &0(7@,1i) // ИД 19 вагона (последнего) &0(7@,1i) = 0 end // в файле маршрутов стандартной игры есть 2 особые точки // внутренний путь в тех местах располагается выше, чем соседний путь. // Поэтому поезд создается на пути противоположного направления. // Чтобы этого избежать, задаем высоту создания поезда для этих точек отдельно. if and 0@ == 2192.47 // особая точка 1 1@ == -357.99 then 06D8: 8@ = create_train_at 0@ 1@ 60.0 type 21@ direction 1 else if and 0@ == 2122.11 // особая точка 2 1@ == -647.61 then 06D8: 8@ = create_train_at 0@ 1@ 70.0 type 21@ direction 1 else // выбрана какая-то другая точка 06D8: 8@ = create_train_at 0@ 1@ 0.0 type 21@ direction 1 end // высоту для всех остальных точек можно брать одинаковую - 0.0 end 18@ = 2 30@ = 1 06DC: set_train 8@ acc 27.78 // назначаемая поезду скорость - 06DD: set_train 8@ speed 27.78 // 60 км/ч if $ONMISSION == 0 // во время миссии маркер будет мешать then 5@ = Marker.CreateAboveCar(8@) Marker.SetColor(5@, 0) 018B: set_marker 5@ radar_mode 2 end 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 7@ += 14 if and // если были прицеплены дополнительные вагоны, то восстанавливаем значения ИД &0(7@,1i) <> 0 21@ < 7 then 7@ += 1 // 15 &0(7@,1i) = 0 7@ += 1 // 16 &0(7@,1i) = 23@ 7@ += 1 // 17 &0(7@,1i) = 20@ 7@ += 1 // 18 &0(7@,1i) = 24@ 7@ += 1 // 19 &0(7@,1i) = 25@ end 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 while &0(7@,1i) <> 0 // удаляем модели вагонов из памяти wait 0 Model.Destroy(&0(7@,1i)) 7@ += 1 end end end end end end :_5 wait 0 if //---------------------------------------------------------------------------Операции для внешнего поезда (поезд пока не существует) 856E: not car 9@ defined then if 19@ <> 1 then 19@ = 1 0209: 17@ = random_int_in_ranges 60 121 // min и max время в секундах, по истечении которого может быть создан внешний поезд 17@ *= 1000 33@ = 0 else 0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0 // читаем адрес памяти, чтобы узнать, вкл или откл траффик поездов if and 15@ == 0 // траффик включен, следовательно ж д миссии не запущены. Можем продолжать 001D: 33@ > 17@ // (int) then actor.StorePos($PLAYER_ACTOR,3@,4@,6@) if or 3@ < 956.0 4@ < 1281.0 // если игрок в однопутной зоне, внешний поезд создан не будет then if 3@ >= 0.0 // игрок в правой половине карты then if 4@ >= 0.0 then 21@ = 1 // номер квадранта else 21@ = 2 end else if 4@ >= 0.0 then 21@ = 4 else 21@ = 3 end end if 21@ == 1 then jump @kvad_1t4 end if 21@ == 2 then jump @kvad_2t4 end if 21@ == 3 then jump @kvad_3t4 end if 21@ == 4 then jump @kvad_4t4 end :kvad_4t4 //------------------------------------------------------------------------------Внешний поезд. Набор точек 4 0@ = 515.98 1@ = 1240.23 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 226.84 1@ = 1238.51 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -53.40 1@ = 1296.12 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -347.38 1@ = 1247.21 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -631.83 1@ = 1185.07 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -880.27 1@ = 1040.72 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1030.44 1@ = 931.37 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1240.99 1@ = 778.43 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1342.19 1@ = 704.87 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 if 21@ == 1 then jump @_6 end :kvad_3t4 //----------------------------------------------------------------------------Внешний поезд. Набор точек 3 wait 0 0@ = -1498.99 1@ = 590.90 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1601.06 1@ = 516.83 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1837.42 1@ = 347.58 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1948.42 1@ = 100.00 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1950.42 1@ = -190.28 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1982.39 1@ = -488.08 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1982.55 1@ = -768.10 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1971.89 1@ = -1059.67 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1846.91 1@ = -1309.37 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1629.08 1@ = -1486.73 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1347.52 1@ = -1513.87 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -1053.53 1@ = -1508.42 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -835.57 1@ = -1370.31 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -718.41 1@ = -1128.25 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 if 21@ == 4 then jump @_6 end :kvad_2t4 //------------------------------------------------------------------------------Внешний поезд. Набор точек 2 0@ = -596.65 1@ = -1164.91 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -349.44 1@ = -1223.16 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = -137.48 1@ = -1027.47 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 151.78 1@ = -1026.41 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 438.87 1@ = -1107.08 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 690.56 1@ = -1266.07 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 910.87 1@ = -1464.63 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 1097.41 1@ = -1669.80 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 1293.72 1@ = -1894.03 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 1573.67 1@ = -1957.68 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 1857.49 1@ = -1957.93 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2152.76 1@ = -1957.85 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2205.95 1@ = -1686.16 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2288.74 1@ = -1407.02 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2288.95 1@ = -1110.09 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2281.21 1@ = -816.01 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2078.88 1@ = -607.04 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 if 21@ == 3 then jump @_6 end :kvad_1t4 //-------------------------------------------------------------------------------Внешний поезд. Набор точек 1 0@ = 2062.91 1@ = -593.55 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2087.84 1@ = -365.31 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2367.59 1@ = -284.31 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2661.26 1@ = -298.92 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2832.24 1@ = -92.44 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2805.30 1@ = 182.18 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2769.17 1@ = 442.68 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2768.74 1@ = 701.56 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2768.72 1@ = 983.27 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2868.74 1@ = 1239.21 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2860.00 1@ = 1532.27 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2785.01 1@ = 1782.76 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2765.17 1@ = 2066.97 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2563.53 1@ = 2264.64 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2551.77 1@ = 2560.03 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2342.07 1@ = 2694.16 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 2092.40 1@ = 2694.22 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 1797.40 1@ = 2682.39 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 1510.13 1@ = 2636.25 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 1212.03 1@ = 2637.34 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 957.59 1@ = 2762.66 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 768.57 1@ = 2550.89 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 725.39 1@ = 2288.51 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 736.95 1@ = 2009.09 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 738.76 1@ = 1746.69 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 735.12 1@ = 1461.95 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 0@ = 616.45 1@ = 1297.93 0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ 2@ > 600.0 jf @create4 if 21@ == 2 then jump @_6 end jump @kvad_4t4 :create4 //-------------------------------------------------------------------------------------создание внешнего поезда wait 0 0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0 if 15@ == 0 // траффик поездов включен (ж д миссии не запущены) then while true wait 0 0209: 21@ = random_int_in_ranges 0 16 // выбираем тип поезда (1-15) if and 21@ <> 8 21@ <> 9 21@ <> 14 // если тип поезда не трамвайный, то выбор сделан then break // выход из цикла end end 7@ = -382234 // начало блока адресов памяти, в которых записаны ИД модели вагонов всех поездов 21@ *= 16 // номер типа * максимальное количество вагонов в типе 005A: 7@ += 21@ // (int) - находим начало выбранного типа поезда 0016: 21@ /= 16 14@ = -1.0 // зависимость тормозного пути от кол-ва вагонов на скорости 60 км/ч определяется формулой // Тп = 6,643 + 6,357 * количество вагонов while &0(7@,1i) <> 0 // пока ИД вагона ненулевой wait 0 Model.Load(&0(7@,1i)) // загружаем необходимые модели 14@ += 1.0 // и одновременно считаем минимальный тормозной путь 7@ += 1 end 038B: load_requested_models if 14@ == 0.0 else_jump @NONAME_10619 14@ = 67.0 jump @NONAME_11175 :NONAME_10619 if 14@ == 1.0 else_jump @NONAME_10661 14@ = 88.0 jump @NONAME_11175 :NONAME_10661 if 14@ == 2.0 else_jump @NONAME_10703 14@ = 108.0 jump @NONAME_11175 :NONAME_10703 if 14@ == 3.0 else_jump @NONAME_10745 14@ = 128.0 jump @NONAME_11175 :NONAME_10745 if 14@ == 4.0 else_jump @NONAME_10787 14@ = 146.0 jump @NONAME_11175 :NONAME_10787 if 14@ == 5.0 else_jump @NONAME_10829 14@ = 163.0 jump @NONAME_11175 :NONAME_10829 if 14@ == 6.0 else_jump @NONAME_10871 14@ = 179.0 jump @NONAME_11175 :NONAME_10871 if 14@ == 7.0 else_jump @NONAME_10913 14@ = 195.0 jump @NONAME_11175 :NONAME_10913 if 14@ == 8.0 else_jump @NONAME_10955 14@ = 210.0 jump @NONAME_11175 :NONAME_10955 if 14@ == 9.0 else_jump @NONAME_10997 14@ = 223.0 jump @NONAME_11175 :NONAME_10997 if 14@ == 10.0 else_jump @NONAME_11039 14@ = 235.0 jump @NONAME_11175 :NONAME_11039 if 14@ == 11.0 else_jump @NONAME_11081 14@ = 245.0 jump @NONAME_11175 :NONAME_11081 if 14@ == 12.0 else_jump @NONAME_11123 14@ = 261.0 jump @NONAME_11175 :NONAME_11123 if 14@ == 13.0 else_jump @NONAME_11165 14@ = 268.0 jump @NONAME_11175 :NONAME_11165 14@ = 277.0 :NONAME_11175 0087: 13@ = 14@ // (float) 13@ += -40.0 // при скорости 60 км/ч разница между мин. и макс. тормозными путями 20 м 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 while &0(7@,1i) <> 0 // последовательно проверяем, загружены ли модели repeat wait 0 until Model.Available(&0(7@,1i)) 7@ += 1 end 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 7@ += 14 // адрес модели 14 вагона выбранного типа if and // можно сделать поезд 19 вагонным, но только если выполнены условия &0(7@,1i) <> 0 // в поезде будет существовать 14 вагон 21@ < 7 // тип поезда 0-6 (остальные типы - это трамваи и поезда, используемые в миссиях) then 22@ = &0(7@,1i) // ИД 14 вагона 7@ += 1 &0(7@,1i) = 22@ // ИД вагона 15 (0) заменена на 14 7@ += 1 23@ = &0(7@,1i) // сохраняем в памяти ИД вагона 16 (первый вагон следующего за выбранным типа) &0(7@,1i) = 22@ // назначаем ИД 16 вагона такой же, как у 14 7@ += 1 20@ = &0(7@,1i) // ИД 17 вагона &0(7@,1i) = 22@ 7@ += 1 24@ = &0(7@,1i) // ИД 18 вагона &0(7@,1i) = 22@ 7@ += 1 25@ = &0(7@,1i) // ИД 19 вагона (последнего) &0(7@,1i) = 0 end 06D8: 9@ = create_train_at 0@ 1@ 0.0 type 21@ direction 0 // высоту для всех точек можно взять одинаковую - 0.0 19@ = 2 31@ = 1 06DC: set_train 9@ acc 27.78 // назначаемая поезду скорость - 06DD: set_train 9@ speed 27.78 // 60 км/ч if $ONMISSION == 0 // во время миссии маркер будет мешать then 10@ = Marker.CreateAboveCar(9@) Marker.SetColor(10@, 1) 018B: set_marker 10@ radar_mode 2 end 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 7@ += 14 if and // если были прицеплены дополнительные вагоны, то восстанавливаем значения ИД &0(7@,1i) <> 0 21@ < 7 then 7@ += 1 // 15 &0(7@,1i) = 0 7@ += 1 // 16 &0(7@,1i) = 23@ 7@ += 1 // 17 &0(7@,1i) = 20@ 7@ += 1 // 18 &0(7@,1i) = 24@ 7@ += 1 // 19 &0(7@,1i) = 25@ end 7@ = -382234 21@ *= 16 005A: 7@ += 21@ // (int) 0016: 21@ /= 16 while &0(7@,1i) <> 0 // удаляем модели вагонов из памяти wait 0 Model.Destroy(&0(7@,1i)) 7@ += 1 end end end end end end :_6 // --------------------------------------------------------------------------------------------------Операции с мачтовыми светофорами wait 0 // вся трасса, вдоль котой расставляются светофоры, делится на определённое число блок-участков. // Пары мачтовых светофоров расставляются вблизи определённых точек на границах блок-участков. В данном скрипте определено 13 точек. // Нормальная длина блок-участка около 1000 м, минимальная рекомендуемая 600 м (т к в любой момент времени существует только 1 пара светофоров) // Начинаем с определения ближайшей к игроку точки, рядом с которой будет установлена пара светофоров // Для этого вычисляем расстояние между игроком и каждой точкой, выбираем наименьшее значение 00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@ 3@ = 1431.0647 // X точки 1 4@ = 2634.4133 // Y точки 1 0509: 2@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ // вычисляем расстояние 20@ = 1 // записываем порядковый номер точки 3@ = 2550.8633 // берем координаты следующей точки 4@ = 2498.4736 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ // определяем дистанцию if 0025: 2@ > 6@ // (float) // если расстояние игрока до 2 точки меньше, чем до первой then 0087: 2@ = 6@ // (float) // то сохраняем меньшее значение 20@ = 2 // и номер точки end 3@ = 2866.9167 4@ = 1287.7421 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 3 end 3@ = 2791.6074 4@ = 218.3158 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 4 end 3@ = 2284.8879 4@ = -331.9585 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 5 end 3@ = 2287.0544 4@ = -1051.7172 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 6 end 3@ = 1919.104 4@ = -1955.9293 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 7 end 3@ = -21.6351 4@ = -1020.1892 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 8 end 3@ = -1260.7156 4@ = -1515.5342 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 9 end 3@ = -1946.1219 4@ = 134.2469 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 10 end 3@ = -915.0107 4@ = 1012.6142 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 11 end 3@ = 156.3303 4@ = 1265.4232 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 12 end 3@ = 739.1387 4@ = 1994.1334 0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 0025: 2@ > 6@ // (float) then 0087: 2@ = 6@ // (float) 20@ = 13 end // После выполнения данной операции, стал известен номер ближайшей к игроку точки // Теперь, в соответствии с номером точки, вычисляются координаты установки светофоров и углы их поворота // Также определяются цвета (модели светофоров) if 20@ == 1 // Если номер ближайшей к игроку точки - 1, то then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 0@ > 1483.521// train position - позиция поезда относительно светофора (условие назначения красного сигнала) // Предположим, поезд подъезжает к светофору по направлению запад-восток // Тогда, если X координата поезда больше X координаты светофора, значит, поезд уже проехал светофор // Условие выполнено и будет назначен красный сигнал then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 // если поезд не существует и с момента исчезновения последнего поезда прошло менее 30000 мс (30 сек) // то будет назначен желтый сигнал then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if // аналогичная операция для внешнего поезда и светофора 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 0@ < 1380.6613// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end // Теперь назначаем координаты и углы поворота светофоров 0@ = 1483.521 // x координата внутреннего светофора 1@ = 2629.804 // y координата внутреннего светофора 2@ = 9.8203 // z координата внутреннего светофора 28@ = 90.0 // z угол внутреннего светофора. Следующие параметры - аналогичные, только для внешнего светофора. 3@ = 1380.6613 4@ = 2638.6968 6@ = 9.8203 29@ = 270.0 jump @lights_1 // назначение координат и моделей выполнено, можно выйти из данной секции end if 20@ == 2 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 1@ < 2489.8071// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 1@ > 2507.032// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 2545.4644 1@ = 2489.8071 2@ = 9.8203 28@ = 0.0 3@ = 2555.9687 4@ = 2507.032 6@ = 9.8203 29@ = 180.0 jump @lights_1 end if 20@ == 3 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 1@ < 1226.0918// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 1@ > 1341.5892// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 2861.7556 1@ = 1226.0918 2@ = 9.8203 28@ = 0.0 3@ = 2871.428 4@ = 1341.5892 6@ = 9.8203 29@ = 180.0 jump @lights_1 end if 20@ == 4 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 1@ < 208.3398// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 1@ > 228.1062// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 2790.0676 1@ = 208.3398 2@ = 10.4456 28@ = 17.1433 3@ = 2793.0969 4@ = 228.1062 6@ = 9.3835 29@ = 197.625 jump @lights_1 end if 20@ == 5 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if and 0@ < 2274.7961// train position 1@ > -481.795 then 21@ = 18633 // set traffic light color to red else if 1@ < -481.795 then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if and 1@ > -481.795// train position 0@ > 2294.8137 then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 2274.7961 1@ = -332.2822 2@ = 37.0372 28@ = 298.171 3@ = 2294.8137 4@ = -331.2238 6@ = 34.7746 29@ = 122.6793 jump @lights_1 end if 20@ == 6 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 1@ < -1060.2272// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 1@ > -1042.8805// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 2281.8567 1@ = -1060.2272 2@ = 25.8661 28@ = 0.0 3@ = 2292.123 4@ = -1042.8805 6@ = 25.8325 29@ = 180.0 jump @lights_1 end if 20@ == 7 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 0@ < 1910.3224// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 0@ > 1928.194// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 1910.3224 1@ = -1950.7422 2@ = 12.5547 28@ = 270.0 3@ = 1928.194 4@ = -1961.0897 6@ = 12.5469 29@ = 90.0 jump @lights_1 end if 20@ == 8 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 0@ < -30.3923// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 0@ > -12.0904// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = -30.3923 1@ = -1014.865 2@ = 19.3695 28@ = 270.0 3@ = -12.0904 4@ = -1025.2236 6@ = 19.7471 29@ = 90.0 jump @lights_1 end if 20@ == 9 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 0@ < -1268.5348// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 0@ > -1252.0717// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = -1268.5348 1@ = -1509.6836 2@ = 25.4872 28@ = 265.262 3@ = -1252.0717 4@ = -1521.1899 6@ = 27.1844 29@ = 86.347 jump @lights_1 end if 20@ == 10 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 1@ > 206.1199// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 1@ < 61.969// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = -1936.4524 1@ = 206.1199 2@ = 24.5516 28@ = 180.0 3@ = -1951.3076 4@ = 61.969 6@ = 24.7109 29@ = 0.0 jump @lights_1 end if 20@ == 11 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 0@ > -905.1539// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 0@ < -925.2382// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = -905.1539 1@ = 1014.1198 2@ = 33.5781 28@ = 125.4259 3@ = -925.2382 4@ = 1011.7167 6@ = 33.5781 29@ = 305.5475 jump @lights_1 end if 20@ == 12 then if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 0@ > 163.6387// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 0@ < 150.1235// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 163.6387 1@ = 1257.507 2@ = 21.837 28@ = 69.524 3@ = 150.1235 4@ = 1273.7073 6@ = 21.6341 29@ = 248.1258 jump @lights_1 end if 056E: car 8@ defined // внутр.поезд существует then car.StorePos(8@,0@,1@,2@) if 1@ > 2002.6312// train position then 21@ = 18633 // set traffic light color to red else 21@ = 18632 // set traffic light color to green end else if 32@ < 30000 then 21@ = 18631 // set traffic light color to yellow else 21@ = 18632 // set traffic light color to green end end if 056E: car 9@ defined // внеш.поезд существует then car.StorePos(9@,0@,1@,2@) if 1@ < 1985.515// train position then 22@ = 18633 // set traffic light color to red else 22@ = 18632 // set traffic light color to green end else if 33@ < 30000 then 22@ = 18631 // set traffic light color to yellow else 22@ = 18632 // set traffic light color to green end end 0@ = 744.1491 1@ = 2002.6312 2@ = 4.7541 28@ = 180.0 3@ = 733.924 4@ = 1985.515 6@ = 4.3359 29@ = 0.0 :lights_1 // ------------------------------------------------------------------------------------создание или замена мачтовых светофоров wait 0 23@ = -382079 // place of traffic lights - в этой общедоступной ячейке памяти сохранен для сравнения номер точки мачтовых светофоров 24@ = -382078 // colour of traffic light 1 - в этой общедоступной ячейке памяти сохранен для сравнения цвет внутр.мачт. светофора if and 003B: 20@ == &0(23@,1i) // (int) 003B: 21@ == &0(24@,1i) // (int) then else // если новый цвет или место установки внутр. светофора не соответствует старому, то model.Load(21@) repeat wait 0 until model.Available(21@) if 03CA: object 26@ exists // если существует старый внутренний светофор, then 0108: destroy_object 26@ // то сначала удаляем его end object.Create(26@,21@,0@,1@,2@) // создаем внутренний светофор 0177: set_object 26@ Z_angle_to 28@ model.Destroy(21@) 0085: &0(24@,1i) = 21@ // (int) // сохраняем цвет светофора в памяти для сравнения end 24@ = -382077 // colour of traffic light 4 - цвет внешнего светофора if and 003B: 20@ == &0(23@,1i) // (int) - номер точки тот же 003B: 22@ == &0(24@,1i) // (int) then else // операции внешних светофоров аналогичны вышеприведенным model.Load(22@) repeat wait 0 until model.Available(22@) if 03CA: object 27@ exists then 0108: destroy_object 27@ end object.Create(27@,22@,3@,4@,6@) 0177: set_object 27@ Z_angle_to 29@ model.Destroy(22@) 0085: &0(23@,1i) = 20@ // (int) save new parameters in memory 0085: &0(24@,1i) = 22@ // (int) end // Конец мачтовых светофоров //-------------------------------------------------------------------------------------алгоритм торможения внутреннего поезда на станции 056E: car 8@ defined // если поезд существует jf @_7 if and 18@ == 2 // имеет подходящий статус 30@ == 1 // и в кабине бот jf @_7 car.StorePos(8@,3@,4@,6@) // тогда определяем позицию поезда и последовательно вычисляем расстояния до точек торможения на станциях 0509: 2@ = distance_between_XY 1474.9031 2634.6375 and_XY 3@ 4@ // 1474.9031 2634.6375 - точка на какой-то станции if and 0025: 12@ > 2@ // (float) если поезд достаточно близко к точке торможения 0025: 2@ > 11@ // (float) но не слишком близко (иначе не успеет затормозить на станции) 3@ < 1474.9031 // смысл этого условия следующий // предположим, поезд приближается к станции по направлению юг-север. Тогда, если Y координата поезда меньше Y координаты точки остановки, // то это значит, что поезд подъезжает к станции, а не отъезжает от неё - можно включить торможение then 06DD: set_train 8@ speed 0.0 // включаем торможение 18@ = 3 // присваиваем новый статус jump @_7 // выходим из данной секции end 0509: 2@ = distance_between_XY 2866.8667 1246.4919 and_XY 3@ 4@ if and 0025: 12@ > 2@ // (float) 0025: 2@ > 11@ // (float) 4@ > 1246.4919 then 06DD: set_train 8@ speed 0.0 18@ = 3 jump @_7 end 0509: 2@ = distance_between_XY 1696.873 -1955.7689 and_XY 3@ 4@ if and 0025: 12@ > 2@ // (float) 0025: 2@ > 11@ // (float) 3@ > 1696.873 then 06DD: set_train 8@ speed 0.0 18@ = 3 jump @_7 end 0509: 2@ = distance_between_XY 784.326 -1341.736 and_XY 3@ 4@ if and 0025: 12@ > 2@ // (float) 0025: 2@ > 11@ // (float) 3@ > 784.326 then 06DD: set_train 8@ speed 0.0 18@ = 3 jump @_7 end 0509: 2@ = distance_between_XY -1943.7788 183.2991 and_XY 3@ 4@ if and 0025: 12@ > 2@ // (float) 0025: 2@ > 11@ // (float) 4@ < 183.2991 then 06DD: set_train 8@ speed 0.0 18@ = 3 end :_7 //---------------------------------------------------------------------------------------------------алгоритм торможения внешнего поезда 056E: car 9@ defined // команды те же, что и для внутреннего поезда jf @_8 if and 19@ == 2 31@ == 1 jf @_8 car.StorePos(9@,3@,4@,6@) 0509: 2@ = distance_between_XY 1392.7462 2634.2546 and_XY 3@ 4@ if and 0025: 14@ > 2@ // (float) 0025: 2@ > 13@ // (float) 3@ > 1392.7462 then 06DD: set_train 9@ speed 0.0 19@ = 3 jump @_8 end 0509: 2@ = distance_between_XY 2867.2666 1330.1616 and_XY 3@ 4@ if and 0025: 14@ > 2@ // (float) 0025: 2@ > 13@ // (float) 4@ < 1330.1616 then 06DD: set_train 9@ speed 0.0 19@ = 3 jump @_8 end 0509: 2@ = distance_between_XY 1778.1157 -1955.7063 and_XY 3@ 4@ if and 0025: 14@ > 2@ // (float) 0025: 2@ > 13@ // (float) 3@ < 1778.1157 then 06DD: set_train 9@ speed 0.0 19@ = 3 jump @_8 end 0509: 2@ = distance_between_XY 841.0762 -1393.855 and_XY 3@ 4@ if and 0025: 14@ > 2@ // (float) 0025: 2@ > 13@ // (float) 3@ < 841.0762 then 06DD: set_train 9@ speed 0.0 19@ = 3 jump @_8 end 0509: 2@ = distance_between_XY -1946.4993 81.0843 and_XY 3@ 4@ if and 0025: 14@ > 2@ // (float) 0025: 2@ > 13@ // (float) 4@ > 81.0843 then 06DD: set_train 9@ speed 0.0 19@ = 3 end :_8 if //-------------------------------------------------------------------------------------Назначение времени стоянки внутреннему поезду 056E: car 8@ defined then if and 18@ == 3 30@ == 1 01C1: car 8@ stopped then 18@ = 4 0209: 16@ = random_int_in_ranges 15 21 // мин и макс время стоянки внутреннего поезда в секундах wait 0 16@ *= 1000 32@ = 0 end end if //-------------------------------------------------------------------------------------Назначение времени стоянки внешнему поезду 056E: car 9@ defined then if and 19@ == 3 31@ == 1 01C1: car 9@ stopped then 19@ = 4 0209: 17@ = random_int_in_ranges 15 21 // мин и макс время стоянки внешнего поезда в секундах wait 0 17@ *= 1000 33@ = 0 end end if //---------------------------------------------------------------------------------------Отправление внутреннего поезда со станции 056E: car 8@ defined then if and 18@ == 4 30@ == 1 001D: 32@ > 16@ // (int) - время стоянки истекло then 18@ = 2 06DD: set_train 8@ speed 27.78 end end if //-------------------------------------------------------------------------------------------Отправление внешнего поезда со станции 056E: car 9@ defined then if and 19@ == 4 31@ == 1 001D: 33@ > 17@ // (int) - время стоянки истекло then 19@ = 2 06DD: set_train 9@ speed 27.78 end end if //---------------------------------------------------------------------------------------вход игрока в локомотив внутреннего поезда 056E: car 8@ defined then if and not actor.InCar($PLAYER_ACTOR,8@) 0203: actor $PLAYER_ACTOR near_car 8@ radius 8.0 8.0 flag 0 on_foot 00E1: player 0 pressed_key 15 then 05CB: AS_actor $PLAYER_ACTOR enter_car 8@ as_driver -1 ms end end if //-------------------------------------------------------------------------------------------вход игрока в локомотив внешнего поезда 056E: car 9@ defined then if and not actor.InCar($PLAYER_ACTOR,9@) 0203: actor $PLAYER_ACTOR near_car 9@ radius 8.0 8.0 flag 0 on_foot 00E1: player 0 pressed_key 15 then 05CB: AS_actor $PLAYER_ACTOR enter_car 9@ as_driver -1 ms end end if //------------------------------------------------------------------------------------ отключение автоведения для внутреннего поезда 056E: car 8@ defined then if and 30@ == 1 actor.InCar($PLAYER_ACTOR,8@) 09AE: actor $PLAYER_ACTOR driving_train // проверка на случай, если игрок является пассажиром поезда then 30@ = 0 06DD: set_train 8@ speed 0.0 // чтобы поезд не уехал сам, когда игрок выйдет из кабины end end if //---------------------------------------------------------------------------------------- отключение автоведения для внешнего поезда 056E: car 9@ defined then if and 31@ == 1 actor.InCar($PLAYER_ACTOR,9@) 09AE: actor $PLAYER_ACTOR driving_train // проверка на случай, если игрок является пассажиром поезда then 31@ = 0 06DD: set_train 9@ speed 0.0 // чтобы поезд не уехал сам, когда игрок выйдет из кабины end end if //--------------------------------------------------------------------------------------------------------удаление внутреннего поезда 056E: car 8@ defined then actor.StorePos($PLAYER_ACTOR,0@,1@,6@) car.StorePos(8@,3@,4@,6@) 0509: 2@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 2@ > 600.0 // если поезд удалился от игрока более, чем на 600 м then 07BD: destroy_train 8@ // то удаляем поезд 30@ = 0 18@ = 0 end end if //-----------------------------------------------------------------------------------------------------------удаление внешнего поезда 056E: car 9@ defined then actor.StorePos($PLAYER_ACTOR,0@,1@,6@) car.StorePos(9@,3@,4@,6@) 0509: 2@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ if 2@ > 600.0 // если поезд удалился от игрока более, чем на 600 м then 07BD: destroy_train 9@ // то удаляем поезд 31@ = 0 19@ = 0 end end if //------------------------------------------------------------------запись указателя на внутренний поезд в общедоступную ячейку памяти 056E: car 8@ defined then 7@ = -382076 0085: &0(7@,1i) = 8@ // (int) - записываем в память указатель на поезд для синхронизации с другими ж д скриптами end if //---------------------------------------------------------------------запись указателя на внешний поезд в общедоступную ячейку памяти 056E: car 9@ defined then 7@ = -382075 0085: &0(7@,1i) = 9@ // (int) - записываем в память указатель на поезд для синхронизации с другими ж д скриптами end end