TITLE: 吉里吉里2にUTF8読み込み機能を追加する実験プラグイン
AUTHOR: miahmie

●これはなに？

吉里吉里２は標準ではUTF-8のテキスト読み込みに対応しておらず，
一部プラグイン（lineParser/csvParser）などを使ってスクリプト側で処理して
UTF-8のテキストを読み込む対応をしていました。

このプラグインを使用すると Array.load 等の吉里吉里の標準の
テキスト読み込み処理についてもUTF-8テキストの読み込みに対応します。

ただしテキスト読み込みの差し替えは吉里吉里のプラグインインターフェースでは
提供されておらず，無理やり本体にパッチを当てることで処理を置き換えるという
対応になっています。

すなわち，吉里吉里２のバージョンや使用されているコンパイラ依存になるため，
このプラグインが必ずしも使用できる／動作するとは限りません。

主に吉里吉里Ｚへの移行や，２（開発用）とＺ（リリース用）の併用に
おけるテキストエンコード問題を回避したいといった使用を想定しています。

※このプラグインを使用してゲームをリリースするのはお勧めしません。


●使い方

k2utf8hack.dll がこのプラグイン本体です。
拡張子tpmにリネームして吉里吉里２の起動前にリンクさせるか，
startup.tjsなどでこのプラグインをリンクしてください。
（その場合，リンク前のテキスト読み込みは従来通りの挙動になります）

・Scripts.textEncoding プロパティが追加されますが，
　吉里吉里Zと若干仕様が異なります：

　Z: Scripts.{eval|exec}Storage の文字コードに影響を受ける
　これ: 上記以外にも Array.load の文字コードも影響を受ける

　※プロパティの値については 下記 -readencoding の指定と同様です。
　　指定外の値を設定すると ANSI 相当の動作になります。
　　吉里吉里Zでは範囲外の値で読み込むと未サポート例外が発生する仕様差に注意。

・コマンドライン/cf/cfuの起動オプション -readencoding に対応します：
（値が参照されるのはこのプラグインがリンクされた時のタイミングです）
　UTF-8, Shift_JIS, ANSI, auto の指定に対応します。

　Shift_JISは吉里吉里Zと違い，codepage 932 指定で文字コードを変換します。
　ANSI は CP_ACP でOSの言語設定に依存した動作になります。これは吉里吉里Zの
　　Shift_JIS を指定した時の動作と同じものになります。
　Shift_JIS/ANSIの指定であってもBOMつきUTF8であれば読み込むことができます。
　auto はこのプラグイン独自の機能で，UTF-8/Shift_JISを自動で判定して
　　コード変換処理を行います。（未指定時のデフォルト動作です）


なお，吉里吉里Ｚでこのプラグインをリンクしても何も起こりません。
併用したい場合は特に2とZで場合分け処理をする必要はないかと思います。


●コンパイル

premake4にてプロジェクトファイルを作成してコンパイルしてください。
__fastcallの実装に依存するため必ず VisualC++ にてコンパイルしてください。

../tp_stub.* および ../00_simplebilder フォルダ内のファイルも必要です。


●ファイルについて

readme.txt		このファイル
Main.cpp		プラグインリンク／吉里吉里２本体パッチ処理
nmh.hpp			文字コード判定 https://github.com/shnya/nmh/ の改造版
premake4.lua		プロジェクト生成用premakeファイル
v2link.cpp		simplebinderのv2link改造版（exporterが必要なため）

TextStream.cpp		tTVPTextReadStreamの改造実装
TextStreamHack.hpp	TextStreamのコンパイルを通すためのグルークラス／マクロ等
TextStreamHack.cpp	文字コード変換等

data/startup.tjs	テストスクリプト（要 bin/k2utf8hack-d.dll）
data/test.bat		テストスクリプト起動用バッチ
data/test_*.tjs		各種エンコード済みスクリプト


●その他注意事項

・「動作している吉里吉里２本体にパッチをあてる」という動作の仕様上，
　ウィルス対策ソフトのプログラムふるまい検知機能などが誤認して
　何かしらの警告を出す可能性もありますのでご注意ください。
　（本当に引っかかるのかについては現状では未確認です）

・独自コンパイルした吉里吉里2では動作しない可能性があります。

・auto判定で何故かEUCエンコードにも対応していますが動作保証されません。


●ライセンス

このプラグインのライセンスは吉里吉里２／吉里吉里Ｚに準拠してください。
nmh.hpp は https://github.com/shnya/nmh/ のパブリックドメイン扱いのコードから
引用・改造したものになっています。


●技術情報

・TVPCreateTextStreamForReadにフックを入れて自前処理に差し替えるため
　function exporter のスタブ関数のdisasmコードからアドレスを算出
＞このため基本的に標準リリース吉里吉里２でのみしか動作しない

・標準リリースの吉里吉里2におけるTVPCreateTextStreamForReadは
　BorlandC++基準の__fastcall呼び出しでレジスタ引数渡しでコンパイルされている

・このプラグインではVisualC++の__fastcallに置き換える対応を行うが，
　BorlandC++とVisualC++では__fastcallのレジスタ渡しの仕様が異なるため
　その部分の吸収を行う必要がある（第一引数 eax->ecxへコピー）

※具体的な詳細は Main.cpp の DirtyHook クラスを参照

