Bve trainsim > 制作路线与车辆 > 文件格式

© 2016 mackoy 中文翻译 © 2020 zbx1425

地图文件

BveTs Map 2.02:utf-8 地图文件的第一行内容必须是相应的文件头
Curve.SetGauge(1.067); 通过以英文半角分号(;)结尾的指令文字来调用指令。
Track['Right'].X.Interpolate(3.8); 基本的指令是由地图要素和参数构成的。
0; 只有数字的指令设定当前距离
123; Curve.BeginTransition(); SpeedLimit.Begin(90); 可以在同一行中写多条指令。
    Track [ 'Right' ] . Cant . BeginTransition ( ) ; 234 ; 可以在指令各部分之间插入空格或制表符。
Curve.Begin(
600,
0.105
);
可以在指令各部分之间插入换行符,即一个指令可以占多行。
TRACK['RIGHT'].CANT.BEGIN(0.105); 指令不分大小写。
345; # 凭君莫话封侯事,一将功成万骨枯。 以 # 或 // 开头,直到行末的部分是注释注释在解析文件时会被忽略。

文件头

文件类型

必须在文件最开始写上 "BveTs Map 2.02" 。

字符编码

文件类型之后是一个冒号(:),然后是该文件的字符编码,然后换行。不可在冒号前后加空格。如果没有写字符编码,视为UTF-8。

例如,这是用了Shift JIS日文文字编码的文件的文件头。 (译注: 推荐您使用UTF-8。)

BveTs Map 2.02:shift_jis

注释

以 # 或 // 开头,直到行末的部分在解析文件时会被忽略。不支持/* */类的区域注释。

基本指令

基本指令构成如下:

地图要素.函数(参数, 参数, ...)
地图要素[索引名称].函数(参数, 参数, ...)
地图要素[索引名称].地图要素.函数(参数, 参数, ...)

主轨道平面曲线(曲线与超高)

Curve.SetGauge(value) [旧] Curve.Gauge(value)

设定当前距离之后的轨距。这个值是用来将超高换算成角度的。

value: 轨距 [m]

Curve.SetCenter(x) NEW

设定当前距离之后轨距的旋转中心位置。

x: 旋转中心的 x 坐标 [m] (正: 曲线内侧, 负: 曲线外侧)

Curve.SetFunction(id) NEW

设定当前距离之后的缓和曲线函数。

id: 函数编号 (0: 正弦半波长递减, 1: 线性递减)

Curve.BeginTransition()

当前距离开始平面弯道的缓和曲线部分。

Curve.Begin(radius, cant) [旧] Curve.BeginCircular(radius, cant)
Curve.Begin(radius) NEW

当前距离开始平面弯道的圆周部分。如果要使用超高(Cant),必须提前使用 Curve.BeginTransition。

radius: 曲线半径 [m] (正: 向右, 负: 向左)
cant: 超高 [m]

Curve.End()

当前距离结束平面弯道,开始直线。

Curve.Interpolate(radius, cant) NEW
Curve.Interpolate(radius) NEW
Curve.Interpolate() NEW

设定当前距离处的曲线半径。将在上一个 Curve.Interpolate 或 Curve.Change 调用位置到当前位置之间插值。插值时使用 Curve.SetFunction 设定的函数。如省略参数,会使用上一个 Curve.Interpolate 的参数。

radius 曲线半径 [m] (正: 向右, 负: 向左, 0: 直线)
cant 超高 [m]

Curve.Change(radius) NEW

设定当前距离之后的曲线半径。和 Curve.Begin(radius) 等效。

radius 曲线半径 [m] (正: 向右, 负: 向左, 0: 直线)

主轨道坡度

Gradient.BeginTransition()

当前距离开始纵向曲线。

Gradient.Begin(gradient) [旧] Gradient.BeginConst(gradient)

当前距离终止纵向曲线,并保持一定坡度。

gradient 坡度 [‰] (千分比)

Gradient.End()

当前距离终止斜坡,开始水平部分。

Gradient.Interpolate(gradient) NEW
Gradient.Interpolate() NEW

设定当前距离处的坡度,在相邻的 Gradient.Interpolate 之间线性插值。省略参数时、将使用上一个 Gradient.Interpolate 的参数。

