Свои изобретения в Railworks

Обсуждение вопросов и решение проблем, связанных с внутриигровым редактором, а также процессом разработки самостоятельных дополнений или игровых модификаций.
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Свои изобретения в Railworks

Сообщение Cross »

Вопрос к нашим программистам или людям, кто в этом что-то понимает.
Я тут из спортивного интереса решил попробовать перегнать OUT скрипты в читаемый формат LUA и столкнулся с первой сложностью. Конечно ничего не получилось :)
Попытался выяснить, какой версией компилятора были созданы эти скрипты. Вроде в папке с игрой лежит luac (компилятор скриптов) версии 5.0.2. И я так думаю, все скрипты были пропущены через него. Попробовал прогнать скрипт LUA от стандартного Class 47 (Class47EngineScript.lua), на выходе получил luac.out. В нём первые строки такие: (кликабельно)
Изображение
Затем я решил открыть скрипт от DB 101 из маршрута Мюнхен и вот что увидел:
Изображение
Я так понимаю, вначале, где прописана строка LuaP ( индекс P означает версию компилятора скрипта - в данном случае 5.0.2, если не ошибся)
Смотрим ниже и видим различия в строчках @Class47EngineScript.lua и на том же месте в скрипте DB 101 стоит=( none)
Когда я пытался хотябы прочитать этот скрипт с помощью програмки Lua через командную строку, в случае с class 47 это сделать получилось. В случае с DB 101 нет. Тогда я решил принудительно прописать вместо =( none) название самого скрипта от DB 101, как на примере с Class 47.
Вместо этого вышло сообщение что-то про память, типо её не хватает или что-то в этом духе.
Ещё хочу заметить, что другие версии декомпиляторов не подходят к скриптам. То есть скрипт будет читаться только той версией, которая его скомпилировала
*Train Simulator 2018*
Изображение
supermax
Мастер
Мастер
Сообщения: 477
Зарегистрирован: 02 сен 2012
Репутация: 106

Re: Свои изобретения в Railworks

Сообщение supermax »

насколько я понимаю, out - это частичное преобразование скрипт в бинарный формат. Т.е. это как компиляция программы исходный код не получить.
Преобразование out идёт по следующей схеме:
1) отсев переменных их значений от синтаксиса языка Lua;
2) компиляция.
Компилируется в бинарный в данном случае синтаксис, мы лишь видим малую часть языковых конструкций, да названия переменных. Компиляция - это не только улучшенный метод защиты скриптов (тот метод с прогонкой в string() раскрывался на раз при должном умении), но и увеличенная скорость их выполнения, т.к. скомпилированный код шустрее выполняется чем обычные исходные lua. Выгода составляет до 15% в расчётах. Тестил свой 60 КБ скрипт в чистом виде и после прогонки в out (сжался до 38 КБ).
Если конечно найдётся способ получения исходного (что маловероятно) кода это было бы очень классно. Но не вижу предпосылок к его получению...
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Свои изобретения в Railworks

Сообщение Cross »

supermax
Ну смотрите, я для примера взял скрипт от немецкого 101-го (тот, который стандартный)
Сначала я его скомпилировал утилитой LuaC, она лежит прямо в директории с игрой. Потом полученый out файл прогнал через luadec версии 0.1
Выкладываю файлы сюда (оригинал и он же расшифрованый после компиляции), чтобы вы посмотрели и сказали, не разбился ли скрипт и рабочий ли он :)

--- добавлено позже в 11 май 2013, 22:29 ---

а вот при попытке расшифровать тот же файл, но уже оригинальный из маршрута Мюнхена luadec вываливается с ошибкой.
После этого правлю ту самую строку =( none) на @br101_enginescript.lua и после этого luadec выдаёт вот что:
D:\>luadec.exe br101_enginescript.out
luadec.exe: not enough memory
что это может значить?
*Train Simulator 2018*
Изображение
supermax
Мастер
Мастер
Сообщения: 477
Зарегистрирован: 02 сен 2012
Репутация: 106

Re: Свои изобретения в Railworks

Сообщение supermax »

