Информация: Уважаемые посетители! В течение нескольких месяцев на форуме существовала проблема с регистрацией новых пользователей, о которой администрации стало известно недавно. Если вы ранее пытались зарегистрироваться на форуме, но не получили на ваш e-mail письмо с ссылкой для подтверждения регистрации, просим вас зарегистрироваться повторно. Приносим извинения за доставленные неудобства. Если вы все еще испытываете проблемы с регистрацией на форуме, обратитесь за помощью на e-mail: mr.angelo@railroadsim.net

LuaScript - для RS

Другие вопросы и проблемы разработки дополнений

Re: LuaScript - для RS

Сообщение Света » 27.09.2018, 13:16

Это не некропостинг, если что.
ufox писал(а):У меня не получается заставить писать сообщения в лог.
Mr. Angelo писал(а):Есть такая проблема. Раньше писал, LogMate грабил все логи. А после какого-то обновления перестало.
Так что остается только писать в файл

У меня тоже какое-то время не получалось. На самом деле выводить сообщения скрипта в Logmate можно и сейчас, как минимум в TS2015. Для этого надо в CommandLine вписать команду -lua-debug-messages.
Изображение
Что мне нравится - это указание координат мира и пути к главному конфигу для отправителя сообщения. В случае сообщения об ошибке найти виновника совсем просто :D
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Skif » 27.09.2018, 13:44

А еще можно просто писать данные в текстовый файл - и читать его асинхронно внешним софтом!


На основе этого метода работает моя система пульта для TS. Единственный на рынке желдорсим, который позволяет оживить приборную доску.
Skif
 
Сообщения: 3750
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение радиомастер » 16.10.2018, 19:58

Подскажите пожалуйста вот с чем . Имеется три переменных назовем test1, test2 и test3
Как их объединить и отправить одним сообщением сразу , типа так
Код: Выделить всё
Call( "SendConsistMessage", MSGID, test1test2test3,1 )

а на приеме как то разделить чтобы опять на выходе получились test1, test2 и test3 . типа так
Код: Выделить всё
if ( msg == MSGID ) then
      test1 = tonumber(string.sub(argument, 1, 5))
      test2 = tonumber(string.sub(argument, 6,10))
      test3 = tonumber(string.sub(argument, 11, 15))

Напишите простой пример и попроще , мне очень нужно , а то я в координатах и точках запутался много всего туда сюда отправляется (это для трамвая по СМЕ)
Объекты от радиомастера для RailWorks бесплатно Способ поддержки webmoney Z874401784332 Save DONBASS People from Kiev Agression
Аватара пользователя
радиомастер
 
Сообщения: 2352
Зарегистрирован: 23.10.2010, 18:42
Откуда: Макеевка
Благодарил (а): 1282 раз.
Поблагодарили: 1822 раз.
Блог: Просмотр блога (4)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Костик

Re: LuaScript - для RS

Сообщение Света » 16.10.2018, 20:49

Вариант, может и не проще, но надежнее.
Отсылка. Все переменные записываются в одну строку, разделенные двоеточиями и отсылаются:
Код: Выделить всё
local message = test1..":"..test2..":"..test3
Call ("SendConsistMessage", MSGID, message, 1)

В месте приема эта строка разбивается на отдельные фрагменты, которые помещаются в специально созданную таблицу (table_tests) по порядку:
Код: Выделить всё
if (msg == MSGID) then
   local table_tests = string.split (argument, ":")
   test1 = tonumber (table_tests[1])
   test2 = tonumber (table_tests[2])
   test3 = tonumber (table_tests[3])
end

Тот кусок, что был в строке первым, будет в ячейке №1, второй - в ячейке №2 и т.д.. Преимущества метода - переменные test1, test2 и test3 никогда не перепутаются, так как они всегда будут рассортированы в порядке, по которому склеивались в строку. При этом их не надо форматировать, так как длина не имеет значения, хоть 1, хоть 1.001 - все будет разделено корректно.
Вот использованная функция string.split ():
Код: Выделить всё
function string:split(delimiter)
   local result = { }
   local from  = 1
   local index = 1
   local delim_from, delim_to = string.find( self, delimiter, from  )

   while delim_from do
      result[index] = string.sub(self, from , delim_from - 1)
      from  = delim_to + 1
      delim_from, delim_to = string.find( self, delimiter, from  )
      index = index + 1
   end

   result[index] = string.sub(self, from)

   return result
end
Её надо вставить в любое место скрипта.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение радиомастер » 16.10.2018, 20:54

А две точки перед и за двоеточием обязательно ?
Объекты от радиомастера для RailWorks бесплатно Способ поддержки webmoney Z874401784332 Save DONBASS People from Kiev Agression
Аватара пользователя
радиомастер
 
Сообщения: 2352
Зарегистрирован: 23.10.2010, 18:42
Откуда: Макеевка
Благодарил (а): 1282 раз.
Поблагодарили: 1822 раз.
Блог: Просмотр блога (4)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Костик

Re: LuaScript - для RS

Сообщение Света » 16.10.2018, 20:58