gradient 坡度 [‰] (千分比)

其他轨道

Track[trackKey].X.Interpolate(x, radius) NEW
Track[trackKey].X.Interpolate(x) NEW
Track[trackKey].X.Interpolate() NEW

设定当前距离处其他轨道的 x 方向位置。在两个 Track[].X.Interpolate 之间的 x 坐标被平滑插值。省略参数时、将使用上一个 Track[].X.Interpolate 的参数。

trackKey: 轨道名称 (可取任意文字)
x: 相对于主轨道的 x 坐标 [m]
radius: 自当前距离之后相对于主轨道的平面曲线半径 [m] (0: 直线)

Track[trackKey].Y.Interpolate(y, radius) NEW
Track[trackKey].Y.Interpolate(y) NEW
Track[trackKey].Y.Interpolate() NEW

设定当前距离处其他轨道的 y 方向位置。在两个 Track[].Y.Interpolate 之间的 y 坐标被平滑插值。省略参数时、将使用上一个 Track[].Y.Interpolate 的参数。

trackKey: 轨道名称 (可取任意文字)
y: 相对于主轨道的 y 坐标 [m]
radius: 自当前距离之后相对于主轨道的纵向曲线半径 [m] (0: 直线)

Track[trackKey].Position(x, y, radiusH, radiusV)
Track[trackKey].Position(x, y, radiusH)
Track[trackKey].Position(x, y)

设定当前距离处其他轨道的位置。等效于同时使用 Track[].X.Interpolate 与 Track[].Y.Interpolate。但是、省略参数时、将使用 0。

trackKey: 轨道名称 (可取任意文字)
x: 相对于主轨道的 x 坐标 [m]
y: 相对于主轨道的 y 坐标 [m]
radiusH: 自当前距离之后相对于主轨道的平面曲线半径 [m] (0: 直线)
radiusV: 自当前距离之后相对于主轨道的纵向曲线半径 [m] (0: 直线)

Track[trackKey].Cant.SetGauge(gauge) [旧] Track[trackKey].Gauge(gauge)

设定当前距离之后其它轨道的轨距。这个值是用来将超高换算成角度的。

trackKey: 轨道名称 (可取任意文字)
gauge: 轨距 [m]

Track[trackKey].Cant.SetCenter(x) NEW

设定当前距离之后其他轨道轨距的旋转中心位置。

trackKey: 轨道名称 (可取任意文字)
x: 旋转中心的 x 坐标 [m] (正: 曲线内侧, 负: 曲线外侧)

Track[trackKey].Cant.SetFunction(id) NEW

设定当前距离之后其他轨道轨距的递减函数。

trackKey: 轨道名称 (可取任意文字)
id: 函数编号 (0: 正弦半波长递减, 1: 线性递减)

Track[trackKey].Cant.BeginTransition() NEW

当前距离开始其他轨道超高的过渡。

trackKey: 轨道名称 (可取任意文字)

Track[trackKey].Cant.Begin(cant) NEW

当前距离结束其他轨道超高的过渡,超高保持在一个定值。

trackKey: 轨道名称 (可取任意文字)
cant: 超高 [m] (正: 向右倾斜, 负: 向左倾斜)

Track[trackKey].Cant.End() NEW

当前距离结束其他轨道的超高。

trackKey: 轨道名称 (可取任意文字)

Track[trackKey].Cant.Interpolate(cant) [旧] Track[trackKey].Cant(cant)
Track[trackKey].Cant.Interpolate() NEW

设定在当前距离其它轨道的超高。在两个 Track[].Cant.Interpolate 之间的超高被平滑插值。插值时使用 Track[].Cant.SetFunction 设定的函数。如使用参数,会使用上一个 Track[].Cant.Interpolate 的参数。

trackKey: 轨道名称 (可取任意文字)
cant: 超高 [m] (正: 向右倾斜, 负: 向左倾斜)

物件

Structure.Load(filePath)

该指令加载物件列表文件。必须要在调用该指令之后才能放置物件。

filePath: 从地图文件所在文件夹到物件列表文件的相对路径

Structure[structureKey].Put(trackKey, x, y, z, rx, ry, rz, tilt, span)

放置一个物件。