Прикольно, 2 файла идентично, просто у расшифрованного изменилась запись функций, вместо
function [имя функции] стало [имя функции] =function (параметры). Такое допустимо, скрипт рабочий в принципе...
Но попробовал свой out прогнать через luadec, тот что Вы мне давали, тоже 0.1 версия. Крашится luadec.exe - отказывается out расконвертить :)
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Свои изобретения в Railworks

Сообщение Cross »

дааа, почти докапались до истины и снова тупик. Даже не знаю, что и делать. Ну а по поводу замены второй строчки =( none) на @br101_enginescript.lua. По какой причине пишет, что не хватает памяти?

--- добавлено позже в 11 май 2013, 22:53 ---

Кстати, посмотрите скрипт для Class 465. Его мне удалось расшифровать без проблем и геморроя :)

Код: Выделить всё

Initialise = function()
   boolAWSReady = true
   boolAWSTest = false
   Call("*:SetControlValue", "Active", 0, 1)
   Call("BeginUpdate")
end

OnControlValueChange = function(name, index, value)
   if Call("*:ControlExists", name, index) then
      Call("*:SetControlValue", name, index, value)
   end
end

Update = function(time)
   if Call("*:GetControlValue", "Startup", 0) == -1 then
      boolAWSReady = Call("IsExpertMode") ~= 1
      boolAWSTest = false
      Call("*:SetControlValue", "Reverser", 0, 0)
   end
   boolAWSTest = boolAWSReady ~= Call("*:GetControlValue", "Reverser", 0) <= 0.9
   Call("*:SetControlValue", "AWSWarnCount", 0, 1)
   Call("*:SetControlValue", "AWS", 0, 0)
   boolAWSReady = false
   if boolAWSTest == boolAWSReady ~= Call("*:GetControlValue", "AWSReset", 0) <= 0.9 then
      Call("*:SetControlValue", "AWSWarnCount", 0, 0)
      Call("*:SetControlValue", "AWSClearCount", 0, 1)
      Call("*:SetControlValue", "AWS", 0, 1)
      boolAWSTest = false
   end
   if Call("GetControlValue", "CabLight", 0) == 1 then
      Call("CabLight1:Activate", 1)
   else
      Call("CabLight1:Activate", 0)
   end
end

OnConsistMessage = function(msg, argument, direction)
end


*Train Simulator 2018*
Изображение
supermax
Мастер
Мастер
Сообщения: 477
Зарегистрирован: 02 сен 2012
Репутация: 106

Re: Свои изобретения в Railworks

Сообщение supermax »

ого...Вы получили для 465-го из out? Я при релизе ВЛ10к буду переживать за свой скрипт =) Я то полагал, что out нормальная защита, теперь могу ноу-хау вводить в РВ, а оказывается всё можно тырить :)
Делали всё тем же методом: out прогнали через luadec.exe?
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Свои изобретения в Railworks

Сообщение Cross »

supermax
всё верно, но это единственный скрипт, который мне удалось выковырнуть. У остальных прописана строка =( none), из-за чего при попытки вытащить код, пишет, что неправильный заголовок скрипта и дальше ничего не выходит. Пробовал подставлять вместо этого none аналогичные названия, которые прописываются при компиляции lua в out, но это не помогает. При декомпиляции пишет, что не хватает памяти.
Дальше дело не идёт
и ещё хочу сказать, что в скрипте от 465-го, где обычно стоит none прописан полный путь до этого скрипта, но в формате lua.
В общем и целом хочу сказать, что дальше дело за понимающими процесс людьми. Может кому и удасться докопаться до раскрытия кода
*Train Simulator 2018*
Изображение
LiNe
Магистр
Магистр
Сообщения: 821
Зарегистрирован: 06 сен 2012
Репутация: 205

Re: Свои изобретения в Railworks

Сообщение LiNe »

