Copyright © 2018 Jeminie Interactive All rights reserved.

翻译:Mutant 校对:zbx1425 翻译尚未完全完成

本文作者是Jeminie。为了不引起国际问题,谢绝转载。请使用本页链接。


Hmmsim开发文档

此页面正在施工中。请注意语法可能在将来的版本中改变。

Hmmsim的开发方式具有全新的结构和新增的功能。
将来,在将BVE线路转换为Hmmsim线路之后,开发者将能够添加或编辑新功能。


文件兼容性

字符编码ASCII / UTF-8
贴图格式.bmp
物件格式.hmmo / .csv
声音格式.wav / .ogg / .mp3


文件结构

Scenarios.txt -> Localization
->Train
-> Scenario -> Map
->Track
->Train


脚本语法

#命名空间
标志命名空间 (可以理解成部分) 开始

{ ... }
命名空间的内容包含在大括号中,这个就是大括号:{}。

命令 = ;
命令 = 0, 值1, ...;
在命名空间中调用命令。 有些命令需要多个值作为参数。
如果未在需要多个值的指令中列出所有值,则将其视为指令中设置的默认值。

command();
command(value0, value1, ...);
也有像函数一样的指令。 同样的,某些指令需要多个值。

@ comment
插入注释。从 @ 到行末都被视为注释,在解析时会忽略。


Scenarios.txt

该文件是Hmmsim Addon的中心。 该文件名必须是Scenarios.txt。 注: Addon 就是线路包之类的。

#Settings
{
本地化(翻译)文件 = 文件路径;
文件路径:输入语言文件的相对路径。

加载图片(自定义一个加载时显示的图片) = 文件路径;
}

#List
{
#Train
{
注册名称空间以添加列车以显示在路线选择屏幕上。 所有列出的列车将按列出顺序依次 在线路选择框内显示。

Name = 文件名;
列车名字 :输入要在列表中显示的列车名称。如果第一个字是 $,则将其替换为语言文件中设置的ID的文本。

File = 文件路径;
文件路径 : 列车文件的相对路径。
}

#Scenario
{
添加要在路线选择屏幕上显示的线路。 所有添加了的线路将被 按顺序依次 显示在路线选择屏幕上。

Name = 路线名称;
Name : 输入要在列表中显示的线路名称。 如果第一个字是$,则将其替换为语言文件中设置的ID的文本。

File = 文件路径;
文件路径 : 线路文件的相对路径
}
}


Localization

此文件设置用于 Addon 的所有文本。 如果不需要,则不需要创建此文件。
如果没有与游戏设置语言对应的ID,则默认情况下会显示英文文本。

#English
{
$ID = 文本;
ID : 输入文字的ID。
文本 : 输入游戏设置语言为英语时要显示的文本。
}

#Korean
{
$ID = 文本;
ID : 文本的ID
文本 : 输入游戏设置语言为韩语时要显示的文本。
}

#Japanese
{
$ID = 텍스트;
ID : 输入文字的ID。
文本 : 输入游戏设置语言为日语时要显示的文本。
}


Scenario

这是设置地图的文件,游戏将在该地图上运行并放置火车.