structureKey: 物件名称 (在物件列表文件中定义的名称)
trackKey: 物件放置所在轨道 (0: 主轨道)
x: 相对于轨道的 x 坐标 [m]
y: 相对于轨道的 y 坐标 [m]
z: 相对于当前距离的 z 坐标 [m]
rx: 相对于轨道的 x 轴旋转角 [deg °]
ry: 相对于轨道的 y 轴旋转角 [deg °]
rz: 相对于轨道的 z 轴旋转角 [deg °]
tilt: 倾斜选项 (0: 一直水平, 1: 跟随坡度, 2: 跟随超高, 3: 跟随坡度和超高)
span: 在弯道上的弦长 [m]

Structure[structureKey].Put0(trackKey, tilt, span)

放置一个物件。等效于 Structure[].Put 中的 x, y, z, rx, ry, rz 全部设定为 0。

structureKey: 物件名称 (在物件列表文件中定义的名称)
trackKey: 物件放置所在轨道 (0: 主轨道)
tilt: 倾斜选项 (0: 一直水平, 1: 跟随坡度, 2: 跟随超高, 3: 跟随坡度和超高)
span: 在弯道上的弦长 [m]

Structure[structureKey].PutBetween(trackKey1, trackKey2, flag) NEW
Structure[structureKey].PutBetween(trackKey1, trackKey2)

当前距离的两个轨道之间放置物件。物件会按照两个轨道之间的距离自动变形。

trackKey1: 一边轨道的名称 (0: 主轨道)
trackKey2: 另一边轨道的名称
flag: 变形方向 (0: 在 x、y 两方向上变形, 1: 只在 x 方向上变形)

连续物件组

Repeater[repeaterKey].Begin(trackKey, x, y, z, rx, ry, rz, tilt, span, interval, structureKey1, structureKey2, ... , structureKeyN)

当前距离开始连续放置物件。物件将被沿着一条轨道以一定的间隔重复放置。

repeaterKey: 连续物件组名称 (可取任意文字)
trackKey: 物件放置所在轨道 (0: 主轨道)
x: 相对于轨道的 x 坐标 [m]
y: 相对于轨道的 y 坐标 [m]
z: 相对于轨道的 z 坐标 [m]
rx: 相对于轨道的 x 轴旋转角 [deg °]
ry: 相对于轨道的 y 轴旋转角 [deg °]
rz: 相对于轨道的 z 轴旋转角 [deg °]
tilt: 倾斜选项 (0: 一直水平, 1: 跟随坡度, 2: 跟随超高, 3: 跟随坡度和超高)
span: 在弯道上的弦长 [m]
interval: 放置间距 [m]
structureKey1, ... , structureKeyN: 物件名称 (在物件列表文件中定义的名称)

物件被放置在主轨道距离(dist)为间距(interval)的整数倍的地方。如果你给出了 N 个要放置的物件、会放置第 (dist / interval) mod N + 1 个给出的物件。 (译注: mod 为除法取余数运算。弦长span决定物件的一个旋转角度,下图讲得很清楚。)

図

Repeater[repeaterKey].Begin0(trackKey, tilt, span, interval, structureKey1, structureKey2, ... , structureKeyN)

当前距离开始连续放置物件。等效于 Repeater[].Begin 中的 x, y, z, rx, ry, rz 全部设定为 0。

repeaterKey: 连续物件组名称 (可取任意文字)
trackKey: 物件放置所在轨道 (0: 主轨道)
tilt: 倾斜选项 (0: 一直水平, 1: 跟随坡度, 2: 跟随超高, 3: 跟随坡度和超高)
span: 在弯道上的弦长 [m]
interval: 放置间距 [m]
structureKey1, ... , structureKeyN: 物件名称 (在物件列表文件中定义的名称)

Repeater[repeaterKey].End()

当前距离后停止连续放置物件。

repeaterKey: 连续物件组名称

Background.Change(structureKey)

更换背景(天空盒)模型。

structureKey: 物件名称

车站

Station.Load(filePath)

该指令加载车站列表文件必须要在调用该指令之后才可使用 Station.Put 指令。

filePath: 从地图文件所在文件夹到车站列表文件的相对路径

Station[stationKey].Put(door, margin1, margin2)

