Developing Add-On

This page is currently being created. Please note the syntax to be changed in future versions.

The Add-On for Hmmsim has been designed with a completely new structure with added functionality.
In the future, we will be able to add or edit new features after converting BVE Add-On to Hmmsim Add-On.


File Compatibility

TextASCII / UTF-8
Texture.bmp
Object.hmmo / .csv
Sound.wav / .ogg / .mp3


File Structure

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


Script Syntax

#namespace
Declare the namespace.

{ ... }
Namespaces are enclosed in square brackets.

command = value;
command = value0, value1, ...;
Invoke the command within the namespace. Some commands require multiple values.
If you do not list all of the values in an instruction that requires multiple values, it is treated as the default value set in the instruction.

command();
command(value0, value1, ...);
Functional instructions also exist. Similarly, some instructions require multiple values.

@ comment
Insert a comment. Comments remain until the end of the line.


Scenarios.txt

This file is the starting point for Hmmsim Add-On. This file name must be Scenarios.txt.

#Settings
{
LocalizeFile = 파일경로;
파일경로 : 언어 파일의 상대 경로를 입력합니다.

LoadingImage = 파일경로;
파일경로 : 로딩 화면으로 사용할 텍스쳐 파일의 상대 경로를 입력합니다.
}

#List
{
#Train
{
네임스페이스를 등록하여 노선 선택 화면에 나타낼 열차를 추가합니다. 추가된 모든 열차가 리스트에 순서대로 표시됩니다.

Name = 이름;
이름 : 리스트에 표시될 열차 이름을 입력합니다. 첫 글자가 $ 로 시작하는 경우 언어 파일에서 설정된 ID의 텍스트로 대체됩니다.

File = 파일경로;
파일경로 : 열차 파일의 상대 경로를 입력합니다.
}

#Scenario
{
네임스페이스를 등록하여 노선 선택 화면에 나타낼 시나리오를 추가합니다. 추가된 모든 시나리오가 리스트에 순서대로 표시됩니다.

Name = 이름;
이름 : 리스트에 표시될 시나리오 이름을 입력합니다. 첫 글자가 $ 로 시작하는 경우 언어 파일에서 설정된 ID의 텍스트로 대체됩니다.

File = 파일경로;
파일경로 : 시나리오 파일의 상대 경로를 입력합니다.
}
}


Localization

This file sets all the text used for Add-On. You do not need to create this file if you do not need it.
If there is no corresponding ID for the game setting language, English text is displayed by default.

#English
{
$ID = 텍스트;
ID : 텍스트의 ID를 입력합니다.
텍스트 : 게임 설정 언어가 영어일 때 표시될 텍스트를 입력합니다.
}

#Korean
{
$ID = 텍스트;
ID : 텍스트의 ID를 입력합니다.
텍스트 : 게임 설정 언어가 한국어일 때 표시될 텍스트를 입력합니다.
}

#Japanese
{
$ID = 텍스트;
ID : 텍스트의 ID를 입력합니다.
텍스트 : 게임 설정 언어가 일본어일 때 표시될 텍스트를 입력합니다.
}


Scenario

This is the file that sets up the map where the game will run and places the train.

#Map
{
Defines = 정의0, 정의1, ...;
정의 : 맵 파일에 대응하는 정의를 입력합니다. 여러 개의 값을 입력할 수 있습니다.
맵에서 정의를 사용하지 않는 경우 이 명령어는 작성하지 않아도 됩니다.

File = 파일경로;
파일경로 : 맵 파일의 상대 경로를 입력합니다.

#Track
{
네임스페이스를 등록하여 열차가 움직이게 될 트랙을 추가합니다. 추가된 모든 트랙은 열차를 배치할 때 사용할 수 있습니다.

Name = 이름;
이름 : 트랙 이름을 입력합니다.

File = 파일경로;
파일경로 : 트랙 파일의 상대 경로를 입력합니다.
}
}

#Trains
{
#MyTrain
{
유저가 운행하게 될 열차를 설정합니다.

Track = 이름;
이름 : 추가된 트랙 중 사용할 트랙의 이름을 입력합니다.

DepartTime = 시간;
시간 : 열차가 첫 정거장에 배치될 시간을 시:분:초 (HH:MM:SS) 형태의 값으로 입력합니다.
}

#Train
{
네임스페이스를 등록하여 다른 열차를 배치합니다. 추가된 모든 열차가 맵에 배치됩니다.

File = 파일경로;
파일경로 : 열차 파일의 상대 경로를 입력합니다.

Track = 이름;
이름 : 추가된 트랙 중 사용할 트랙의 이름을 입력합니다.

DepartTime = 시간;
시간 : 열차가 첫 정거장에 배치될 시간을 시:분:초 (HH:MM:SS) 형태의 값으로 입력합니다.
}
}