#Map
{
定义 = 定义0, 定义1, ...;
定义 : 地图文件(类似于OpenBVE的Route.csv文件)输入对应的定义 (与 C 语言中 #define 比较类似)。 您可以输入多个值。
如果未在地图中使用定义,则无需编写此命令。

File = 文件路径;
文件路径 : 地图文件的相对路径。

#Track
{
添加列车行驶的进路。 放置列车时,可以使用所有添加的进路。

Name = 名称;
名称 :输入进路名称

File = 文件路径;
文件路径 : 进路文件的相对路径
}
}

#Trains
{
#MyTrain
{
设置玩家将要驾驶的列车。

Track = 名称;
名称 : 列车运行的进路的名称。可在此前添加的进路中选取。

DepartTime = 时间;
时间 : 列车到达第一站的时间 HH:MM:SS (不同于OpenBVE的HH.MMSS) HH-小时,MM-分钟,SS-秒,都要是两位,不足开头补零
}

#Train
{
放置其他列车 (AI车, 对头车)。 所有添加的列车都放置在地图上。

File = 文件路径;
文件路径 : 列车文件的相对路径。

Track = 名称;
名称 : 列车运行的进路的名称。可在此前添加的进路中选取。

DepartTime = 时间;
时间 : 列车到达第一站的时间 HH:MM:SS (不同于OpenBVE的HH.MMSS) HH-小时,MM-分钟,SS-秒,都要是两位,不足开头补零
}
}


Track

进路文件设置列车运行的进路。

#Track
{
#Rail
{
添加由一段或多段轨道组成的进路。 轨道必须按照行驶的顺序给出。

Name = 名称;
名称 : 输入在地图文件中设定的轨道的名称。

Section = 开始位置,结束位置;
开始位置 : 进路在这条轨道上的这一段,在地图文件中的起始位置。
结束位置 : 进路在这条轨道上的这一段,在地图文件中的结束位置。
可以将起始位置设置为比结束位置更大。 这样的话,列车就会沿反方向运行。
}
}

#Diagram
{
#Station
{
添加要放置在进路上的车站。 所有添加的停车位置必须按到达的顺序排列。

Name = 名称;
名称 : 输入车站名称。 如果第一个字是 $ ,则将其替换为语言文件中设置的ID的文本

Position = 位置;
位置 输入停止位置

Range = null, 范围;
null :该值未被使用。请随意填写。
范围 :输入允许的停止范围。
*此命令在1.3.0版中更改为以下形式。
Range = 范围;

Door = 方向;
方向 :输入以下值之一作为开门方向
Left :设置为左侧开门。
Right :设置为右侧开门。
None : 设置为不开门通过。

Time = 到达时间,出发时间;
到达时间 : 到达时间时:分:秒(HH:MM:SS)在表格中输入时间的值。
出发时间 : 出发时间时:分:秒(HH:MM:SS) 在表格中输入时间的值。
这个时间是指,从到达第一站的时间开始算,到这个时间,之间的差值
因此,第一站的到达时间必须设置为0:00:00。
}
}

#Events
{
#Sky
{
注册名称空间以添加背景纹理事件以放置在轨道上。 必须按照行车时遇到它们的顺序来写。(仅支持.bmp文件)

Position = 位置;
位置:启用的轨道位置

File = 文件路径;
文件路径 :输入要用作背景纹理的文件的相对路径。
}

#Brightness
{
注册名称空间以添加要放置在轨道上的火车亮度值。 必须按照行车时遇到它们的顺序来写。类似于OpenBVE中的Brightness,不过请注意这里的值的范围并不是0~255,而是0.0~1.0

Position = 位置;
位置 :启用的轨道位置。

Brightness = 亮度;
亮度 输入线路内亮度的值,范围: 0.0 ~ 1.0 之间
}

#RunSound
{
注册名称空间以添加火车行驶声音事件以放置在轨道上。 必须按照行车时遇到它们的顺序来写。

Position = 位置;
位置 :启用的轨道位置。

Sound = 索引;
索引:输入在火车文件中设置的行驶音或轮轨摩擦音。
}

#Switch
{
注册名称空间,以添加要在轨道上放置的火车转弯通行声音文件。 必须按照行车时遇到它们的顺序来写。这里仅支持.wav文件

Position = 位置;
位置 :启用的轨道位置。
}

#Limit
{
注册名称空间以添加速度限制指令以放置在轨道上。 必须按照行车时遇到它们的顺序来写。

Position = 位置;
位置:启用的轨道位置。

Speed = 速度;
速度输入限速
}

#Announce
{
注册名称空间以添加要放置在轨道上的声音事件。 必须按照行车时遇到它们的顺序来写。(该指令常被用来放置报站)

Position = 位置;
位置 :输入声音开始的轨道位置

File = 文件路径;
文件路径 : 报站声音的文件路径
}
}


Train

设置火车的文件。(有点类似OpenBVE的train.dat文件,不过这个文件还囊括了extensions.cfg以及sound.cfg)

#Specifications
{
Handle = null;
当前未使用该命令。

Deceleration = 减速度;
减速度 :以km/h/s输入减速度值

FrictionCoefficient = null;
当前未使用该命令

AirBrakeSpeed = 速度;
速度:从电磁制动转为空气制动的参考速度。

#PowerNotch
{
设置加速档位

Count = 数量;
数量 :输入加速档位数。

ControlDelay = 增加反应时间,减少反应时间;
增加反应时间:输入档位上升的反应速度(以秒为单位)。
减少反应时间:输入档位下降时的反应速度(以秒为单位)。

ControlJerk = 加速度上升速度,加速度下降速度;
加速度上升速度 :增加级位时,以m / s3为单位的加速度变化的速度
加速度下降速度 :减少级位时:以m / s3为单位的加速度变化的速度。

#Acceleration
{
设置加速度曲线。(若是在进行OpenBVE开发,那么TrainEditor会代替我们来完成这项工作,可惜在进行Hmmsim原生格式开发时没有一个TrainEditor来代替我们)

Notch[指数] = a0, a1, v1, v2, e;
인덱스:输入加速档位
a0:输入在速度为0km/h时应用的加速度,以km/h/s为单位。
a1 : v1输入以km/h/s为单位的速度应用的加速度。
v1 : 输入加速度插值开始的速度。
v2 : 输入加速度插值开始的速度
e : 输入加速度曲线所需的指数。
必须为所有索引设置与加速档位一样多的索引。
}
}

#BrakeNotch
{
设置制动级位。

Count = 数量;
数量 : 输入级位数。

ControlDelay = 增加反应时间,减少反应时间;
增加反应时间:输入档位上升的反应速度(以秒为单位)。
减少反应时间:输入档位下降时的反应速度(以秒为单位)。

ControlJerk = 加速度上升速度,加速度下降速度;
加速度上升速度 :增加级位时,以m / s3为单位的加速度变化的速度
加速度下降速度 :减少级位时:以m / s3为单位的加速度变化的速度。
}

#Pressure
{
设置制动系统压力。

Reservoir = 最小压力,最大压力;
最小压力:输入主风缸的最小压力,单位为kPa。
最大压力:输入主风缸的最大压力,单位为kPa。

CylinderMax = 常用制动最大压力,紧急制动压力;
常用制动最大压力输入常用制动的最大压力,单位为kPa。
紧急制动压力以kPa为单位输入紧急制动压力。

CylinderDelta = 上升变化量,下降变化量;
上升变化量:输入制动压力上升的速度,单位为kPa / s。
下降变化量 : 输入制动压力下降的速度,单位为kPa / s。
}
}

#TrainSet
{
#Car
{
注册名称空间以添加火车的车厢。 必须按顺序写。

Objects = 文件路径0, 文件路径1, ...;
文件路径:输入用作车辆对象的文件的相对路径。 您可以输入多个值。

Length = 长度;
长度:输入车厢长度。

Axles = 前轴位置,后轴位置;
前轴位置:以车辆中心为基准,前轴的相对位置。
后轴位置:以车辆中心为基准,后轴的相对位置。

View = x, y, z;
x : 相对于车厢中心,视点的X位置。
y : 相对于轨道高度,视点的Y位置。
z : 相对于车厢中心,视点的Z位置。(与OpenBVE还是有细微差别的)

Mass = null;
当前未使用该命令。
}
}

#Sounds
{
设置火车中使用的所有声音。

Motor[一个数字] = 文件路径;
索引:输入要使用的一个数字,其值介于0 ~ 15 之间
文件路径:输入用作电机音的声音文件的相对路径。

Run[索引] = 文件路径;
索引 : 输入要使用的索引,其值介于0 ~ 7 之间
文件路径 : 输入用作走行音的声音文件的相对路径。

Flange[数字] = 文件路径;
索引 : 输入要使用的数字,其值介于0 ~ 7 之间
文件路径 : 输入用作轮轨摩擦音(过弯道)的声音文件的相对路径。

Reverser[상태] = 파일경로;
상태 : 역전기 상태를 다음 값 중 하나로 입력합니다.
Up : 역전기가 올라갈 때를 설정합니다.
Down : 역전기가 내려갈 때를 설정합니다.
파일경로 : 역전기 제어음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

PowerNotch[数值] = 文件路径;
数值 : 任意正整数
Up : 加速槽上升时设定。
Down : 设置加速槽何时下降。
Max : 当加速度档位上升到最大步数时设置。
Min : 当加速度降到0时设置。
文件路径 :输入用作加速陷波控制声音的声音文件的相对路径。

此处查看OpenBVE的sound.cfg的开发方式,以下几个和OpenBVE开发方式相近

BrakeNotch[상태] = 파일경로;
상태 : 제동 놋치 상태를 다음 값 중 하나로 입력합니다.
Up : 제동 놋치가 올라갈 때를 설정합니다.
Down : 제동 놋치가 내려갈 때를 설정합니다.
Max : 제동 놋치가 최대 단수로 올라갈 때를 설정합니다.
Min : 제동 놋치가 0으로 내려갈 때를 설정합니다.
파일경로 : 제동 놋치 제어음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

AirBrake[상태] = 파일경로;
상태 : 제동 상태를 다음 값 중 하나로 입력합니다.
Release : 제동이 해제될 때를 설정합니다.
ReleaseHigh : 제동이 완전히 해제될 때를 설정합니다.
ReleaseFull : 비상 제동이 체결될 때를 설정합니다.
파일경로 : 공기 제동음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Door[상태] = 파일경로;
상태 : 출입문 상태를 다음 값 중 하나로 입력합니다.
LeftOpen : 왼쪽 출입문이 열릴 때를 설정합니다.
RightOpen : 오른쪽 출입문이 열릴 때를 설정합니다.
LeftClose : 왼쪽 출입문이 닫힐 때를 설정합니다.
RightClose : 오른쪽 출입문이 닫힐 때를 설정합니다.
파일경로 : 출입문 구동음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Klaxon[인덱스] = 파일경로;
인덱스 : 사용할 인덱스를 다음 값 중 하나로 입력합니다.
0 : 일반 경적음을 설정합니다.
1 : 발차벨을 설정합니다.
파일경로 : 경적음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Lamp[상태] = 파일경로;
상태 : 램프 상태를 다음 값 중 하나로 입력합니다.
On : 램프가 점등될 때를 설정합니다.
Off : 램프가 꺼질 때를 설정합니다.
파일경로 : 램프 점등음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Buzzer = 파일경로;
파일경로 : 부저음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Switch = 파일경로;
파일경로 : 분기기 통과음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Noise = 파일경로;
파일경로 : 열차 잡음 배경음으로 사용할 사운드 파일의 상대 경로를 입력합니다.
}

#Motorgraph
{
구동음 그래프를 설정합니다.

#Power
{
가속 상태의 구동음 그래프를 설정합니다.

#Motor인덱스
{
네임스페이스를 등록하여 구동음 인덱스에 대응하는 그래프를 설정합니다.

Key = 속도, 볼륨, 피치;
속도 : 키의 속도 값을 입력합니다.
볼륨 : 속도에 해당하는 볼륨 값을 입력합니다.
피치 : 속도에 해당하는 피치 (Pitch) 값을 입력합니다.
낮은 속도 순서대로 키를 추가합니다. 키와 키 사이는 선형 보간으로 처리됩니다.
}
}

#Brake
{
제동 상태의 구동음 그래프를 설정합니다.

#Motor인덱스
{
네임스페이스를 등록하여 구동음 인덱스에 대응하는 그래프를 설정합니다.

Key = 속도, 볼륨, 피치;
속도 : 키의 속도 값을 입력합니다.
볼륨 : 속도에 해당하는 볼륨 값을 입력합니다.
피치 : 속도에 해당하는 피치 (Pitch) 값을 입력합니다.
낮은 속도 순서대로 키를 추가합니다. 키와 키 사이는 선형 보간으로 처리됩니다.
}
}
}


Map

*当前,地图文件语法与脚本语法略有不同。 在1.3.0版中,所有都将被改为脚本语法。

<Settings>
该名称空间当前已过时,将在1.3.0版中弃用。

<Structures>

Object[一个数值] = 文件路径
一个数值 : 随着"Object"指令的增加而增加,范围在 0 ~ 65535 之间
文件路径 : 相对路径,我想这个不用再重复了吧

Sound[一个数值] = 文件路径
一个数值 : 随着"Sound"指令的增加而增加,范围在 0 ~ 255 之间
文件路径 : 依然是相对路径

*此命名空间在1.3.0版中更改为以下形式。
#Assets
{
Object[一个数值] = 文件路径;
Sound[一个数值] = 文件路径;
}

<Map>

[Main]

设置主轨道*也就是OpenBVE中所谓的Rail 0。 以下命令仅在主轨道上可用。

Curve(曲线半径,外轨超高);
曲线半径 : 输入以米为单位的曲线半径。(+右,-左)
外轨超高 : 输入以毫米为单位的倾斜值。

Pitch(坡度);
坡度 : 输入以米/千米为单位的坡度,即一个直角三角形的高。

CurveTransition();
在Curve命令调用之前使用它来建立缓和曲线。

PitchTransition();
在Pitch命令调用之前用于设置垂直曲线。

[名称]

添加新的轨道。 如果其名称与先前添加的轨道相同,则将其视为同一轨道,并且可以连续放置。
以下命令仅在其他轨道上可用

Position(x, y, 曲线插值);
x : 输入X轴相对于主导轨的相对位置。
y : 输入Y轴相对于主导轨的相对位置。
曲线插值 : 输入是否使用曲线插值。
true : 在此指令与下一个Position之间使用曲线插补。
false : 在此指令与下一个Position之间使用线性插补。

以下命令是所有轨道通用的。

位置;
位置:输入当前位置作为非负整数值。

PatternObj(重复组编号, Interval, Span, X, Y, StructureKey1, StructureKey2, ...);
重复组编号 : 输入要给这组重复物件分配的编号,其值介于0 ~ 255 之间
Interval 放置间隔 : 输入要重复的间隔。
Span 放置角度弦长 : 在曲线上的弦长。这个参数决定旋转角。
X : 输入相对于轨道的X位置。
Y : 输入相对于轨道的Y位置
StructureKey 物件编号 : 输入要按顺序重复放置的物件编号。 依次重复放置对象,直到放置完成。

译注:此处借用一下BVE5的Repeater示意图,PatternObj和它的原理相同:

此命令在1.3.0版中更改为以下形式
PatternStart(重复组编号,Interval,Span,x,y,StructureKey1, StructureKey2, ...);

PatternEnd(重复组编号[与Start指令里的数值要相同]);
数值 : 输入数值以结束重复放置物件。

FreeObj(物件编号,放置角度,x,y,y旋转);
物件编号 : 输入要放置的对象索引。
Span 放置角度弦长 : 在曲线上的弦长。这个参数决定旋转角。
x : 输入相对于轨道的X位置。
y : 输入相对于轨道的Y位置。
y旋转 : 相对于轨道,沿Y轴旋转的量。

3DSound(声音, x, y);
声音 : 输入要放置的声音的编号。
x : 输入相对于轨道的X位置。
y : 输入相对于轨道的Y位置。
*此命令在1.3.0版中更改为以下形式。
Doppler(声音, x, y);

#정의;
#else;
#;
분기문을 설정합니다. 분기는 시나리오 파일에서 설정한 Defines 정의 유무에 따라 처리됩니다.
분기문을 연속 배치하면 else if 와 같은 형태로 동작하며, else 분기를 이용할 수도 있습니다.
반드시 #; 을 입력해서 분기 종료를 호출합니다.
*此命令在1.3.0版中更改为以下脚本语法。
#定义
{
}
#else
{
}

*此命令在1.3.0版中更改为以下脚本语法。
#Map
{
#Main
{
Curve(曲线半径,倾斜);
Pitch(坡度);
CurveTransition();
PitchTransition();
}

#轨道名称
{
Position(x, y, 曲线插补);
}

#Main
{
位置;
PatternStart(数值,放置间隔,放置角度,x,y,object0,object1, ...);
PatternEnd(数值(等于上面Start中的数值));
FreeObj(对象,布置角度,x,y,y轴旋转);
Doppler(声音,x,y);

#location
{
}
#else
{
}
}
}


教程

Jeminie还没做......