Cross писал(а):Тогда я решил принудительно прописать вместо =( none) название самого скрипта от DB 101, как на примере с Class 47.
Вместо этого вышло сообщение что-то про память, типо её не хватает или что-то в этом духе.
Имхо. здесь очевидно разница в компиляции. Естественно... синтаксический анализатор не прочтет вручную добавленную строку уже в скомпилированный экземпляр, так как это, так сказать "не входит в кодировку" компилятора. Он, просто проигнорирует, пройдет мимо или выдаст ошибку наличие "инородного тела", что было добавлено вручную, редактором, напрямую в кодировке ANSI/Unicode и т.д. Все верно... Я не программист :) , но так видно, что все это вызывается через другую, "промежуточную" функцию.
supermax
Мастер
Мастер
Сообщения: 477
Зарегистрирован: 02 сен 2012
Репутация: 106

Re: Свои изобретения в Railworks

Сообщение supermax »

Проковырял все варианты, всё-таки я спокоен. Не взламывается скрипт, который сконверчен через Luac.exe вызовом из BlueprintEditor :) Рад, что мой скрипт теперь в безопасности, с другой стороны теперь фишки у более услужливых RSC-шникам разрабов не потырить =)
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Свои изобретения в Railworks

Сообщение Cross »

чему радоваться то? Мне кажется наоборот хреновым то, что теперь никак эти скприпты не взломать. А если захочется подсмотреть какую-нибудь функцию и прописать её выполнение на какую-нибудь клавишу? Ну например свет в кабине поезда. Есть же локомотивы, у которых только мышкой можно щёлкнуть тумблер, а клавиши нету.
*Train Simulator 2018*
Изображение
supermax
Мастер
Мастер
Сообщения: 477
Зарегистрирован: 02 сен 2012
Репутация: 106

Re: Свои изобретения в Railworks

Сообщение supermax »

Cross, ни что не мешает RW_Tools-ом вскрыть engine файл и заценить имена контролов, их обычно немного+в локах про свет их имена осмыслены - содержат слово Light ну и стоит глядеть теги Detailed Description и Brief Description :)
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Свои изобретения в Railworks

Сообщение Cross »

supermax
у меня нет rw tools, считаю её слишком громоздкой для выполнения каких-то операций. Я пользуюсь serz.exe для перегона бинарников в xml.
Я обазначил лишь малую часть. Ведь хочется полноценно поковыряться в скриптах, может быть какие-то новые функции вытащить, что было бы полезно для разработки собственных дополнений, но с зашифрованными скриптами этого сделать не получается.
Я ещё в интернете нашёл программку Open SSL. С её помощью как-то можно обработать скрипт, только как это сделать, не знаю. Может вы что-то слышали или пользовались?

--- добавлено позже в 18 май 2013, 16:07 ---

Всё же мне нужна помощь по скриптам. Щас занимаюсь патчем для локомотива SW1500. Это уже старое дополнение, но к нему прикрутили квик драйв только. Мой патч будет включать эффекты TSX (дождь и свет). Но возникла проблема как раз-таки со скриптовой частью. Свет я прикрутил и он теперь работает как надо. Если смотреть скрипт старого локомотива, то естественно в нём нету команд на включение и отключение света, то есть свет в кабине и на ступеньках горит всегда. А теперь вопрос, каким образом теперь посмотреть скрипт и вытащить из него столь необходимые функции??? С назначением кнопок управления будет проще. А вот без скриптовых функций никак не обойтись к сожалению
*Train Simulator 2018*
Изображение
Аватара пользователя
Sergey1507
Мастер
Мастер
Сообщения: 360
Зарегистрирован: 06 янв 2012
Откуда: Калининград (МО)
Репутация: 224

Re: Свои изобретения в Railworks

Сообщение Sergey1507 »

Собеседники!

Может кто из вас знает, где можно найти габаритки зарубежного ПС.

Интересует "class 318".
Изображение
supermax
Мастер
Мастер
Сообщения: 477
Зарегистрирован: 02 сен 2012
Репутация: 106

Re: Свои изобретения в Railworks

Сообщение supermax »

