§
------------------------------------------------
STSKK - Simutrans SDLSKK使用日本語入力パッチ

				Jun 30, 2012
				for STSKK 011
				    wackdone
------------------------------------------------

Windows以外のプラットフォームで、Simutransに
日本語を入力するためのパッチです。
ohaiさん作成の SDLSKK を使用しています。


--------------------
= バージョン情報
--------------------
パッチバージョン: STSKK Version 0.11
対応Simutransソース: Nightly r5788
パッチファイル名: simutrans-r5788-stskk-011.patch

== 適用可能ソースについて
このパッチは、Release 111.3 (r5772) にも適用できることを確認しています。
元は111.0に対して開発したものですので、ある程度古いソースでも
適用可能だと考えられます。

== 動作確認
現在は、MacOS X と NetBSD 上で動作確認をしています。


--------------------
= SKK、SDLSKKとは？
--------------------
SKKは独特な変換スタイルを持つ日本語入力方式です。
動作が軽量なためアプリケーション内に組込むことが容易です。

SDLを使っているアプリケーションにSKKの機能を組込むライブラリが
ohaiさんの作った SDLSKK です。

詳しくはそれぞれのホームページをごらんください。


--------------------
= ビルド方法
--------------------
対応するSimutransのバックエンドは、(当然ながら) sdl あるいは mixer_sdl です。
これ以外のバックエンドには対応していません。

最初にSDLSKKのライブラリを作成し、その後にこのパッチをあてた
Simutransを作成します。

== SDLSKK の入手とビルド
SDLSKKライブラリのソースを
  http://www.kmc.gr.jp/~ohai/sdlskk.html
から入手して手順に従いビルドしてください。

なお SDLSKK の INSTALL.jaにも説明がある通り、
この段階で以下の各ライブラリが必要になります。
  * SDL
  * SDL_ttf
  * iconv

== STSKKパッチの適用
Nightlyのソースを入手し、これに対して同梱のパッチファイル
  simutrans-r5788-stskk-010.patch
をpatchコマンドなどを使ってあててください。

例:
{{{
  svn co -r5788 svn://tron.homeunix.org/simutrans/simutrans/trunk
  cd r5788
  patch -p0 < simutrans-r5788-stskk-010.patch
}}}

== ビルドのコンフィギュレーション
ビルドコンフィグファイル (config.defaultなど) の中に以下の行を追加してください。

{{{
  SDLSKK = 1
  SDLSKK_INCPATH = -I/usr/local/include
  SDLSKK_LIBPATH = -L/usr/local/lib
}}}

SDLSKK_INCPATH と SDLSKK_LIBPATH には、
SDLSKKのヘッダファイルやライブラリがインストールされたパスを指定してください。
(SDLSKKがSDLと同じ場所にインストールされている場合は、この定義は空でもかまいません。)

なお SDLSKK の定義を空にすると、SDLSKK 対応機能が無効で
(つまりオリジナルのSimutransのまま) ビルドされます。
障害時の動作比較などに使用してください。

== ビルド
オリジナルと同様に make でコンパイル、リンクできます。


--------------------
= STSKKが使用するファイル
--------------------
できあがったSimutransを起動する前に、いくつかのファイルを準備しておく必要があります。

STSKKは、Simutransのワーキングディレクトリ (-singleuser の時の "simutrans") の
下に以下のファイルを必要とします。

  skk_rule_table:
    ローマ字カナ変換ルールファイル
    サンプルをこのパッチに同梱しておきます。
    文法についてはSDLSKKのホームページを参考にしてください。

  skk_jisyo:
    辞書ファイル
    SKK形式辞書(unannotated)を UTF8 に変換したものです。

  skk_font.ttf:
    表示用フォントファイル
    一般的な日本語TTFファイルが使用できます。

これらのファイルのサンプルとして、
  * 一般的な変換ルール
  * SKK-JISYO.L を UTF8 にしたもの
  * さざなみフォント
をまとめて、
  http://ux.getuploader.com/wackdone_simutrans/download/5/stskk-files-010.zip
に置いておきます。


また、プログラムを正常に終了させると、以下のファイルが作成されます。
  skk_user_jisyo
    ユーザ辞書ファイル
    ゲーム内で辞書登録したものが辞書形式で保存されます
次回以降の起動時にプログラムはこのファイルをロードします。


--------------------
= 使用方法
--------------------
(現在は必要最小限、見た目無視の実装になっています。
ほど良い改善案などございましたらご提案ください。)

simutransの中のテキスト入力をできる場所で
  Shift + Space
あるいは
  Ctrl + J
を打鍵すると、SKK入力モードに入ります。
(モードに入った直後は何も表示されないので注意)

モード内での入力は画面最下部のステータスラインの上に上書きで表示されます。

