Table of contents


ONScripter (O-N-Scripter) is a program that interprets and executes scripts written for NScripter (Details) in its own way. It can run games on Windows, Android, iOS, etc. using the exact same game data.

I accept behavior reports, bug reports, feature addition requests, and patches at any time, so please send them to [Bug Tracking System]. Please uncheck the box in the middle of the options field before submitting your report. You can send your reports directly to the email address listed at the bottom of this page.

Source package

Latest release onscripter-20220816.tar.gz
Previous release onscripter-20220123.tar.gz

Binary package (Android and Zaurus packages are tested by ME)

Android (2.0 and later)ONScripter in Google Play
ONScripter on Android
Zaurus (SL-C700, etc.)SDL on Zaurus page
LinuxDebian Official Unstable (sid)
Debian Official Testing (bullseye)
Debian Official Stable (buster)
ONScripter Launcher and Binary for Mac OS X
WindowsONScripter on Windows
iPhone, iPod touchiPodOns
NetWalkerQt beginner's memo
Brain (WindowsCE 6.0)ONScripter for Brain
Playstation3PS3 Linux de zisaku soft wo tanoshimo
WiiONScripter WiiBrew
FreeBSDOfficial FreeBSD package
Private Ports for FreeBSD
DreamcastONScripter for Dreamcast
Let me know if you have others

ONScripter-EN is a variant of ONScripter, which has been extended by Uncle Mion san to handle English scripts well. It has more supported NScripter commands than ONScripter. It also seems to be able to execute conventional Japanese scripts without problems.


  1. You can load and save save files that are compatible with the latest NScripter (2011/12/15). Please see How to play on different platforms at the same time.
  2. All operations can be done from the keyboard. Of course, you can also use the mouse.
  3. You can change CD Audio playback to music file (MP3, Ogg) playback.
  4. It supports multiple platforms, including Windows, Linux, MacOS X, MacOS 9, Android(1.6 or later), iPhone, iPad, PSP, Zaurus (SL-5500,SL-A300,SL-B500,SL-C700), FreeBSD, OpenBSD, Haiku, Solaris(on SPARC), Tru64 UNIX, OS/2Warp, iPod, PocketPC, Playstation3, Wii, GP2X, NetWalker and Dreamcast. It should also work on other platforms as well if Requirements are satisfied.
  5. Since we have not implemented all the commands and specifications, some games may behave strangely. If this happens, please report it to the bug tracking system above.

How to run


The following programming languages and libraries are required. The versions listed are for my development environment, but you don't need to adapt to this version.



  • SMPEG-0.4.5
    SMPEG is required to play MPEG1 movie files. Either SMPEG or MAD is required to play MP3 music files.
  • ogg-1.2.0, vorbis-1.3.1 (The Ogg Vorbis CODEC Project)
    Ogg Vorbis is required to play Ogg Vorbis music files. It is enabled by default in Makefile.Linux and Makefile.ArmLinux included in the source package. Tremor Vorbis can be used instead that decodes music using integer arithmetics only.


  • mad-0.15.1b (MAD: Mpeg Audio Decoder)
    MAD is a MP3 decoding library that uses only integer arithmetics. This is essential if you want to play MP3 music files on Android or Zaurus. To use MAD, SDL_mixer library must be built with MAD enabled instead of SMPEG.
  • avifile-0.7.48 (avifile)
    Avifile is necessary if you want to play AVI files with avi command. It is enabled when USE_AVIFILE is defined and AVIWrapper.o is linked.

ONScripter has been tested on Linux (Debian Buster), Android (Sony (8.0)), iOS (iPad2), and sometimes on Windows.

How to build

Unpack ONScripter source package in an appropriate location. Type " make -f Makefile.Linux " on Linux, or type " nmake -f Makefile.Win " on Windows. On Windows, the path to the header files and libraries for bzip2, SDL, SMPEG, etc., should be modified in Makefile.Win depending on your environment.

How to run

[Required] Copy the necessary archives of a game to the same location. Usually, you need a script file (0.txt or nscript.dat) and archive files (arc.sar or *.nsa or *.ns2). If there are multiple archive files such as arc1.nsa to arc9.nsa, you need to copy them as well. In some games, images and sounds are placed outside archive files. In that case, you also need to copy them all. The easiest way is to copy the directory including sub-directories where a game is installed.

