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

LuaScript - для RS

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

Re: LuaScript - для RS

Сообщение Света » 24.04.2017, 12:21

Всем привет :hi:
Привожу обещанный модуль расчета остывания.
Принцип расчета
Вычисление основано на использовании данных о том, какая была температура раньше, какой она стала сейчас и сколько на это ушло времени. На основании этих данных можно определить, на сколько градусов снизится температура за такое же время.
Формула:
nT = AmbientT + (T - AmbientT)2/(pT - AmbientT)
где nT - новое значение температуры
T - текущее значение температуры
pT - предыдущее значение температуры
AmbientT - температура окружающей среды (целевое значение)

Формула простая и работает эффективно, но у неё есть серьезный недостаток. Для вычисления используется предыдущее значение расчета, а это значит, что рассчитать можно только "чистое" остывание, когда нет противодействия нагревом (сразу скажу, попытка "нагреть" одновременно текущее значение и предыдущее дает плохой результат, так как вносит погрешность, причем очень высокую - охлаждение на 1о с последующим нагревом на столько же дали погрешность в ~0,01о на итерацию).
Поэтому у меня не оставалось другого выхода, кроме как заставить скрипт построить таблицу "чистого" остывания, куда вписать все промежуточные результаты, потом извлекать из таблицы значения теплопотери, актуальные для текущей температуры воды/масла. Для нагрева, естественно, будет отдельно рассчитано свое значение, а результатом прироста температуры будет разница этих чисел.
Считывание теплопотерь из построенной таблицы дало также некоторые трудности. Так как ключами таблицы являются промежуточные значения температуры (т.е. дробные значения, причем непредсказуемые), возник вопрос - как найти самый подходящий ключ для текущей температуры? Считывать по порядку можно только целочисленные ключи, поиск по принципу "пока не превысит" даст первый попавшийся ключ, на котором сработает это условие. Эту проблему удалось решить, методом перебора всех ключей, со сравнением, который из них максимально близок к текущей температуре. Так как полный перебор не самое лучшее решение с точки зрения оптимизации, было принято решение таймеризовать его. Теплопотеря на высоких температурах может достигать 3о/мин, тогда как на низких - сотые доли. Соответственно, на высоких температурах перерасчет есть смысл делать почаще, на низких - можно раз/минуту и даже реже. Поэтому таймеризация пересчета динамическая - если нагреть воду до 120о, пересчет будет ежесекундно, при 60о - раз в минуту. Практика показала, что этого достаточно.
Вычисление данных для термометров я провожу каждые 15 секунд. Этого вполне достаточно. Мелкий скачок стрелки наблюдается только при температуре воды 120о и морозе -9о.
Температура окружающей среды определяется на старте сценария и через каждый час. Так как таблица содержит почасовые значения, чаще это делать нет смысла. Сразу же после вычисления температуры производится новое построение таблиц теплопотерь.