Track

This file sets the track on which trains will move.

#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
{
네임스페이스를 등록하여 트랙에 배치할 배경 텍스쳐 이벤트를 추가합니다. 추가된 모든 이벤트가 순서대로 배치됩니다.

Position = 위치;
위치 : 이벤트 위치를 입력합니다.

File = 파일경로;
파일경로 : 배경 텍스쳐로 사용할 파일의 상대 경로를 입력합니다.
}

#Brightness
{
네임스페이스를 등록하여 트랙에 배치할 열차 밝기 이벤트를 추가합니다. 추가된 모든 이벤트가 순서대로 배치됩니다.

Position = 위치;
위치 : 이벤트 위치를 입력합니다.

Brightness = 밝기;
밝기 : 열차 밝기를 0.0 ~ 1.0 사이 값으로 입력합니다.
}

#RunSound
{
네임스페이스를 등록하여 트랙에 배치할 열차 주행음 이벤트를 추가합니다. 추가된 모든 이벤트가 순서대로 배치됩니다.

Position = 위치;
위치 : 이벤트 위치를 입력합니다.

Sound = 인덱스;
인덱스 : 열차 파일에서 설정한 주행음 또는 마찰음 인덱스를 입력합니다.
}

#Switch
{
네임스페이스를 등록하여 트랙에 배치할 열차 분기기 통과음 이벤트를 추가합니다. 추가된 모든 이벤트가 순서대로 배치됩니다.

Position = 위치;
위치 : 이벤트 위치를 입력합니다.
}

#Limit
{
네임스페이스를 등록하여 트랙에 배치할 제한속도 이벤트를 추가합니다. 추가된 모든 이벤트가 순서대로 배치됩니다.

Position = 위치;
위치 : 이벤트 위치를 입력합니다.

Speed = 속도;
속도 : 제한속도를 입력합니다.
}

#Announce
{
네임스페이스를 등록하여 트랙에 배치할 안내방송 이벤트를 추가합니다. 추가된 모든 이벤트가 순서대로 배치됩니다.

Position = 위치;
위치 : 이벤트 위치를 입력합니다.

File = 파일경로;
파일경로 : 안내방송으로 사용할 사운드 파일의 상대 경로를 입력합니다.
}
}


Train

The file to set up the train.

