awaken
18.12.2013, 18:56
Ковыряю такую вещь, нигде толком не описанную
разве что вот здесь единственное более-менее внятное объяснение
http://www.railunion.net/forum53/topic10420.html
в сценарии можно воспроизводить аудиозапись, привязав к определенному событию (например проезд маркера)
в Stevens Pass таким образом сделаны говорящие детекторы неисправностей поезда, осуществляющие контроль нагрева букс, и контроль верхнего и нижнего габарита ПС (аналог наших ПОНАБ и УКСПС)
при проезде устройства, оно передает на локомотив синтезированную голосовую запись о наличии/отсутствии дефектов у прошедшего подвижного состава, а также количество осей в составе. это позволяет делать сценарии более жизненными и интерактивными (теоретически, возможна и выдача голосовой информации о неисправностях )
странность в том что в TS2014 это напрямую не реализовано, а разработчики сделали это весьма корявым способом - через расширение погодных эффектов (WeatherExtension). таким же образом , как воспроизводятся звуки грома, дождя и тд в сценариях с меняющейся погодой.
Чтобы активировать эту возможность , придется немного попотеть. Чтобы понять как это работает, я расковырял несколько сценариев из воркшопа, где задействована эта фишка.
1) вставить в скрипт сценария активацию событий смены погоды
пример скрипта:
function OnEvent ( event )
-- Instruction triggers
---------------------------
-- Timed triggers
---------------------------
if event == "MP1735" then
SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1735" )
return TRUE
end
if event == "MP1740" then
SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1740" )
return TRUE
end
return FALSE
end
вкратце что здесь делается. MP1735, MP1740 - это имена событий привязанные к маркерам пути в сценарии (названы по номеру пикета/километражу, название может быть любым ). эти имена нужно прописать в свойство TriggerEventSuccess у путевого маркера, при проезде которого будет срабатывать событие.
код вышеуказанного скрипта по имени события вызывает эффект погоды из файла расширения WeatherExtension
далее, чтобы добавить расширение погоды к сценарию, нужно вручную отредактировать файл ScenarioProperties.xml
изначально там было вот что:
никакого расширения не задано
<WeatherExtensionBlueprint>
<iBlueprintLibrary-cAbsoluteBlueprintID>
<BlueprintSetID>
<iBlueprintLibrary-cBlueprintSetID>
<Provider d:type="cDeltaString"></Provider>
<Product d:type="cDeltaString"></Product>
</iBlueprintLibrary-cBlueprintSetID>
</BlueprintSetID>
<BlueprintID d:type="cDeltaString"></BlueprintID>
</iBlueprintLibrary-cAbsoluteBlueprintID>
</WeatherExtensionBlueprint>
мы там прописываем ссылку на наш собственный файл расширения погоды
как-то так
собственно Tour.xml это и есть файл расширения погодных эффектов
находится он в папке Assets в подкаталоге принадлежащей конкретному маршруту. audio это относительный путь внутри ассетов маршрута.
в данном случае это путь
папка_игры\Assets\GNTX\Stevens Pass\audio
путь папки маршрута в явном виде не задается а определяется через имя провайдера и продукта.
<WeatherExtensionBlueprint>
<iBlueprintLibrary-cAbsoluteBlueprintID>
<BlueprintSetID>
<iBlueprintLibrary-cBlueprintSetID>
<Provider d:type="cDeltaString">GNTX</Provider>
<Product d:type="cDeltaString">StevensPass</Product>
</iBlueprintLibrary-cBlueprintSetID>
</BlueprintSetID>
<BlueprintID d:type="cDeltaString">audio\Tour.xml</BlueprintID>
</iBlueprintLibrary-cAbsoluteBlueprintID>
</WeatherExtensionBlueprint>
сам файл расширения погоды имеет довольно загадочную и недокументированную структуру. я его просто скопипастил из существующего, и перезаписал нужные мне строчки
для активации аудиовоспроизводящих маркеров там есть такие записи
<cTriggeredWeatherEventChain d:id="7896">
<Name d:type="cDeltaString">DetMP1776</Name>
<BlendOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</BlendOutTime>
<LoopMode d:type="cDeltaString">eStop</LoopMode>
<TimedWeatherEvent>
<cWeatherTypeEvent d:id="7901">
<WeatherType d:type="ref">7145</WeatherType>
<Duration d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Duration>
</cWeatherTypeEvent>
</TimedWeatherEvent>
<LocationEvent>
<cLocationWeatherEvent d:id="7905">
<Name d:type="cDeltaString">MP1776</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000A09999B93F" d:precision="string">0.1</Delay>
<AudioControllerName d:type="cDeltaString">Det1776</AudioControllerName>
<InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude>
<InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude>
<TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude>
<TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude>
<FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain>
<HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset>
<AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting>
<AdditiveLightingColour>
<cHcColour>
<Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red>
<Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green>
<Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue>
<Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha>
</cHcColour>
</AdditiveLightingColour>
<Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration>
<TextureID d:type="cDeltaString"></TextureID>
<BottomLeftUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</BottomLeftUV>
<TopRightUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</TopRightUV>
<Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale>
<FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime>
<FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime>
</cLocationWeatherEvent>
<cLocationWeatherEvent d:id="7932">
<Name d:type="cDeltaString">Axle24</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay>
<AudioControllerName d:type="cDeltaString">24X</AudioControllerName>
<InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude>
<InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude>
<TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude>
<TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude>
<FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain>
<HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset>
<AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting>
<AdditiveLightingColour>
<cHcColour>
<Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red>
<Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green>
<Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue>
<Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha>
</cHcColour>
</AdditiveLightingColour>
<Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration>
<TextureID d:type="cDeltaString"></TextureID>
<BottomLeftUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</BottomLeftUV>
<TopRightUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</TopRightUV>
<Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale>
<FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime>
<FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime>
</cLocationWeatherEvent>
</LocationEvent>
</cTriggeredWeatherEventChain>
нас собственно интересует это :
<Name d:type="cDeltaString">DetMP1776</Name>
вот это ссылка на эффект погоды, вызываемый из скрипта через
"WeatherController:SetCurrentWeatherEventChain", "DetMP1735"
то есть при проезде маркера с именем MP1735 будет проигрываться звуковой эффект под именем DetMP1735.
далее, про синтезированную речь со счетом осей поезда.
для этого внутри данного XML блока есть строчка Axle(число осей)
и ниже еще раз это же число в виде 24X.
<Name d:type="cDeltaString">Axle24</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay>
<AudioControllerName d:type="cDeltaString">24X</AudioControllerName>
подозреваю что возможности этого аудиоконтроллера намного больше, и он может синтезировать голосом не только число осей, но и другую информацию. к сожалению это нигде не задокументировано.
разве что вот здесь единственное более-менее внятное объяснение
http://www.railunion.net/forum53/topic10420.html
в сценарии можно воспроизводить аудиозапись, привязав к определенному событию (например проезд маркера)
в Stevens Pass таким образом сделаны говорящие детекторы неисправностей поезда, осуществляющие контроль нагрева букс, и контроль верхнего и нижнего габарита ПС (аналог наших ПОНАБ и УКСПС)
при проезде устройства, оно передает на локомотив синтезированную голосовую запись о наличии/отсутствии дефектов у прошедшего подвижного состава, а также количество осей в составе. это позволяет делать сценарии более жизненными и интерактивными (теоретически, возможна и выдача голосовой информации о неисправностях )
странность в том что в TS2014 это напрямую не реализовано, а разработчики сделали это весьма корявым способом - через расширение погодных эффектов (WeatherExtension). таким же образом , как воспроизводятся звуки грома, дождя и тд в сценариях с меняющейся погодой.
Чтобы активировать эту возможность , придется немного попотеть. Чтобы понять как это работает, я расковырял несколько сценариев из воркшопа, где задействована эта фишка.
1) вставить в скрипт сценария активацию событий смены погоды
пример скрипта:
function OnEvent ( event )
-- Instruction triggers
---------------------------
-- Timed triggers
---------------------------
if event == "MP1735" then
SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1735" )
return TRUE
end
if event == "MP1740" then
SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1740" )
return TRUE
end
return FALSE
end
вкратце что здесь делается. MP1735, MP1740 - это имена событий привязанные к маркерам пути в сценарии (названы по номеру пикета/километражу, название может быть любым ). эти имена нужно прописать в свойство TriggerEventSuccess у путевого маркера, при проезде которого будет срабатывать событие.
код вышеуказанного скрипта по имени события вызывает эффект погоды из файла расширения WeatherExtension
далее, чтобы добавить расширение погоды к сценарию, нужно вручную отредактировать файл ScenarioProperties.xml
изначально там было вот что:
никакого расширения не задано
<WeatherExtensionBlueprint>
<iBlueprintLibrary-cAbsoluteBlueprintID>
<BlueprintSetID>
<iBlueprintLibrary-cBlueprintSetID>
<Provider d:type="cDeltaString"></Provider>
<Product d:type="cDeltaString"></Product>
</iBlueprintLibrary-cBlueprintSetID>
</BlueprintSetID>
<BlueprintID d:type="cDeltaString"></BlueprintID>
</iBlueprintLibrary-cAbsoluteBlueprintID>
</WeatherExtensionBlueprint>
мы там прописываем ссылку на наш собственный файл расширения погоды
как-то так
собственно Tour.xml это и есть файл расширения погодных эффектов
находится он в папке Assets в подкаталоге принадлежащей конкретному маршруту. audio это относительный путь внутри ассетов маршрута.
в данном случае это путь
папка_игры\Assets\GNTX\Stevens Pass\audio
путь папки маршрута в явном виде не задается а определяется через имя провайдера и продукта.
<WeatherExtensionBlueprint>
<iBlueprintLibrary-cAbsoluteBlueprintID>
<BlueprintSetID>
<iBlueprintLibrary-cBlueprintSetID>
<Provider d:type="cDeltaString">GNTX</Provider>
<Product d:type="cDeltaString">StevensPass</Product>
</iBlueprintLibrary-cBlueprintSetID>
</BlueprintSetID>
<BlueprintID d:type="cDeltaString">audio\Tour.xml</BlueprintID>
</iBlueprintLibrary-cAbsoluteBlueprintID>
</WeatherExtensionBlueprint>
сам файл расширения погоды имеет довольно загадочную и недокументированную структуру. я его просто скопипастил из существующего, и перезаписал нужные мне строчки
для активации аудиовоспроизводящих маркеров там есть такие записи
<cTriggeredWeatherEventChain d:id="7896">
<Name d:type="cDeltaString">DetMP1776</Name>
<BlendOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</BlendOutTime>
<LoopMode d:type="cDeltaString">eStop</LoopMode>
<TimedWeatherEvent>
<cWeatherTypeEvent d:id="7901">
<WeatherType d:type="ref">7145</WeatherType>
<Duration d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Duration>
</cWeatherTypeEvent>
</TimedWeatherEvent>
<LocationEvent>
<cLocationWeatherEvent d:id="7905">
<Name d:type="cDeltaString">MP1776</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000A09999B93F" d:precision="string">0.1</Delay>
<AudioControllerName d:type="cDeltaString">Det1776</AudioControllerName>
<InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude>
<InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude>
<TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude>
<TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude>
<FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain>
<HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset>
<AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting>
<AdditiveLightingColour>
<cHcColour>
<Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red>
<Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green>
<Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue>
<Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha>
</cHcColour>
</AdditiveLightingColour>
<Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration>
<TextureID d:type="cDeltaString"></TextureID>
<BottomLeftUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</BottomLeftUV>
<TopRightUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</TopRightUV>
<Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale>
<FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime>
<FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime>
</cLocationWeatherEvent>
<cLocationWeatherEvent d:id="7932">
<Name d:type="cDeltaString">Axle24</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay>
<AudioControllerName d:type="cDeltaString">24X</AudioControllerName>
<InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude>
<InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude>
<TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude>
<TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude>
<FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain>
<HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset>
<AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting>
<AdditiveLightingColour>
<cHcColour>
<Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red>
<Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green>
<Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue>
<Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha>
</cHcColour>
</AdditiveLightingColour>
<Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration>
<TextureID d:type="cDeltaString"></TextureID>
<BottomLeftUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</BottomLeftUV>
<TopRightUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</TopRightUV>
<Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale>
<FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime>
<FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime>
</cLocationWeatherEvent>
</LocationEvent>
</cTriggeredWeatherEventChain>
нас собственно интересует это :
<Name d:type="cDeltaString">DetMP1776</Name>
вот это ссылка на эффект погоды, вызываемый из скрипта через
"WeatherController:SetCurrentWeatherEventChain", "DetMP1735"
то есть при проезде маркера с именем MP1735 будет проигрываться звуковой эффект под именем DetMP1735.
далее, про синтезированную речь со счетом осей поезда.
для этого внутри данного XML блока есть строчка Axle(число осей)
и ниже еще раз это же число в виде 24X.
<Name d:type="cDeltaString">Axle24</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay>
<AudioControllerName d:type="cDeltaString">24X</AudioControllerName>
подозреваю что возможности этого аудиоконтроллера намного больше, и он может синтезировать голосом не только число осей, но и другую информацию. к сожалению это нигде не задокументировано.