Практический результат
У меня нет практического опыта замеров остывания, поэтому всё приходится рассчитывать эмпирически. Единственная точка отсчета, которой я располагаю - темп остывания, измеренный секундомером в ZD-simulator`e.
Сейчас тесты показали такие результаты:
Температура воздуха: 30о, воды: 60о, темп остывания воды: 1,10о/мин, масла: 0,92о/мин;
Температура воздуха: -9о, воды: 60о, темп остывания воды: 1,82о/мин, масла: 1,51о/мин;
Температура воздуха: -9о, воды: 99о, темп остывания воды: 2,87о/мин, масла: 2,34о/мин.
К сожалению, я не знаю, насколько это реалистичные показатели.

Скрипт
Вот функции, реализующие этот алгоритм:
Скрипт симуляции:
Код: Выделить всё
------------------------------------------------------------

require "Assets/.../Util_Script.out"
require "Assets/.../[...]_telemetry_script.out"

------------------------------------------------------------
-- Setup
--
function Setup ()

   prevST = 0
   interval = 0 -- Время в секундах, прошедшее с прошлого прохода скрипта.

   SetupTelemetry()
   Timer ("0.2s", 0.2) -- запуск таймера с интервалом в 0.2 сек.

   Call( "BeginUpdate" )

end

------------------------------------------------------------
-- Update
--
function Update (interval)
   
   local simulationTime = Call( "*:GetSimulationTime")   
   if simulationTime - prevST < 0.001 then
      return
   end
   prevST = simulationTime

--- Процессы с интервалом 0.2 секунды------------------------------------------------------------------------------

   if Timer ("0.2s") then      -- функция возвращает true по окончании выдержки
      UpdateTelemetry(0.2)   -- передача интервала в функцию.
      Timer ("0.2s", 0.2)      -- перезапуск таймера на новый отсчет
   end
   
--------------------------------------------------------------------------------------------------------------------   
-- Блок вызова тактируемых функций
   if interval > 0.001 then
      Timer (interval)   -- тактирование таймера
   end
   
end -- Update

-----------------------------------------------------------------------------------------------------------------------

Обработка системы охлаждения прописана в отдельном скрипте телеметрии.
Скрипт телеметрии:
Код: Выделить всё
function SetupTelemetry()
   --0 весна 1 лето 2 осень 3 зима
   Season = SysCall("ScenarioManager:GetSeason")

   OilTemp = 60   -- стартовое значение температуры масла
   WaterTemp = 60   -- стартовое значение температуры воды
   
   HeatLossOil = 0      -- потери тепла масла за минуту
   HeatLossWater = 0   -- потери тепла воды заминуту
   
   DailyDataTemperature = { -- таблица почасовой температуры воздуха для 4 сезонов
   [0] = { 15, 12, 14, 13, 13, 12, 11, 11, 12, 11, 11, 14, 16, 16, 14, 13, 14, 13, 14, 14, 13, 13, 12, 14},-- апрель
   [1] = { 25, 25, 24, 22, 20, 19, 19, 23, 24, 26, 27, 28, 29, 30, 31, 31, 31, 31, 30, 29, 28, 26, 25, 24},-- июль
   [2] = {  5,  4,  3,  3,  3,  2,  2,  3,  4,  6,  7,  8,  9, 10, 10, 10, 10, 10, 10,  9,  8,  7,  6,  5},-- октябрь
   [3] = {-12,-10, -9, -8, -8, -9, -9,-10, -8, -7, -7, -6, -4, -2, -1, -3, -4, -6, -6, -7, -8, -9,-10,-11}}-- январь
   
   Timer ("TimeOfDay", 3600)      -- Почасовой перерасчет таблицы теплопотерь
   Timer ("HeatLoss", 0.1)         -- Перерасчет теплопотерь. Первый расчет сразу после старта -0.1 сек на переходные процессы
   Timer ("UpdateTemperatupe", 0.5)-- Обновление показаний приборов.
   CreationDynamicsCooling ()      -- Первое построение таблицы теплопотерь
end

function UpdateTelemetry(time)

--------------------------------------------------------------------------------------------------------------------   
   if Timer ("HeatLoss") then
      local key = "none"
      local difference, prev_difference = 120, 120
      
      for k, v in pairs(TabDiffTempOil) do   -- перебор таблицы теплопотерь масла
         difference = math.min(difference, math.abs(k - OilTemp)) -- выбор меньшего значения разности текущей температуры и табличного значения
         key = difference ~= prev_difference and k or key   -- если есть обновление разности, запоминаем эту ячейку
         prev_difference = difference
      end      -- в результате перебора таблицы в переменной key будет значение ячейки, температура которой максимально близка к текущему значению
      HeatLossOil = TabDiffTempOil[key]   -- считываем значение теплопотери из этой ячейки
      key = "none"                     -- подготовка переменных для аналогичного перебора таблицы теплопотерь воды
      difference, prev_difference = 120, 120
      
      for k, v in pairs(TabDiffTempWater) do
         difference = math.min(difference, math.abs(k - WaterTemp))
         key = difference ~= prev_difference and k or key
         prev_difference = difference
      end
      HeatLossWater = TabDiffTempWater[key]
      Timer ("HeatLoss", 121 - WaterTemp) -- чем выше температура воды, тем чаще будет происходить перерасчет значения теплопотерь
   end
   
   if Timer ("UpdateTemperatupe") then
      local warming_oil = 0 -- здесь должен быть расчет нагрева масла
      OilTemp = OilTemp + warming_oil - HeatLossOil/4 -- так как итерация происходит 4 раза в минуту, делим на 4
      
      local warming_water = 0 -- здесь должен быть расчет нагрева воды
      WaterTemp = WaterTemp + warming_water - HeatLossWater/4 -- так как итерация происходит 4 раза в минуту, делим на 4
      
      Call("*:SetControlValue", "ndl_toil1", 0, OilTemp)
      Call("*:SetControlValue", "ndl_twater1", 0, WaterTemp)
      
      Timer ("UpdateTemperatupe", 15) -- новая итерация будет через 15 секунд
   end
   
   if   Timer ("TimeOfDay") then   -- Если прошло 3600 секунд
      CreationDynamicsCooling ()   -- Перерасчет таблицы теплопотерь
      Timer ("TimeOfDay", 3600)   -- Заводим таймер на новый отсчет
   end
--------------------------------------------------------------------------------------------------------------------   
end

function CreationDynamicsCooling ()
   -- Расчет константы теплопотерь
   local TimeOfDay = math.floor(SysCall("ScenarioManager:GetTimeOfDay")/3600) + 1 -- загрузка текущего количества часов (1...24)
   AmbientTemp = DailyDataTemperature[Season][TimeOfDay]   -- считывание температуры окружающей среды с учетом времени и сезона
   local pTempWater = 122.9790137   -- опорные значения температуры воды - начальное
   local TempWater = 119.5272072   --   и через минуту. Разница используется для расчета таблицы теплопотерь воды
   local pTempOil = 122.5489382   -- опорные значения температуры масла - начальное
   local TempOil = 119.6926089      --   и через минуту. Разница используется для расчета таблицы теплопотерь масла
   TabDiffTempWater = {}   -- таблица теплопотерь воды
   TabDiffTempOil = {}      -- таблица теплопотерь масла
   -- таблицы будут построены в диапазоне от опорной температуры до температуры окружающей среды + поправка (1 градус)
   -- чем больше поправка, тем короче таблица.
   -- Если температура воды/масла опустится ниже минимального предела таблицы, значение теплопотери перестанет обновляться
   while TempOil > AmbientTemp + 1 do
      pTempOil, TempOil = TempOil, AmbientTemp + (TempOil - AmbientTemp)^2/(pTempOil - AmbientTemp)
      TabDiffTempOil[pTempOil] = pTempOil - TempOil
   end
   
   while TempWater > AmbientTemp + 1 do
      pTempWater, TempWater = TempWater, AmbientTemp + (TempWater - AmbientTemp)^2/(pTempWater - AmbientTemp)
      TabDiffTempWater[pTempWater] = pTempWater - TempWater
   end
end
-----------------------------------------------------------------------------------------------------------------------

В скрипте использована функция Timer, описанная мной ранее.

Описание достаточно сжатое, так как мне проще ответить на конкретные вопросы, если они у кого-нибудь возникнут, чем пытаться построчно объяснить весь процесс :blush2:
Забанена по собственному желанию. По важным вопросам связаться со мной можно через почту divovigna@gmail.com
Аватара пользователя
Света
 
Сообщения: 1338
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 983 раз.
Поблагодарили: 1805 раз.
Играю в: Train Simulator Classic
Имя: Пандора

Re: LuaScript - для RS

Сообщение i2GR » 18.05.2017, 01:48

Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Света » 18.05.2017, 11:27

Skif писал(а):на широкой [колее] нужно обеспечить совместимость с вашим ПС. У меня тут кой-чего в разработке.

Раз уж пошел разговор о совместимости и разработках, прошу разработчиков при организации межлокомотивной связи бережно относится к этим константам:
Код: Выделить всё
   POSITION_DATA = 1818190202
   PROBE_COUPLINGS = 1818190203
   ENGINE_SYNCHRO_CONTROL = 1818190301
   ENGINE_LOCK_CONTROL = 1818190401
   ENGINE_STATE_QUERY = 1818190501
   ENGINE_REMOTE_CONTROL = 1818190601
   TRANSLATE_CONTROL_VALUE = 1818190701
Здесь:
- POSITION_DATA - запрос для определения взаимного расположения локомотивов в составе;
- PROBE_COUPLINGS - проба сцепок;
- ENGINE_SYNCHRO_CONTROL - синхронизация контролов с ведущим локомотивом;
- ENGINE_LOCK_CONTROL - дистанционная адресованная блокировка контролов;
- ENGINE_STATE_QUERY - адресованный запрос на состояние контрола;
- ENGINE_REMOTE_CONTROL - дистанционная адресованная установка контролов;
- TRANSLATE_CONTROL_VALUE - пакетная передача значений контролов.

Так как обмен ещё на стадии разработки, я не могу предоставить протоколы сообщений на каждую константу. По завершении обязательно все будет. А пока что, если понадобится согласование обмена, обращайтесь в ЛС, я опишу протокол на требуемую константу и расскажу, что и зачем используется :cofe:
Забанена по собственному желанию. По важным вопросам связаться со мной можно через почту divovigna@gmail.com
Аватара пользователя
Света
 
Сообщения: 1338
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 983 раз.
Поблагодарили: 1805 раз.
Играю в: Train Simulator Classic
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 19.05.2017, 08:14

i2GR писал(а):0.7
Игорь, в скрипте Globals.lua мне попалась на глаза такая конструкция:
Код: Выделить всё
function Sum(...)
   local link   = arg[arg.n - 1]
   ...
end
Из опыта, мне как-то надо было сваять подобную функцию, она не заработала. Гугл подсказал, что передавая в функцию оператор "...", нужно его дополнительно загрузить в локальную таблицу:
Код: Выделить всё
function Sum(...)
   local arg = {...}
   ...
end
После этого всё заработало. Но! При смене версии симулятора скрипт упал, восстановить его работоспособность удалось только вернув функцию в первоначальный вид, без создания локальной arg. Получается, на одной платформе работает только с принудительным созданием таблицы, на другой - только если таблицу не создавать. Поэтому, ради мультиплатформенности, пришлось вообще отказаться от переменного количества операторов.
Конечно же, можно было пытаться создавать таблицу с другим именем, вместо arg, которое в версиях Lua, автоматически распределяющих данные, получается, зарезервировано. Но мне показалось ненадежным использовать оператор, который обрабатывается в разных версиях по-разному.
Ну и, к слову, вот стандартные функции, которые у меня в TS2014 и TS2015 категорически отказываются работать:
Код: Выделить всё
   table.maxn (table)
   string.gmatch (s)
   #
Мне ни разу не удалось, используя эти вызовы, получить что-нибудь, кроме nil.
Забанена по собственному желанию. По важным вопросам связаться со мной можно через почту divovigna@gmail.com
Аватара пользователя
Света
 
Сообщения: 1338
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 983 раз.
Поблагодарили: 1805 раз.
Играю в: Train Simulator Classic
Имя: Пандора

Re: LuaScript - для RS

Сообщение i2GR » 19.05.2017, 10:50

Света
ИМХО поддержка мультиплатформенности Lua - это лишние трудозатраты, раз; и два, концептуально, это то же, что сознательный отказ от "передовых фич" РВ и использование только старых функций API.
Ну и три, я сижу всегда на последней версии РВ и поставляемой с ним Lua.
maxn не пробовал. пробовал getn. вроде норм. gmatch не пробовал. # не работает уже пару версий Lua назад.
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Света » 19.05.2017, 11:53

i2GR
Почему же сознательный отказ от фич? :) Это не отказ от фич, а обеспечение обратной совместимости.
Да и лишних трудозатрат, как правило, нет. Вместо сомнительной функции и одной строки использовать проверенную в двух строках - совсем ведь не тяжело.
Ну да ладно. Это дело личных предпочтений. Цель моего поста была не в навязывании своего стиля программирования. Просто бывает, что идеально работающее дополнение при установке другим человеком начинает глючить. Вот я и указываю на одну из возможных причин.
Приведенная мной выше функция не будет работать в TS2014. В TS2015 - будет. Самое интересное, что оба симулятора используют одну и ту же версию Lua - 5.0.2, а, значит, здесь вопрос не в версиях языка, а в библиотеках.
Поэтому я всего лишь показываю слабое место, но ни в коем случае не пытаюсь что-то навязывать или в чем-то убеждать :shuffle:
Забанена по собственному желанию. По важным вопросам связаться со мной можно через почту divovigna@gmail.com
Аватара пользователя
Света
 
Сообщения: 1338
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 983 раз.
Поблагодарили: 1805 раз.
Играю в: Train Simulator Classic
Имя: Пандора

Re: LuaScript - для RS

Сообщение i2GR » 19.05.2017, 12:34

Трудозатраты в том, что надо по большому счету любую фичу на совместимость проверять.
Если конкретно знаешь, что работает в какой версии заработает, а что нет, тогда да, две строчки - это нетрудозатратно.
У меня, например, у самого require не получился с первого раза - не стал выяснять, почему; но потом использовал по твоему образцу успешно
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение ista011 » 26.05.2017, 03:59

А может всё же можно подцепить C++ DLL к симу через LUA? Я вот пытаюсь сейчас, но тут выскакивает бяка, что он путь ?;?.lua найти не может. Это означает, что он только lua модули загрузит? А что если через какой нить HEX-редактор дописать туда и dll расширение? Мне бы неплохо вылезти за пределы RW в C++ дабы парочку интересных штук сделать, да и упростить себе жизнь, а то последовательности элементов, когда на один элемент сразу несколько путей приходится... Это жесть, мягко говоря.
ista011
 
Сообщения: 410
Зарегистрирован: 04.12.2009, 22:20
Откуда: Москва
Благодарил (а): 21 раз.
Поблагодарили: 188 раз.
Играю в: Train Simulator Classic
Имя: Алексей

Re: LuaScript - для RS

Сообщение i2GR » 26.05.2017, 09:09

а какой путь он найти не может?
в исходниках .lua другие .lua нормально цепялются через РВ-шный --include
в "предкомпилированных" .out другие. out тоже цепляются, но через луёвый require
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Света » 26.05.2017, 10:09

ista011 писал(а):Это означает, что он только lua модули загрузит?

Lua может через os.execute запустить внешнюю программу. Поэтому, я думаю, что если есть проблемы с путями, то, скорее всего, некорректно задан или путь, или расширение обрабатываемого модуля. Вообще, по опыту знаю, что Lua в поисках путей очень чувствителен к использованию слэша.
Например, у меня есть конструкция, где Lua запускает ВАТ-ник, ВАТ-ник собирает данные компьютера и записывает их в специально созданный реестр, который потом этот же Lua считывает. Там команда на выполнение выглядит так:
Код: Выделить всё
os.execute("D:\\Lua\\ReadData.bat")

И чтение данных из созданного реестра происходит по пути, оформленному так же, с применением двойного бэкслэша:
Код: Выделить всё
for line in io.lines("D:\\Lua\\edit.res") do

Вместе с тем, функция require использует одинарный слэш:
Код: Выделить всё
require "Assets/.../Scripts/Util_Script.out"

Также мне когда-то попалась запись пути, где одновременно использовались и бэкслэш, и слэш.
Поэтому могу порекомендовать попробовать использовать функцию os.execute (я так понимаю, C++ DLL - это нечто вроде исполняемого файла?), но исследовать форматы написания путей для такого вызова.
Забанена по собственному желанию. По важным вопросам связаться со мной можно через почту divovigna@gmail.com
Аватара пользователя
Света
 
Сообщения: 1338
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 983 раз.
Поблагодарили: 1805 раз.
Играю в: Train Simulator Classic
Имя: Пандора

Re: LuaScript - для RS

Сообщение Skif » 26.05.2017, 10:58

А вот это крайне интересная тема, что скрипты локомотивов или ассетов игры могут не только выводить из игры данные (через текстовый файл), но и запускать внешние приложения и bat-файлы!!!!

Я про это не знал. Ты это проверяла, Света? Это работает? Это может стать очень полезной фичей для моих работ с пультами - в частности, запускать приложение виртуальной приборной доски только в момент выполнения скрипта локомотива. У меня сейчас запуск необходимых утилит посажен на триггеры системных событий в винде, а часть софта сидит в автозапуске.
Skif
 
Сообщения: 3750
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение Света » 26.05.2017, 11:50

Skif, это работает, но с оговорками.
Например, запуск ВАТ-ника по привычному адресу для симулятора ("Assets...") не работает, надо указывать полный путь, начиная с названия жесткого диска:
Код: Выделить всё
os.execute("H:\\TS2015_redaktor\\Assets\\...\\ReadData.bat")

И при вызове ВАТ-ника скриптом в оконном режиме симулятора выскакивает на мгновение окно командной строки.
Пока что я могу твердо сказать, что работает только сам вызов, то есть, в процессе игры скрипт разрабатываемого локомотива смог запустить ВАТ-ник, ВАТ-ник создал файл реестра, вписал туда указанные данные ОС, после чего скрипт считал эти данные и вывел в лог-файл.
Дальше я эту систему пока не разрабатываю, для меня важно было выяснить только сам факт работоспособности такой схемы. Думаю, что теоретически можно избавиться от необходимости указывать полный путь (например, при инсталляции дополнения инсталлятор может где-нибудь фиксировать путь распаковки, чтобы потом скрипт использовал эту информацию). Что касается окна командной строки - я не знаю, можно ли её убрать. Пока что такая задача не стоит, если придется - буду разбираться )).
Забанена по собственному желанию. По важным вопросам связаться со мной можно через почту divovigna@gmail.com
Аватара пользователя
Света
 
Сообщения: 1338
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 983 раз.
Поблагодарили: 1805 раз.
Играю в: Train Simulator Classic
Имя: Пандора

Re: LuaScript - для RS

Сообщение ista011 » 26.05.2017, 12:06

Не смотрите, что это qlua, просто тут специфика именно такова, но внутри это обычный Lua. Всё тут описанное РАБОТАЕТ в обычном Lua (проверено в компиляторе обычного lua), но видимо в RW разрабы решили поприкалываться и что-то обрубили.
https://quikluacsharp.ru/qlua-c-cpp-csh ... lua-lua-c/
https://quikluacsharp.ru/qlua-c-cpp-csh ... oj-na-c-c/

Добавлено спустя 5 минут 25 секунд:
И да, мне ещё и аргументы надо передавать и обрабатывать их и получать в каждом кадре.

Добавлено спустя 1 час 21 минуту 1 секунду:
Trace cScriptState.cpp : 375 = Lua Error: could not load package `QluaCSharpConnector' from path `;;C:\Program Files (x86)\Lua\5.1\lua\?.luac'