以下に挙げるような一般的なSKKのキーバインディングで操作ができます。
  q      かな/カナのトグル
  l      半角英数モード
  L      全角英数モード
  Ctrl+J かなモードへ戻る
  大文字 変換モードへ入っての入力
  小文字 かな確定入力
  Space  変換モードでの変換
などなど。おかしなモードに入ってしまったなと思ったら、Ctrl+Jを打つのはお約束です。
候補無しの場合の辞書登録(ユーザ辞書へ)も可能です。


STSKKとして特殊なキーは以下のものです。
  Enter  SKK入力モードで入力した文字を元のテキスト入力に反映して、モードから抜ける
  Escape 入力を中止してSKK入力モードから抜ける


== 注意
SKK入力モードに入っている間は、ゲームの進行が停止します。
Simutransのシミュレーションの仕組みにより、入力モードから戻ると突然
ゲーム内時刻が進行してしまうこともあります。
ゲームをポーズさせてからSKK入力を行うことをお勧めします。

またゲームのステータスラインは、時に任せて復元されるのを待ってください。


--------------------
= オリジナルとの互換性
--------------------
ファイルに関する問題はありません。
このパッチを適用しても、セーブゲームバージョンやpakのバージョンなど
一切の変化はありません。

これまで進めてきたセーブゲームをそのまま使用することができます。
またこのバージョンでセーブしたゲームを同系列のオリジナルのSimutransで
ロードすることができます。


--------------------
= ソースの概要
--------------------
このパッチは以下の二つの新しいソースファイルを導入します。
  * dr_sdlskk.cc
  * dr_sdlskk.h

また以下のソースコードにパッチをあてます。
  * simsys_s.cc
  * gui/components/gui_textinput.cc

== simsys_s.cc
プログラム起動時に dr_sdlskk の初期化を呼び出すフックを入れてあります。
(終了時処理はatexit()でフックしています)

== gui_textinput.cc
SKK入力モードに入るキーイベント (Ctrl+JとShift+Space)のインターセプトを行い、
モードから戻ってきたら入力結果をテキストフィールドに挿入します。

SKK入力モードに入るキーを変更するには、ここをいじります。
(switch内gotoの飛ばし方がちょっと行儀悪いですが、パッチを最小にしたかったもので)

== dr_sdlskk
SDLSKK用ドライバです。
バックエンド依存ということを意識して dr_ ではじまる名前にしています。
モード内での動作を修正する場合などはここをいじることになります。

キー入力に応じたループは、dr_im_input_offspot() が行っています。
(Simutrans全体を通してのイベントドリブンになっていない理由は後述)


--------------------
= 課題
--------------------
前述の通り、現在の実装は必要最小限のものとなっています。
今後は、改造コストが少なくてすみ有用性、必要性のあるものに絞って
対応していこうかと考えています。

== 入力モード表示: 必要性中?
現在のSKKの入力モードがわからない。
どのように表示させるのがスマートか決めかねています。
まあ、手間の問題でもあるのですが。

== ゲームの進行が止まる: 必要性高?
ぶっちゃけ、まじめにイベントドリブンにするのが面倒だったからです。
また、SDLのイベントがSimutransのイベントに変換されてしまうことも、
実装を面倒にさせる要因ではあります。
特にネットワーク対戦などした場合には、この問題は大きいかもしれません。

== ステータスラインを書き潰す
ポーズをかけていれば別に困らないだろうと、そのままになっています。

== 表示設定など
入力ラインの色や高さなどが全てハードコーディングされてしまっています。

== キーバインディング
SDLSKKが規定しているもの(標準のSKKと互換)についてはそのままにします。
このパッチで規定している
  SKK入力モードに入る (Shift+Space, Ctrl+J)
  SKK入力モードから抜ける (EnterとEscape)
などは変更できるようにした方がいいのかとも思います。

== on-the-spot入力: コスト高
現在はoffspotですが、テキスト入力のところに直接入力できていった方が
格好はいいです。ですがこれをやるとなると、SimutransのGUI機能と
正面からむかい合うことになり、かなりの改造になります。
(まさにXなどでのIM開発の歴史そのものです)


--------------------
= ご利用上の注意点とお願い
--------------------
このパッチは現在、αクオリティです。
動作の保証はできず、一切の責任を負いません。

バグのご報告や機能改善のご提案はウェルカムです。
(ただし充分に対応できる余裕はございませんので対応が遅れましてもご了承ください。)
ご連絡は日本語フォーラム
  Japanese Simutrans Forum
の該当トピックへお願いいたします。
(どうしても個人的に、という場合は、wackdone at gmail.com へメールください)

このパッチによってWindows以外のSimutransユーザでも、
より豊かなマップ開発が出来るようになることを願っています。