Да, это оператор, указывающий, что данные, между которыми находятся эти точки, надо соединить в одну строку. В результате получится одна строка "test1:test2:test3". Двоеточия же в этой строке - это метки, указывающие места, по которым надо разбивать строку.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 20.11.2018, 22:19

Скрипт - генератор для автоматизированного создания номеров ПС обновлен. Добавлена возможность запретить отдельные цифры в рандомайзере и последовательного увеличения числа в блоке. Подробнее в блоге.
Идея добавленных методов генерации принадлежит Андрею (ака BooYa).
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 23.12.2018, 13:43

Удалось обнаружить один нюанс в работе скрипта. Оказывается, lua в симуляторе по логике работы отличается от стандартного lua. Отличие проявляется в обработке больших чисел, я предполагаю, что lua в симуляторе использует 32-й бит для своих нужд, ограничивая таким образом максимальную длину числа в 31 бит.
Мнение это у меня появилось после наблюдений, как скрипт, запущенный на lua "из коробки" дал один результат (правильный), этот же скрипт, запущенный в симуляторе, выдал совершенно другой результат. Например, если сделать простое арифметическое действие (4294967295 - 3534543), мы в симуляторе получим 4291432704, тогда как правильный ответ - 4291432752. Такие ошибки проявляются постоянно, если обрабатываются большие числа.
Этот нюанс сказывается в том числе на работе распространенных в сети функций битовых операций. Они или виснут, или возвращают некорректный результат.
Если, все же, требуется выполнить битовые операции, я могу предложить, как альтернативу, набор более "жестких" функций, по сравнению с другими. Они могут уступать в быстродействии, но зато, по крайней мере, обрабатывают 32-разрядные числа без проблем и заточены именно под них.
Код: Выделить всё
function To_Bin (num)
   local temp, bin, i = 0, {}, 0
   repeat
      temp = num
      num = math.floor(num / 2)
      table.insert (bin, 1, (temp - num * 2) ~= 0 and "1" or "0")
      i = i + 1
   until num == 0
   bin = string.rep("0", 32 - i)..table.concat(bin)
   return bin
end

function BitXOR (a, b)
   a = To_Bin (a)
   b = To_Bin (b)
   local res = {}
   for i = 1, 32 do
      table.insert (res, string.sub (a, i, i) == string.sub (b, i, i) and "0" or "1")
   end
   return tonumber (table.concat(res), 2)
end

function BitNOT (num)
   num = To_Bin (num)
   local res = {}
   for i = 1, 32 do
      table.insert (res, string.sub (num, i, i) == "1" and "0" or "1")
   end
   return tonumber (table.concat(res), 2)
end

function BitAND (a, b)
   a = To_Bin (a)
   b = To_Bin (b)
   local res = {}
   for i = 1, 32 do
      table.insert (res, (string.sub (a, i, i) == "1" and string.sub (b, i, i) == "1") and "1" or "0")
   end
   return tonumber (table.concat(res), 2)
end

function BitOR (a, b)
   a = To_Bin (a)
   b = To_Bin (b)
   local res = {}
   for i = 1, 32 do
      table.insert (res, (string.sub (a, i, i) == "1" or string.sub (b, i, i) == "1") and "1" or "0")
   end
   print (table.concat(res))
   return tonumber (table.concat(res), 2)
end

function rshift (x, by)
   return math.floor (x / 2 ^ by)
end

function lshift (x, by)
  return x * 2 ^ by
end

Функции сдвига не мои, я их выкладываю просто для комплектности, так как конкретно эти функции поддерживаются симулятором.

Добавлено спустя 7 часов 20 минут 3 секунды:
Также в симуляторном lua не работают функции math.fmod (a, b) string.reverse (s). Теоретически функцию math.fmod (a, b) можно заменить на math.mod (a, b). У меня же успешно работают эти функции:

Код: Выделить всё
function reverse (s)
   local table_char = {}
   for i = 1, string.len (s) do
      table.insert (table_char, 1, string.sub (s, i, i))
   end
   return table.concat(table_char)
end

function mod (a, b)
   return a - (math.floor(a/b)*b)
end
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 20.03.2019, 14:26

Если кому интересно, для определения максимального числа из нескольких, "тернарный оператор" в lua работает быстрее базовых функций примерно на 33%. Это если сравнивается 2 или 3 числа (0.159 против 0.215 и 0.168 против 0.222 мксек соответственно).
Если же чисел 4, то скорость "тернарного оператора" выше уже всего на 25% (0.196 против 0.245 мксек)
При этом, если в сравнении участвуют глобальные переменные, скорость работы очень сильно падает. Для сравнения 4 глобальных переменных потребовалось уже 0.332 и 0.327 мксек. При этом, если предварительно переписать глобальные переменные в локальные и сравнивать именно локальные, скорость повышается (0.239 и 0.332 мксек).
Вывод: быстрее всего обрабатываются локальные переменные. Даже перезагрузка значений из глобальных переменных в локальные выгоднее по времени. Для расчета минимального или максимального значения из группы до 5 переменных более быстрым будет "тернарный оператор".