файл лежит в указаной папке с именем QluaCSharpConnector.luac, но, похоже, символы ;; мешают загрузке. Не, серьёзно, что если редактором это выправить прямо в самом исполняемом файле РВ...
ista011
 
Сообщения: 410
Зарегистрирован: 04.12.2009, 22:20
Откуда: Москва
Благодарил (а): 21 раз.
Поблагодарили: 188 раз.
Играю в: Train Simulator Classic
Имя: Алексей

Re: LuaScript - для RS

Сообщение Linx » 26.05.2017, 13:39

Я так понимаю, мы тихо подошли к тому моменту, как когда-то к тому же подошел Ted при MSTS :)
Дизайнер из Орла хочет познакомиться с бригадой ТЧ1 или ТЧ27. Маневры не предлагать :) | Простите, у вас кажется ригель отклеился!
Аватара пользователя
Linx
 
Сообщения: 1797
Зарегистрирован: 02.01.2006, 19:57
Откуда: Орел
Благодарил (а): 822 раз.
Поблагодарили: 1522 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator Classic
Роль: Разработчик
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение Skif » 26.05.2017, 14:22

А я говорил, что в этой игре еще интересных фич - непочатый край.

Фактически, это тот же МСТС, но на относительно новом графическом и звуковом движке. Теоретически, можно расковырять его до состояния прадедушки вплоть до написания на его основе собственного продукта, если когда-либо выложат исходники (а чехи писали MSTSBin и без исходников ядра). Только стоит ли? Проще сваять с нуля игру на современном IDE.
Skif
 
Сообщения: 3750
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Имя: Дмитрий

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 5