Cross писал(а): Всё же мне нужна помощь по скриптам. Щас занимаюсь патчем для локомотива SW1500. Это уже старое дополнение, но к нему прикрутили квик драйв только. Мой патч будет включать эффекты TSX (дождь и свет). Но возникла проблема как раз-таки со скриптовой частью. Свет я прикрутил и он теперь работает как надо. Если смотреть скрипт старого локомотива, то естественно в нём нету команд на включение и отключение света, то есть свет в кабине и на ступеньках горит всегда. А теперь вопрос, каким образом теперь посмотреть скрипт и вытащить из него столь необходимые функции??? С назначением кнопок управления будет проще. А вот без скриптовых функций никак не обойтись к сожалению
1. В Engine конфиге добавить 2 контрола (саму теговую структуру можно взять из других контролов):
к примеру (имена выберите какие хотите), я выбрал LightCab и LightStep:

Код: Выделить всё

<cControlContainerBlueprint-cControlValue d:id="27465080">
							<ControlName d:type="cDeltaString">LightCab</ControlName>
							<DefaultValue d:type="sFloat32">0.000000</DefaultValue>
							<MinimumValue d:type="sFloat32">0.000000</MinimumValue>
							<MaximumValue d:type="sFloat32">1.000000</MaximumValue>
							<BriefDescription d:type="cDeltaString"></BriefDescription>
							<DetailedDescription d:type="cDeltaString"></DetailedDescription>
							<ApplyToConsist d:type="cDeltaString">eFalse</ApplyToConsist>
							<InterfaceElements>
								<cControlContainerBlueprint-cInteriorNotchedLever d:id="19011672">
									<ElementName d:type="cDeltaString"></ElementName>
									<DifficultyType d:type="cDeltaString">Intermediate</DifficultyType>
									<PickTransformName d:type="cDeltaString"></PickTransformName>
									<MovementType d:type="cDeltaString">MoveUpDown</MovementType>
									<AnalogInputSensitivity d:type="sFloat32">10.000000</AnalogInputSensitivity>
									<DigitalInputSensitivity d:type="sFloat32">10.000000</DigitalInputSensitivity>
									<AnimationName d:type="cDeltaString"></AnimationName>
									<RestInNotchedPosition d:type="cDeltaString">eTrue</RestInNotchedPosition>
									<NumberOfNotches d:type="sFloat32">2.000000</NumberOfNotches>
								</cControlContainerBlueprint-cInteriorNotchedLever>
							</InterfaceElements>
</cControlContainerBlueprint-cControlValue>
<cControlContainerBlueprint-cControlValue d:id="27465080">
							<ControlName d:type="cDeltaString">LightStep</ControlName>
							<DefaultValue d:type="sFloat32">0.000000</DefaultValue>
							<MinimumValue d:type="sFloat32">0.000000</MinimumValue>
							<MaximumValue d:type="sFloat32">1.000000</MaximumValue>
							<BriefDescription d:type="cDeltaString"></BriefDescription>
							<DetailedDescription d:type="cDeltaString"></DetailedDescription>
							<ApplyToConsist d:type="cDeltaString">eFalse</ApplyToConsist>
							<InterfaceElements>
								<cControlContainerBlueprint-cInteriorNotchedLever d:id="19011672">
									<ElementName d:type="cDeltaString"></ElementName>
									<DifficultyType d:type="cDeltaString">Intermediate</DifficultyType>
									<PickTransformName d:type="cDeltaString"></PickTransformName>
									<MovementType d:type="cDeltaString">MoveUpDown</MovementType>
									<AnalogInputSensitivity d:type="sFloat32">10.000000</AnalogInputSensitivity>
									<DigitalInputSensitivity d:type="sFloat32">10.000000</DigitalInputSensitivity>
									<AnimationName d:type="cDeltaString"></AnimationName>
									<RestInNotchedPosition d:type="cDeltaString">eTrue</RestInNotchedPosition>
									<NumberOfNotches d:type="sFloat32">2.000000</NumberOfNotches>
								</cControlContainerBlueprint-cInteriorNotchedLever>
							</InterfaceElements>
</cControlContainerBlueprint-cControlValue>
2. В маппер добавляем ToggleControl для 2-х этих контролов, чтобы можно было включать оба освещения через клавиатуру.
3. В Engine скрипт в функцию OnControlValueChange(name, index, value) добавляем уже работу со светом.