将列车的停止位置设定到当前距离。不会自动产生停车位置标牌,需要使用 Structure.Put 指令单独放置。

stationKey: 车站名 (在车站列表文件中定义的名称)
door: 车门开启方向 (-1: 左, 1: 右)
margin1: 停止位置误差后方允许范围 (要设置成负数)
margin2: 停止位置误差前方允许范围

闭塞区间

Section.Begin(signal0, signal1, ... , signalN) [旧] Section.BeginNew(signal0, signal1, ... , signalN)

当前距离开始闭塞区间。

signal0: 先行列车在区间内时的信号编号
signal1: 先行列车在前方第一个区间内时的信号编号
signalN: 先行列车在前方第 n 个区间内时的信号编号

Section.SetSpeedLimit(v0, v1, ... , vn) [旧] Signal.SpeedLimit(v0, v1, ... , vn)

设定信号显示的允许速度。

v0, v1, ... , vn: 行车速度 [km/h] (null: 不限速)

地面信号机

Signal.Load(filePath)

信号显示定义信息基于信号显示列表设定。必须要在调用该指令之后才可使用 Signal.Put 指令。

filePath: 从地图文件所在文件夹到信号显示列表的相对路径

Signal[signalAspectKey].Put(section, trackKey, x, y)
Signal[signalAspectKey].Put(section, trackKey, x, y, z, rx, ry, rz, tilt, span)

当前距离放置地面信号机。

signalAspectKey: 信号显示名称 (在信号显示列表中定义的名称)
section: 与信号机关联的闭塞区间的相对编号 (译注: 0 代表当前位置所在区间)
trackKey: 信号放置所在轨道
x: 相对于轨道的 x 坐标 [m]
y: 相对于轨道的 y 坐标 [m]
z: 相对于轨道的 z 坐标 [m]
rx: 相对于轨道的 x 轴旋转角 [deg °]
ry: 相对于轨道的 y 轴旋转角 [deg °]
rz: 相对于轨道的 z 轴旋转角 [deg °]
tilt: 倾斜选项 (0: 一直水平, 1: 跟随坡度, 2: 跟随超高, 3: 跟随坡度和超高)
span: 在弯道上的弦长 [m]

应答器

Beacon.Put(type, section, sendData)

当前距离定义应答器发信事件。如需放置应答器实体模型,请使用 Structure[].Put 指令。

type: 发送到信号系统插件的应答器类型 (整数)
section: 与应答器关联的闭塞区间的相对编号
sendData: 发送到信号系统插件的数据值 (整数)

限速

SpeedLimit.Begin(v)

当前距离开始限速。如需放置限速标识,请使用 Structure.Put 指令。

v: 走行速度 [km/h]

SpeedLimit.End()

当前距离结束限速。如需放置限速解除标识,请使用 Structure.Put 指令。

先行列车

PreTrain.Pass(time)
PreTrain.Pass(second)

设定先行列车通过当前距离的时刻。

time: 表示时间的文字 ('hh:mm:ss') ('时:分:秒') (均为两位数)
second: 自 00:00:00 经过的秒数 [sec]

光照

Light.Ambient(red, green, blue)

设置环境光颜色。该指令在整个地图文件中只能使用一次。

red: 红色分量 (0 ~ 1)
green: 绿色分量 (0 ~ 1)
blue: 蓝色分量 (0 ~ 1)

Light.Diffuse(red, green, blue)

设置平行光(漫射光)颜色。该指令在整个地图文件中只能使用一次。

red: 红色分量 (0 ~ 1)
green: 绿色分量 (0 ~ 1)
blue: 蓝色分量 (0 ~ 1)

Light.Direction(pitch, yaw)

设置相对于主轨道距离 0 位置的平行光方向。该指令在整个地图文件中只能使用一次。

雾效果

Fog.Interpolate(density, red, green, blue) [旧] Fog.Set(density, red, green, blue)
Fog.Interpolate(density) NEW
Fog.Interpolate() NEW

设定在当前距离的雾效果。雾效果在两个 Fog.Interpolate 指令之间线性插值。

density: 浓度
red: 红色分量 (0 ~ 1)
green: 绿色分量 (0 ~ 1)
blue: 蓝色分量 (0 ~ 1)