#Specifications
{
Handle = null;
현재 사용하지 않는 명령어입니다.

Deceleration = 감속도;
감속도 : 감속도를 km/h/s 단위 값으로 입력합니다.

FrictionCoefficient = null;
현재 사용하지 않는 명령어입니다.

AirBrakeSpeed = 속도;
속도 : 공기 제동으로 전환되는 기준 속도를 입력합니다.

#PowerNotch
{
가속 놋치를 설정합니다.

Count = 단수;
단수 : 놋치 단 수를 입력합니다.

ControlDelay = 상승반응시간, 하강반응시간;
상승반응시간 : 놋치가 올라갈 때의 반응 속도를 초 단위 값으로 입력합니다.
하강반응시간 : 놋치가 내려갈 때의 반응 속도를 초 단위 값으로 입력합니다.

ControlJerk = 상승가가속도, 하강가가속도;
상승가가속도 : 놋치가 올라갈 때의 가가속도를 m/s3 단위 값으로 입력합니다.
하강가가속도 : 놋치가 내려갈 때의 가가속도를 m/s3 단위 값으로 입력합니다.

#Acceleration
{
가속도 곡선을 설정합니다.

Notch[인덱스] = a0, a1, v1, v2, e;
인덱스 : 놋치 인덱스를 입력합니다.
a0 : 0 km/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 = 앞위치, 뒷위치;
앞위치 : 차량의 가운데 0m를 기준으로 앞 대차의 상대 위치를 입력합니다.
뒷위치 : 차량의 가운데 0m를 기준으로 뒷 대차의 상대 위치를 입력합니다.

View = x, y, z;
x : 차량의 가운데 0m를 기준으로 X 축 카메라 시점의 상대 위치를 입력합니다.
y : 레일 높이를 기준으로 Y 축 카메라 시점의 상대 위치를 입력합니다.
z : 차량의 가운데 0m를 기준으로 Z 축 카메라 시점의 상대 위치를 입력합니다.

Mass = null;
현재 사용하지 않는 명령어입니다.
}
}

#Sounds
{
열차에 사용되는 모든 사운드를 설정합니다.

Motor[인덱스] = 파일경로;
인덱스 : 사용할 인덱스를 0 ~ 15 사이 값으로 입력합니다.
파일경로 : 엔진 구동음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Run[인덱스] = 파일경로;
인덱스 : 사용할 인덱스를 0 ~ 7 사이 값으로 입력합니다.
파일경로 : 주행음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

Flange[인덱스] = 파일경로;
인덱스 : 사용할 인덱스를 0 ~ 7 사이 값으로 입력합니다.
파일경로 : 선로 마찰음으로 사용할 사운드 파일의 상대 경로를 입력합니다.

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

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

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

* Currently the map file syntax is slightly different from script syntax. In version 1.3.0, all changes are made in script syntax.

<Settings>
이 네임스페이스는 현재 사용하지 않으며 1.3.0 버전에서 폐지됩니다.

<Structures>

Object[인덱스] = 파일경로
인덱스 : 사용할 인덱스를 0 ~ 65535 사이 값으로 입력합니다.
파일경로 : 오브젝트로 사용할 파일의 상대 경로를 입력합니다.

Sound[인덱스] = 파일경로
인덱스 : 사용할 인덱스를 0 ~ 255 사이 값으로 입력합니다.
파일경로 : 사운드로 사용할 파일의 상대 경로를 입력합니다.

* 이 네임스페이스는 1.3.0 버전에서 다음 형태로 변경됩니다.
#Assets
{
Object[인덱스] = 파일경로;
Sound[인덱스] = 파일경로;
}

<Map>

[Main]

메인 레일을 설정합니다. 다음은 메인 레일에서만 사용 가능한 명령어입니다.

Curve(곡선반경, 캔트);
곡선반경 : 곡선 반경을 미터 단위 값으로 입력합니다.
캔트 : 캔트 값을 밀리미터 단위 값으로 입력합니다.

Pitch(구배);
구배 : 구배를 미터퍼밀 단위 값으로 입력합니다.

CurveTransition();
Curve 명령어 호출 전에 사용하여 완화곡선을 설정합니다.

PitchTransition();
Pitch 명령어 호출 전에 사용하여 종곡선을 설정합니다.

[이름]

새 레일을 추가합니다. 이전에 추가했던 레일과 같은 이름인 경우 동일한 레일로 처리되며 이어서 배치할 수 있습니다.
다음은 기타 레일에서만 사용 가능한 명령어입니다.

Position(x, y, 곡선보간);
x : 메인 레일을 기준으로 X 축의 상대 위치를 입력합니다.
y : 메인 레일을 기준으로 Y 축의 상대 위치를 입력합니다.
곡선보간 : 곡선보간 여부를 다음 값 중 하나로 입력합니다.
true : 다음 Position 명령어와의 사이를 곡선 보간으로 설정합니다.
false : 다음 Position 명령어와의 사이를 선형 보간으로 설정합니다.

다음은 모든 레일에서 공통으로 사용 가능한 명령어입니다.

위치;
위치 : 현재 위치를 음수가 아닌 정수 값으로 입력합니다.

PatternObj(인덱스, 배치간격, 배치각도, x, y, 오브젝트0, 오브젝트1, ...);
인덱스 : 사용할 인덱스를 0 ~ 255 사이 값으로 입력합니다.
배치간격 : 반복 배치할 간격을 입력합니다.
배치각도 : 오브젝트의 배치 각도로 사용할 간격을 입력합니다.
x : 해당 레일을 기준으로 X 축의 상대 위치를 입력합니다.
y : 해당 레일을 기준으로 Y 축의 상대 위치를 입력합니다.
오브젝트 : 반복 배치할 오브젝트 인덱스를 순서대로 입력합니다. 배치를 종료할 때 까지 오브젝트가 순서대로 반복해서 배치됩니다.
* 이 명령어는 1.3.0 버전에서 다음 형태로 변경됩니다.
PatternStart(인덱스, 배치간격, 배치각도, x, y, 오브젝트0, 오브젝트1, ...);

PatternEnd(인덱스);
인덱스 : 반복 배치를 종료할 인덱스를 입력합니다.

FreeObj(오브젝트, 배치각도, x, y, y회전);
오브젝트 : 배치할 오브젝트 인덱스를 입력합니다.
배치각도 : 오브젝트의 배치 각도로 사용할 간격을 입력합니다.
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, 오브젝트0, 오브젝트1, ...);
PatternEnd(인덱스);
FreeObj(오브젝트, 배치각도, x, y, y축회전);
Doppler(사운드, x, y);

#정의
{
}
#else
{
}
}
}


Tutorial

Coming soon...


Copyright © 2017 Jeminie All rights reserved.