Код: Выделить всё

function OnControlValueChange(name, index, value)
  if(name == "LightCab") then
    if(value == 0) then
        Call("Node1:Activate", 0) -- в кабине свет выкл. если контрол 0
    else --если значение контрола 1-а
        Call("Node1:Activate", 1) -- в кабине свет вкл. если контрол 1
    end
  elseif(name == "LightStep") then
    if(value == 0) then
        Call("Node2:Activate", 0) -- свет на подножках выкл. если контрол 0
    else --если значение контрола 1-а
        Call("Node2:Activate", 1) -- свет на подножках вкл. если контрол 1
    end
  end
end
Node1 - имя чаилда, добавленного в children engine конфига (это у меня чаилд света кабины), Node2 - имя чаилда, добавленного в children engine конфига (это у меня чаилд света подножек),
LightCab - это контрол кабинного света (по дефолту 0 значение - что соответствует выкл.), LightStep - это контрол света подножек (по дефолту 0 значение - что соответствует выкл.).
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Свои изобретения в Railworks

Сообщение Cross »

supermax
спасибо за разъяснения. Значит скоро будет готов мой первый патч :)
*Train Simulator 2018*
Изображение
LiNe
Магистр
Магистр
Сообщения: 821
Зарегистрирован: 06 сен 2012
Репутация: 205

Re: Свои изобретения в Railworks

Сообщение LiNe »

supermax писал(а): P.S.Для меня остаётся пока только неясным одно - если менять значения между тегами, а не будут они проигнорированы, мб движок кушает 16-ричные значения в d:alt_encoding=""...Я работаю в основном с исходниками, там немного по другому выглядит всё, не так исковеркано как конверченное, к примеру тот же TractiveEffortVsThrottle.dcsv, но как бы он выглядил как TractiveEffortVsThrottle.csv:
supermax, думаю не будут проигнорированы, так как значение d:alt_encoding="", если его просмотреть как шестнадцатеричный,(а оно так и есть), то ни как не совпадает со значением d:precision=" в теге, как десятичного эквивалента. Это или относится к другому или же другое/внутреннее счисление. Тоже, сейчас смотрел... не сходится. Ну, например E07040=14708800, а не E07040=270, к которому можно отнестись как эквивалентного значения. Далее, поискал применение 14708800, но не нашел ни чего.
Аватара пользователя
Sergey1507
Мастер
Мастер
Сообщения: 360
Зарегистрирован: 06 янв 2012
Откуда: Калининград (МО)
Репутация: 224

Re: Свои изобретения в Railworks

Сообщение Sergey1507 »

Уважаемые собеседники! Хочу поделиться некоторой информацией относительно дальности прорисовки объектов.

В данном топике
http://railworks2.ru/viewtopic.php?f=5& ... %8C#p40007
supermax писал(а): ......... В том же ТРС на Мариасе объекты аж уже через 400 метров исчезают, тут только свыше 1 км у меня начинают пропадать. Да, детализация очень далёких гор не радует...
P.S. ЛОДы пока максимальны в РВ для объектов - 1300м, думаю многие обратят внимание RSC и напишут им (я в твиттер им написал), что пора бы и увеличить максимальную дальность ЛОДов хотя бы до 3-4 км...
Казалось бы, что объекты с бесконечно большой дистанцией прорисовки не должны исчезать, но они исчезают.
Я определил причину исчезновения объектов, и вот она в чем заключается.
На рисунке схематично изображена область видимости объектов. Квадратики - это tiles (тайлы. В редакторе можно включить их границы)
Изображение
Зеленым обозначен тайл где находится игрок, серые тайлы вокруг - это смежные тайлы, на которых будут отображаться объекты. На прочих тайлах объкты не отображаются, хотя могут там и находится. Когда происходит перемещение в другой тайл, игра создаст новую область видимости, но строго по схеме на рисунке (ступеньками не делает). Размер тайла 1023м×1023м (точнее не измерял).
Дальше простая математика и геометрия. Минимальное расстояние, на котором объект появится (при условии, что для ЛОДа не установлено меншее значение) - 1023 метра. Максимальное расстояние, при котором объект исчезнет (опять таки при условии, что для ЛОДа не установлено меньшее значение) 1023*2*√2 , что примерно равно 2893 метра.