渲染距离

DrawDistance.Change(value)

设定当前距离之后的渲染距离。实际使用的渲染距离是玩家在设置窗口中指定的距离和此指令设定的距离中较小的。

value: 距离 [m] (0: 使用设置窗口中的距离)

驾驶台亮度

CabIlluminance.Interpolate(value) [旧] CabIlluminance.Set(value)
CabIlluminance.Interpolate() NEW

设定在当前距离的驾驶台亮度。驾驶台亮度在两个 CabIlluminance.Interpolate 指令之间线性插值。

value: 日间图片与夜间图片的混合比例 (0: 夜间图片 ~ 1: 日间图片)

轨道偏移

Irregularity.Change(x, y, r, lx, ly, lr)

设定当前距离之后的轨道不规则程度。

x: 左右偏移的标准差 (等同于轨道横向上偏离设计位置距离的平均值) [m]
y: 上下偏移的标准差 (等同于轨道纵向上偏离设计位置距离的平均值) [m]
r: 侧倾移位的标准差 (等同于侧倾角度的平均值除以轨距) [rad 弧度]
lx: 左右偏移的截止波长 [m]
ly: 上下偏移的截止波长 [m]
lr: 侧倾移位的截止波长 [m]

摩擦特性

Adhesion.Change(a)
Adhesion.Change(a, b, c)

设定当前距离之后车轮与轨道之间的摩擦特性。

a: 车辆静止时车轮与轨道之间的摩擦系数
b: 表示摩擦系数随速度变化的系数
c: 表示摩擦系数随速度变化的系数

粘着係数式

此式中的 v: 行车速度 [km/h]

广播声音

Sound.Load(filePath)

根据声音列表文件加载声音。

filePath: 从地图文件所在文件夹到声音列表文件的相对路径

Sound[soundKey].Play()

在通过当前距离时播放一次指定声音。

固定音源

Sound3D.Load(filePath)

根据声音列表文件加载声音。

filePath: 从地图文件所在文件夹到声音列表文件的相对路径

Sound3D[soundKey].Put(x, y)

当前距离放置固定的音源。声音会被连续重复播放。

x: 相对于轨道的 x 坐标 [m]
y: 相对于轨道的 y 坐标 [m]

行车噪音

RollingNoise.Change(index)

设定当前距离之后的车轮转动噪音。 (译注: 应该是和风声等在一起的行车噪音)

index: 车辆声音文件中 [Run] 小节定义的声音编号

轮缘摩擦噪音

FlangeNoise.Change(index)

设定当前距离之后的轮缘摩擦噪音。 (译注: 即通过弯道时轮缘和轨道摩擦产生的尖声)

index: 车辆声音文件中 [Flange] 小节定义的声音编号

道岔噪音

JointNoise.Play(index)

通过当前距离时根据行车速度播放道岔噪音。

index: 车辆声音文件中 [Joint] 小节定义的声音编号

AI车

译注: 其实就是不受玩家控制的列车。起这个名字就是为了顺口,实际上没有AI。

Train.Add(trainKey, filePath, trackKey, direction)
Train[trainKey].Load(filePath, trackKey, direction) NEW

根据其他列车文件定义一列自动运行的列车。

trainKey: AI车名称 (可取任意文字)
filePath: 从地图文件所在文件夹到其他列车文件的相对路径
trackKey: 此列车行驶的轨道
direction: 行车方向 (-1: 对向, 1: 同向)

Train[trainKey].Enable(time)
Train[trainKey].Enable(second)

当玩家操控的列车通过当前距离,且达到设定的时间时,启用这一AI车的动作。

trainKey: AI车名称
time: 表示时间的文字 ('hh:mm:ss') ('时:分:秒') (均为两位数)
second: 自 00:00:00 经过的秒数 [sec]

Train[trainKey].Stop(decelerate, stopTime, accelerate, speed)

让AI车在当前距离停车。

trainKey: AI车名称
decelerate: 减速度 [km/h/s]
stopTime: 停车时间 [s]
accelerate: 加速度 [km/h/s]
speed: 加速后的行车速度 [km/h]

变量

数字和文字可被存入变量中。若要将值存入变量,先写出变量名、然后写等号 ( = )、最后写所需值或表达式即可。