Самый плохой код (затративший 0.334 мксек):
Код: Выделить всё
   A, B, C, D = 10, 40, 30, 20
   max = math.max (A, B, C, D)

Самый быстрый код (затративший 0.166 мксек):
Код: Выделить всё
   local a, b, c, d = 10, 40, 30, 20
   max = (a > b and a > c and a > d) and a or (b > c and b > d) and b or c > d and c or d
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 28.05.2019, 10:22

Небольшой лайфхак для скриптеров.
Если при тестировании LogMate показал ошибку, можно исходник скрипта закинуть в ассеты, вместо скомпилированного, и повторить ситуацию, при которой возникла ошибка. В этом случае LogMate выведет уже не общую информацию, а укажет имя сломанной переменной и номер строки, где это произошло.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение BooYa » 28.05.2019, 19:28

Стоит добавить, что речь идёт о старом LogMate, который был до 2019 сима. 19 сима у Светы нет, насколько я знаю, не проверялось.

Новый логмейт говна кусок, лично у меня, когда явные ошибки скрипта были, он не писал вообще ничего.
Аватара пользователя
BooYa
 
Сообщения: 3123
Зарегистрирован: 24.01.2010, 16:30
Откуда: Екатеринбург
Благодарил (а): 1039 раз.
Поблагодарили: 2309 раз.
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Андрей

Re: LuaScript - для RS

Сообщение Света » 04.08.2019, 19:48

Skif писал(а):
Skif, спасибо за примеры.
Один момент только насторожил. Вы, наверное, очень долго писали/пишете программы на ассемблере? Удивила вот эта конструкция из взаимоисключающих условий:

Код: Выделить всё
if (n_value > target) then
Call("*:SetControlValue", name, index, n_value - n_step + tremor);
end
if (n_value < target) then
Call("*:SetControlValue", name, index, n_value + n_step + tremor);
end

if (n_value == target) then
Call("*:SetControlValue", name, index, n_value + tremor);
return 1;
end


Это не ассемблер. Это SystemC - самый лучший подход при написании "тактируемых" скриптов (запускаемых с частотой кадра - что и имеет место в RW). Так удобнее в отладке и быстрее в работе на системах, где критична частота - три отдельных if работают быстрее, чем if-elseif-else . Ну, и самый универсальный ответ - А МНЕ ТАК УДОБНЕЕ. :olen:

Наконец-то дошли руки проверить утверждение, что три проверки взаимоисключающих условий работают быстрее, чем этажерка if-elseif-else-end. Как и следовало ожидать, как раз-таки этажерка работает быстрее, причем, почти в три раза. Код
Код: Выделить всё
   if max_count > 500000 then
   end
   if max_count < 500000 then
   end
   if max_count == 500000 then
   end
выполнялся 0.121 единицы времени против 0.047 единицы, которые потребовались этажерке:
Код: Выделить всё
   if max_count > 500000 then
   elseif max_count < 500000 then
   else
   end
Если коротко - очередная выдумка от "профессионала".
Поэтому, господа, не верьте бредовому утверждению, что "три отдельных if работают быстрее, чем if-elseif-else" - это не так.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение DB BR Class 101 » 08.08.2019, 17:17

Тут даже непрофессионал поймёт что в первом случае процессор должен выполнить 3 сравнения вместо 1 или 2 сравнений во втором случае.

Кстати, не много не в тему: объясните мне почему часто пишут сравнение вот в такой форме If (любая константа) (== / <= / =>) переменная ? (например If 0 == var )
DB BR Class 101
 
Сообщения: 40
Зарегистрирован: 19.10.2016, 10:58
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Имя: Денис

Re: LuaScript - для RS

Сообщение le Sandro » 08.08.2019, 17:41

Потому что операция "=" - это присвоение значения переменной var. Например, var=0.
А операция "==" - это сравнение переменной var с каким-либо значением.
Аватара пользователя
le Sandro
 
Сообщения: 2478
Зарегистрирован: 30.03.2005, 00:14
Откуда: Пенза
Благодарил (а): 1086 раз.
Поблагодарили: 884 раз.
Блог: Просмотр блога (2)
Играю в: Train Simulator 2018
Роль: Разработчик

Re: LuaScript - для RS

Сообщение Света » 28.10.2019, 12:00

Всем доброго дня!
Есть ли в сообществе программисты на С (и разновидностях этого языка)? У меня возникли сложности с обработкой больших чисел в lua, одним из решений этой проблемы я вижу попытку подключения модуля (или библиотеки) на С, чтобы скрипт мог его запустить, передать данные на обработку и получить результат. То есть, чтобы произвести необходимые расчеты не движком TS, а на стороне. Судя по информации из сети, это делается достаточно просто, но я не владею языком С и даже примерно не представляю, как вообще выполняется запуск библиотек на С и что для этого нужно.
Может ли кто мне помочь?

Добавлено спустя 7 часов 41 минуту 44 секунды:
Исходник модуля на С у меня есть.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 802
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 535 раз.
Поблагодарили: 939 раз.
Блог: Просмотр блога (19)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Пред.След.

Вернуться в [RW] Другие вопросы

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

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

cron