[Required] Following Displaying Kanji using TrueType font, put a Japanese TrueType font file renamed as "default.ttf".

[Optional] If you want to play music files instead of CD audio tracks, please follow the instructions in Using music files instead of CD audio to prepare music files.

[Required] Run ONScripter. It reads from nscript.dat and archives in the same directory, and the game will start. Since ONScripter outputs save files and status files in the same directory, please be sure that the directory is writable.


  1. (High) Lua support
  2. (Middle) Apply "windoweffect" when "windowerase" is performed on mouse right click
  3. (Middle) Store the image obtained by "bgcopy" when storing save files
  4. (Middle) Deal with the case where shadow of characters is overlapped to other characters
  5. (Low) "english" command support to handle an English script
  6. (Low) Verify "existspbtn" which is implemented as "spbtn"
  7. (Low) Clean up of code
Akizuki Katane san's diary who ported ONScripter to various platforms.
Kisara san's diary who maintained the bug tracking system for ONScripter in the past.


Keyboard shortcut

All operations including mouse operations can be performed by keyboard short-cuts, though the shortcut keys defined in the script have higher priority.

Key Description
space Same as mouse left click, except it behaves as if the area outside the button is clicked even if the mouse cursor is just on a button.
return Same as mouse left click.
escape Same as mouse right click.
p,k,↑ Move the mouse cursor onto the previous choice (button) at decision branch (button selection).
n,j,↓ Move the mouse cursor onto the next choice (button) at decision branch (button selection).
s Skip sentences to the next decision branch.
o Switch to one page display mode.
h,← Same as mouse wheel up.
l,→ Same as mouse wheel down.
f Switch between full screen mode and windowed mode.
a Enter into the auto read mode if automode or mode_ext is defined.
z Enter into the volume and variables modification mode if "--edit" is specified in the command line options.
1, 2, 3 Change the speed of drawing characters.
Shift + q Quit. (end command is issued)

Command line options

Options Description
-h,--help Show the help messages and exit.
-v,--version Show the version information and exit.
--cdaudio Use CD audio if available. Even if it is not available, sound files are not used instead. [default: use Music files instead of CD audio]
--cdnumber cd_number Choose the CD-ROM drive number to use if there are many. [default: 0]
-f,--font file Set a TTF font file. [default: default.ttf in the current directory]
--registry file Set a registry file.
--dll file Set a dll file.
-r,--root path Set the directory where the script and archives are placed. [default: current directory]
--fullscreen Start in full screen mode.
--window Start in windowed mode.
--force-button-shortcut Ignore "getenter" and "useescspc" commands. In other words, "esc", "space" and "return" keys are forced to behave as a mouse click.
--enable-wheeldown-advance Advance the text on mouse wheel down when it waits for a click at the end of a sentence. If the behavior of waiting for a click is customized by "textgosub", this option has no effect.
--disable-rescale Do not rescale the images in the archives to fit in the screen when compiled with PDA_WIDTH or PDA_AUTOSIZE defined. Along with the compressed archives as mentioned in Compression of archives, ONScripter will run faster by avoiding the need for resizing. Note that image files outside the archives are resized as before.
--render-font-outline Render the outline of a text in black (or white if the color of the text is dark) using the outline rendering function supported in SDL_ttf since 2.0.10. Text will be clearly shown.
--edit Enable online modification of the volume and variables when "z" is pressed.

How to play on different platforms at the same time

You can share save files among different platforms such as desktop PC (Windows, Linux, MacOSX), smartphone (Android, iPhone), etc. To do this, you need to prepare game data on all platforms and move all output files generated from ONScripter (or NScripter) from one platform to another.

NScripter or ONScripter generates/updates following files. Some may not be generated depending on games.

Output files Description
archive_path/gloval.savglobal variables
archive_path/envdataenvironmental variables
archive_path/kidoku.datalready-read texts
archive_path/NScrflog.datalready-read files
archive_path/NScrllog.datalready-read labels in a script
archive_path/save*.datsave files (those generated by ONScripter can not be read from NScripter, but those generated by NScripter can be read from ONScripter)
archive_path/sav/save*.datsave files compatible with NScripter (not warranted) generated by ONScripter
archive_path/other imagesScreenshots may be saved as images. Directory and name of images are dependent on games.