$foo = 1.067;
$bar = 'Hello';

当你在索引名称或参数处使用变量,其值将被代入。

Track[$bar].Gauge($foo); # 等效于 Track['Hello'].Gauge(1.067) 。
$foo2 = $foo; # $foo2 被设置成了 1.067 。

数字和文字都可被存入变量中。文字需被单引号 ( ' ) 括住。使用变量时要在名称前加 $ 符号。可将大小写字母 (A~Z、a~z)、数字 (0~9) 和下划线 ( _ ) 用在变量名中。

以下是错用变量的反面教材。

foo = 1; # 没有在名称前加 $ 符号。
$foo.bar = 1; # 只能使用字母数字和下划线作为名称。
$foo = $bar = 1; # 不能一次给多个变量同时赋值。
1 = $foo; # 不能把变量写在等号右边。
$bar = Hello; # 如要使用文字,必须括在单引号之间。
Curve.Gauge($foo = 1); # 不能在其它指令的中间给变量赋值。
Curve.Gauge('$foo'); # 把变量名用引号括起来不会将变量的值代入,只会原样保留。
$bar = 'Curve.Gauge'; $bar(1.067); # 变量只能用于参数索引名称的代入,不能存成指令名然后调用。

运算符

运算符可被用于变量赋值、参数索引名称

$foo = 1 + 2; # 等效于 $foo = 3 。
Curve.Gauge(1067 / 1000); # 等效于 Curve.Gauge(1.067) 。

可使用以下的运算符。不支持自增、自减和二进制运算。

运算符 意味
+ 加法,或文字连接
- 减法
* 乘法
/ 除法
% 取余数

+ 号在两个操作数是数字时执行加法,是文字时将其连接。如果两个操作数一个是数字、一个是文字,将把数字转化成文字后和另一个文字连接。

$bar = 'Hello' + 'World'; # 等效于 $bar = 'HelloWorld' 。
Track[$bar + 10].Gauge(1.067); # 等效于 Track['HelloWorld10'].Gauge(1.067) 。
$bar = 1 + 2 + '3' # 等效于 $bar = '33' 。

运算符优先顺序如下。

优先顺序 演算子
1 括号
2 一元运算符 (取相反数)
3 * /
4 + -

以下表达式的计算结果是 15 。

1 - 2 * -(3 + 4)

以下是错误使用的反面教材。

$foo = 2 (3 - 1); # 乘法必须用 * 表示。
$foo = 1 / {(2 + 3) * 4}; # 不区分小中大括号,应全部用小括号。
$foo * 1000 = 1067; # 不能在等号左边使用运算符。
$bar = 'Hello' * 2; # 只能对文字进行 + 运算。

当前距离

以下的指令会设定当前距离 [m] 。

当前距离必须是大于零的实数。可通过 distance 变量获取当前距离 (该默认变量开头没有 $ 符号)。

以下的指令都设定当前距离 (但 $foo 的数值会被代入)。

1000; # 当前距离设定为 1000 。
1000 - 25; # 设定为了 975 。
distance + 0.5; # distance 代入为了此指令执行前的当前距离,因此设定为了 975.5 。
$foo; # 设定为了 $foo 所有的值。

这里设定的距离并不一定非要和真实线路的里程对应。由于极大的数值会造成运算误差扩大 (译注: 即浮点运算误差),建议您尽量不要把它设得过大。

数学函数

abs(value)
绝对值。
atan2(y, x) 四象限反正切 (双变量反正切)。
ceil(value) 大于 value 的最小整数 (向上取整)。
cos(value) 余弦函数。
exp(value) 自然常数 (e) 的 value 次方。
floor(value) 小于 value 的最大整数 (向下取整)。
log(value) 自然对数。
pow(x, y) x 的 y 次方。
rand(value)
rand()
大于 0 小于 value 的随机数。
如果没有给出参数、返回大于 0 小于 1 的随机数。
sin(value) 正弦函数。
sqrt(value) 平方根。

插入其它地图

使用 include 指令可在其位置插入另一地图文件的内容。

include 'submap.txt';

要被插入的地图文件也必须要有文件头。但是、文件头不会被插入。

© 2016 mackoy 中文翻译 © 2020 zbx1425