И вот еще что заметил, когда в модели для ЛОДа записано, например, 1_1200_name, то 1200 это не 1200 метров, это 1,2 мили. А для случая 1_0050_name - не 50 метров, а 0,05 мили (примерно 84 метра). Это неоднократно установлено тестами.

Вот такая картина.

Кстати. Прорисовка земли подчиняется другим правилам. Если сделать горы, то, когда в настройках стоит высокая дальность видимости горы прорисовываются и на 4 км и на 6 км (дальше не обращал внимания). При минимальной дальности видимости прорисовка земли несколько больше области видимости объектов, или такая же. Точно не помню, но с большой высоты уже видно черную бездну.
Аватара пользователя
fighter2012
Ветеран
Сообщения: 2993
Зарегистрирован: 07 мар 2011
Откуда: Россия
Репутация: 1329

Re: Свои изобретения в Railworks

Сообщение fighter2012 »

интересно, проблему с прорисовкой смогут ли решить игроки самостоятельно, без RSC?
Изображение
Аватара пользователя
Sergey1507
Мастер
Мастер
Сообщения: 360
Зарегистрирован: 06 янв 2012
Откуда: Калининград (МО)
Репутация: 224

Re: Свои изобретения в Railworks

Сообщение Sergey1507 »

Частично это возможно.
1. Делать сложные объекты километровых размеров, но это подойдет для далеких боковых объектов. Объекты находящиеся по ходу или позади движения, будут вести себя как призраки - исчезать/пропадать прямо в шаговой доступности. (получится хуже чем есть сейчас).
2. Найти способ изменить размеры тайлов. Это было бы куда лучше, но в редакторе настроек для размеров тайлов нет. Поэтому, если кто вдруг, случайно, знает как менять размеры тайлов, напишите как это сделать.
supermax
Мастер
Мастер
Сообщения: 477
Зарегистрирован: 02 сен 2012
Репутация: 106

Re: Свои изобретения в Railworks

Сообщение supermax »

Sergey1507,парочку моментов:
1) ЛОДы вообще во всех играх приняты по единой метрической системе и РВ не исключение, офишиал пруф:
http://www.railsimdownloads.com/wiki/ti ... e%20Manual
Да тем более, я тоже делал объекты с ЛОДами и замерял, так что откуда вы там нашли деление на 100 и дистанция в милях - ХЗ.
2) Насчёт тайл и 8 смежных тайлов - я говорил про 1300 м, потом меня одолели сомнения и решил проделать кое-какой опыт.
создал в 3дс максе куб, 15*15 м,
Изображение

Изображение
у него задан ЛОД, 0000 - по спецификации, когда все нули это неограниченный ЛОД, т.е. максимум из возможного.
Вот этот объект с дистанции 2.5 км (вымерено по 2 путям которые пролегают от куба, виден тупичок +инструментом линейка из редактора померил, чтобы вышло прям ровненько 2.5 км):
Изображение
Объект виден, хоть и стал крошечным. Тут дело не в тайлах, а в самом создаваемом ЛОДе - делают ЛОДы не большие, чтобы меньше кушало+если объект мелкий он пропорционально расстоянию уменьшается и что будет видно? 15*15 куб за 2.5 км превратился в малюсенький квадратик (правее от пыхтящего тепловоза).
Мои опыты могут быть подтверждены если залезть в исходники деревьев, что засажены Мариасе (смотреть файл геометрии через RW_Tools) и найти блок касательно ЛОДов и посмотреть каковая дистанция последнего ЛОДа.
Дело не в тайлах и ЛОДах даже, а в том, что объект уменьшается пропорционально расстоянию вот в чём ещё беда...Реальность куда сложнее передать отрендеренным изображением-)
3) размер тайла - константа, как и не сделать сетку шага рельефа меньше 8 м - это юрисдикция уже RSC, т.е. менять надо в самом движке.
Ответить