The format of a save file may change when a newer version of NScripter (or ONScripter) is released. So, ONScripter generates a save file having extra information about the version number of a save file in the header. A save file without a version number is also generated under "sav" directory if it exists and it is compatible with a save file generated from the latest NScripter. Note that the version number of a save file is different from the version number (e.g. 20120225) of ONScripter.

ONScripter can load any save files with version number and save files in the latest format without version number.

From ONScripter to ONScripter

Simply copy all the above mentioned modified files including save*.dat.
ONScripter_dir/* → ONScripter_dir/*

From NScripter to ONScripter

Simply copy all the above mentioned modified files including save*.dat.
NScripter_dir/* → ONScripter_dir/*

From ONScripter to NScripter

Copy all the above mentioned modified files excluding save*.dat.
ONScripter_dir/* -> NScripter_dir/*
Copy save files under "sav" directory
ONScripter_dir/sav/save*.dat -> NScripter_dir/save*.dat


  • Save files generated from the latest NScripter (nscr.exe released in 2011/12/15) are supported. ONScripter doesn't load save files generated from older version of NScripter.
  • Compatibility between the latest NScripter and ONScripter is not guaranteed, but there has been no problem as far as I know.
  • Use the above mentioned latest NScripter from the beginning if you use both ONScripter and NScripter. In that case, be sure to make "sav" directory in advance.

Reading from the registry

getreg command reads data from the registry of Windows. ONScripter emulates this command by reading from registry.txt (text file) that describes the data.

The format of registry.txt is as follows. Letters are case sensitive. Be careful not to have extra spaces. If you use Kanji characters, use Shift JIS code set.

[the second argument of getreg command (excluding quotation marks around)]
the third argument of getreg command = string to be compared (including quotation marks around)

Example of registry.txt


"Download log file"="c:\nomad_down.log"
"Upload log file"="c:\nomad_up.log"

You can share a registry file among games if ONScripter is launched with --registry option. Without --registry option, it looks for registry.txt in the current directory.

Loading DLL

exec_dll command executes DLL (Dynamic Link Library) that is built to run on Windows. ONScripter emulates this command by reading from dll.txt (text file) that describes the relationship between the name of a DLL and its return value. So, DLL is not executed and the return value is fixed.

The format of dll.txt is as follows. Letters are case sensitive. Be careful not to have extra spaces. If you use Kanji characters, use Shift JIS code set.

[Name of DLL]
str = "string" (string value received in getret command)
ret = integer (integer value received in getret command)

Example of dll.txt

str = "山田/太郎/やまだ/たろう"
ret = 1

str = "StudioOGA"
ret = 2

You can share a dll file among games if ONScripter is launched with --dll option. Without --dll option, it looks for dll.txt in the current directory.

Online modification of volume and variables

This is a temporary function and might be modified or removed in the future.

It is enabled by setting '--edit' option when launching ONScripter.

If you press z key when waiting for key-in, you will enter edit mode and the title bar becomes as follows.

[EDIT MODE]  MP3 vol (m)  SE vol (s)  Voice vol (v)  Numeric variable (n)

If you further press any of m, s, v, n key, you will enter sub edit mode where you can change corresponding variables. You can escape from edit mode by pressing ESC key.

If you press 'n' key, you have to choose a variable first and then change its value.

You can use '0' to '9', '-', BackSpace, Esc, Return keys when you change numeric variables. '-' key is accepted when you are editting a numeric variable and the value is 0. If the value is other than 0, you need to clear the value by pressing BackSpace key and then press '-' key.

Displaying Kanji characters using TrueType font

Japanese TrueType font is required to display Kanji characters. For example, msgothic.ttc under c:\Windows\Fonts in Windows 7, or freely available TrueType fonts shown below can be used.

Genjyuu gothic
It is a round gothic style font derived from Gennokaku gothic. Among them, I recommend GenJyuuGothicX-Monospace-Bold.ttf because it is bold, beautiful, and easy-to-read.
M+ and IPA compositional font
Re-distributable fonts based on M+ font and IPA font. Among them, I recommend Migu-2M-bold.ttf because it is bold, beautiful, and easy-to-read.
IPA font
Re-distributable Gothic and Mincho font.
Mika-chan font
Handwritten font.

Because SDL_ttf renders Kanji characters badly when TTF_STYLE_BOLD is enabled, ONScripter just ignores "bold" settings. If you use a small device like smartphones, it is better to use a bold TrueType font such as Migu-2M-bold.ttf mentioned above and HG Gothic E (HGRGE.TTC).

TrueType font file should be renamed to default.ttf and be placed in the same directory where a script file is placed before launching ONScripter.

Using sound files instead of CD audio

Create a directory named "cd" in the directory where scripts and archives are placed, and put sound files as follows.
MP3, OGG and WAV format are supported. Please change the above "xxx" according to the format of the sound files.

The behavior of a command to play the first CD audio track, i.e. play "*1", is changed to play "track01.mp3". This is the default behavior unless "--cdaudio" option is specified. In case of missing sound files, "play" command is just ignored.

Playing MIDI

MIDI is played by SDL_mixer. When playing MIDI, a temporary file "tmp.mus" is created because SDL_mixer can only load MIDI data from a file.

Playing MIDI using a software sound module on Unix (tested on Linux and Zaurus) (default)
Playing MIDI using timidity, a software sound module incorporated in SDL_mixer. In this case, you need to download a set of sound patches timidity.tar.gz and expand them under, for example, /usr/local/lib/.
Playing MIDI on Windows
You need to download a set of sound patches timidity.tar.gz and expand them under c:\.
Playing MIDI using a hardware sound module on Unix (tested on Linux)
playmidi 等の外部音源を使用できる MIDI player をインストールし、環境変数 MUSIC_CMD を設定してください。(例 MUSIC_CMD=/usr/bin/playmidi)
当方では、シリアル接続で外部音源を繋ぎ、MUSIC_CMD に '/usr/bin/midiplay -q -o /dev/ttyS0' を設定して動作確認をしています。
playmidiは、カーネルで認識される MIDI ポートに対してしか演奏できませんが、midiplayはシリアルに直接出せます。
シリアルポートをMIDIポートにする patchを使えば、playmidi でもシリアル接続音源を使えそうですが、未確認です。

Compression of archives

The screen size of Linux Zaurus (320x240) or PSP (360x270) is smaller than the size expected in the script. By resizing the images in the archives beforehand, you can keep the size of the archives small and use the storage efficiently. Images with SPB format are stored as BMP format unless -e option is specified.


sarconv                    src_screen_width dst_screen_width src_SAR_filename dst_SAR_filename
nsaconv [-e] [-ns2] [-ns3] src_screen_width dst_screen_width src_NSA_filename dst_NSA_filename

src_screen_width can be 640 or 800.

dst_screen_width can be any width such as 176(iPod), 320(QVGA), 360(PSP), 384(PSP), 640(VGA).


Converting a SAR archive from 640x480 to 320x240.

> sarconv 640 320 arc.sar zaurus_dir/arc.sar

Converting a NSA archive from 800x600 to 320x240.

> nsaconv [-e] 800 320 arc.nsa zaurus_dir/arc.nsa
> nsaconv [-e] 800 320 arc1.nsa zaurus_dir/arc1.nsa

Converting a NSA (ns2) archive from 800x600 to 640x480.

> nsaconv [-e] -ns2 800 640 arc.nsa zaurus_dir/arc.nsa
> nsaconv [-e] -ns2 800 640 arc1.nsa zaurus_dir/arc1.nsa

You have to manually distinguish the version (1 or 2 or 3) of NSA archive. The use of ns2 command in the script indicates version 2, while the use of ns3 command indicates version 3. If you cannot check the script, please try without -ns2 first. If it fails, please try with -ns2 or -ns3.

With the -e option, wav and bmp files are compressed in nbz format. This sets a special value, incompatible with NScripter, for the flag indicating the compression type of NSA archive. This extension may conflict with an extension by NScripter in the future. In that case, it can be solved by modifying the converter and reconverting archives. Since reconverting doesn't affect save files, etc., those who use ONScripter in Zaurus are advised to convert with this option. Since wav is compressed with bzip2, archives become quite small in games that heavily use wav. As a disadvantage, the game speed is slightly slower because it additionally decodes bzip2, but it's not noticiable.

With the -j option, bmp files are converted to jpeg files while keeping the filenames unchanged. Except, bmp files using palette color are not converted.

The option -q sets the quality of jpeg compression ranging from 0 to 100. Small value indicates low quality but small file size. The default value is 75.

The option --disable-rescale is required when a rescaled archive is used.

You can enjoy a game in 320x240 resolution on Linux if ONScripter is compiled with -DPDA.

Problem of chattering MP3 music on Windows platform

Windows でコンパイル済の SMPEG のバイナリを持ってくると、MP3 によっては音がぶつぶつとぎれて演奏されます。これは、SMPEG を MSVC でコンパイルする時の最適化の問題で、下記の通りに MSVC の global optimization を一部抑制する指定をし、自分でコンパイルすることで解決できます。

修正するファイル: audio/mpeglayer3.cpp
関数 layer3reorderandantialias の前後に、下のように #pragma 指定を追加 する。

#pragma optimize( "g", off )
void MPEGaudio::layer3reorderandantialias(int ch,int gr,
                                          REAL  in[SBLIMIT][SSLIMIT],
                                          REAL out[SBLIMIT][SSLIMIT]){
#pragma optimize( "g", on )

How to write an English novel

This feature is an extension to NScripter proposed by Chend (chendo[at] He has contributed to ONScripter greatly by proposing specifications and sending patches.

コンパイル時に ENABLE_1BYTE_CHAR を定義することで、`(back quote) 以 降行末もしくは別の ` までを、1byte 文字で記述されたテキスト文とみなし て表示するようにします。この間では半角スペースが表示として有効になりま すが、テキスト内の変数表示は無効になり、また色・時間指定も開始位置によっ ては無効になります。テキスト途中で色を変える場合は、/ で行を分けるなど してください。ただし、クリック待ち(@)改ページ待ち(\)直後の強制クリック 文字を無視(_)は有効です。

将来本家で ` に何か機能を割り振った場合には、削除もしくは別の文字に 変更される可能性があります。現状のように ENABLE_1BYTE_CHAR の指定の有 無で使い分けられるようにするかもしれませんが、保証の限りではありません。

また、コンパイル時に ENABLE_1BYTE_CHAR と合わせて FORCE_1BYTE_CHAR を指定すると、全ての表示を半角にすることが可能になります。具体的には、 上記に加えて、右クリックメニューの表示が英語になり、また数字変数の表示 が半角になります。


clickstr `.?"`, 2 
savename `Save the scene`, `Load the scene`, "Memory "
rmenu `Save to file`,save,`Load from file`,load
`Hi, this was test.
`Hi, this is test again.
`_"He said so."
`_"She said so."
`Does it work??
selgosub `Say "Turn to the right."`, *right, 
`Say "Turn to the left."`, *left ,
"`Do nothing.", *nothing

`You turned to the right.

`You turned to the left.

`You didn't do anything.



The values in the table below are used exclusively.

IDLE_EVENT_MODENot clickable wait.wait
WAIT_BUTTON_MODEWait for selection using ButtonLink (image).btnwait, select, right-click menu
WAIT_INPUT_MODE Wait for clickable user input.delay, click, @, \, text rendering, screen effect

The values in the table below are used conjunction with the values in the table above.

WAIT_TIMER_MODEWait for the specified time, animation is processed while waitingMost cases except for screen efffect and text rendering.
WAIT_VOICE_MODEWait until voice is finihsed.automode, btntime2 only
WAIT_TEXT_MODEWait at the end of text.@, \, select
WAIT_RCLICK_MODEWait for right click.lrclick

Order of rendering layers

In the table below, the lower layer is hidden by the upper layer. The initial value of "humanz" is 499.

Text is always rendered at the top when appeared.

Normal"windowback" is used
Text window and textNumeric label
Numeric labelBar
BarSprite (from humanz to 0)
** monochrome and negation effect **Text window and text
Sprite2 (from 255 to 0)Sprite2 (from 255 to 0)
Sprite (from humanz to 0)** monochrome and negation effect **
Tachi-e (standing characters)
Sprite (from 999 to humanz+1)