2015年

8月20日

最近、Android 版でオートモードが利かないということを聞いたので調べてみました。昔の本家では、automode もしくは mode_ext 命令が実行されるとメニューにオートモードが追加されていました。そのため、ONScripter では、automode もしくは mode_ext 命令が実行された状態で a キーを押した時に、オートモードに入るようになっていました。Android 版では、アプリのメニューのオートモードボタンを押すと a キーが押されたというイベントが発生するようになっています。ところが、少なくとも8年以上前から、本家では最初からメニューにオートモードが表示されるようになっているようです。そこで、a キーが押されたら必ずオートモードに入るように修正しました。これで、Android 版のオートモードボタンも常に利くようになると思います。

8月11日

lsp 命令などのグラフィックファイル指定で、ファイル名の代わりに":c;>幅,高さ,#色"を指定することで長方形の画像ファイルを生成することができますが、この幅と高さに小数点以下の値を持つ数値を指定しても解釈されるようにしました。

8月10日

バグ報告「split命令で落ちます」を元に、いただいたパッチを参考にして、split 命令で切り出された文字列が256バイト以上の場合にセグメンテーションフォルトを引き起こして落ちるバグを修正しました。

バグ報告「ループ位置を指定したBGMが指定位置でループしていない」を元に、整数演算のみを使用した Tremor を OGG Vorbis の再生に使用している Android 版において、BGM 命令で曲先頭からの時間を指定しても反映されないバグを修正しました。具体的には、Android 版 SDK で使用している SDL_mixer-1.2.11 の (1) ov_time_seek 関数の第2引数の型を間違えていたバグと、(2) 第2引数にミリ秒を指定するところを秒を指定していたバグを修正しました。前者の方は SDL_mixer-1.2.12 以降では修正されているようですが、後者の方は修正されていないようです。SDK に以下のパッチ(sdl_mixer.diff)を当ててました。iOS 版は SDL-1.2.12 を使用していますが、後者のバグは同様に修正する必要があります。

--- sdl_mixer.org/dynamic_ogg.h	2010-06-02 04:07:23.000000000 +0900
+++ sdl_mixer/dynamic_ogg.h	2015-08-08 22:41:09.000000000 +0900
@@ -36,10 +36,11 @@
 	ogg_int64_t (*ov_pcm_total)(OggVorbis_File *vf,int i);
 #ifdef OGG_USE_TREMOR
 	long (*ov_read)(OggVorbis_File *vf,char *buffer,int length, int *bitstream);
+	int (*ov_time_seek)(OggVorbis_File *vf,ogg_int64_t pos);
 #else
 	long (*ov_read)(OggVorbis_File *vf,char *buffer,int length, int bigendianp,int word,int sgned,int *bitstream);
-#endif
 	int (*ov_time_seek)(OggVorbis_File *vf,double pos);
+#endif
 } vorbis_loader;
 
 extern vorbis_loader vorbis;
--- sdl_mixer.org/music_ogg.c	2010-06-02 04:07:23.000000000 +0900
+++ sdl_mixer/music_ogg.c	2015-08-08 22:48:50.000000000 +0900
@@ -229,7 +229,11 @@
 /* Jump (seek) to a given position (time is in seconds) */
 void OGG_jump_to_time(OGG_music *music, double time)
 {
+#ifdef OGG_USE_TREMOR
+       vorbis.ov_time_seek( &music->vf, time*1000.0 );
+#else
        vorbis.ov_time_seek( &music->vf, time );
+#endif
 }
 
 #endif /* OGG_MUSIC */

バグ報告「gettag命令で落ちます」を元に、いただいたパッチを参考にして、gettag 命令で落ちる場合があるバグを修正しました。

バグ報告「「ダンジョン少女」の異常終了」を元に、Shift-JIS の漢字コードで、2バイト目が \ になっている場合に、LUA が正しくスクリプトを解釈できないバグを修正しました。

getmclick 命令を実装しました。また、NSLua の NSGetClick, NSGetMouse, NSDoEvents, NSSleep, NSSpCell, NSSp2GetInfo, NSSp2GetPos, NSSp2Load, NSSp2Move 命令を実装しました。

最新の SDK, NDK を使って Linux 上でコンパイルしてみました。android-ndk-r10e-linux-x86 の場合、内部で as, ld, ar に正しくソフトリンクが張られていないため、後にコンパイル途中でエラーになります。そのため、展開後に以下のように修正する必要があります。

> cd <path_to_ndk>/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/libexec/gcc/arm-linux-androideabi/4.8
> ln -s ../../../../bin/arm-linux-androideabi-as as
> ln -s ../../../../bin/arm-linux-androideabi-ld ld
> ln -s ../../../../bin/arm-linux-androideabi-ar ar

Android 版で、ダウンロードした zip ファイルの展開処理を高速化しました。以下のように、ZipInputStream の外側に BufferedInputStream を挿入したところ、10倍程度高速化されました。

	private int extractZipEntry(String out_path, ZipInputStream zip, int total_size, String mes)
	{

...
		BufferedInputStream bis = new BufferedInputStream(zip);
...
			int len = bis.read(buf);

2月8日

textgosub 設定時に、直後の強制クリックを無視する _ の直後に clickstr 命令で設定した文字があった場合に、その文字以降の文章が二重に描画されるバグを修正しました。

2月7日

バグ報告「checkkey・bgmfadeout・bsp・delayの反応と設定のグローバル化」および「文章の末尾に不要な数字が表示される」を元に、スキップもしくは Ctrl キーを押して文章を読み飛ばしている時に、delay 命令において引数が読まれないバグを修正しました。20150102 で発生していました。

iOS版では、シナリオや画像などの静的なファイルは /Library/Caches/ゲーム名/ 以下に、セーブデータなどの中身を変更するファイルは /Documents/ゲーム名/ 以下に保存します。このとき、もし /Documents/ゲーム名/ のフォルダが存在しない場合には、ゲーム開始時に作成するようにしました。

textcolor 命令を実装しました。

textgosub 設定時に、同一行に clickstr 命令で設定した文字が複数存在する場合に、1つ目の文字以降の文章が表示されないバグを修正しました。

1月12日

2015年2月1日以降に App Store に登録するアプリは、iOS 8 SDK を使用して 64bit コードをサポートしている必要があります。64bit コードのアーキテクチャ(ARMv8-A) と 32bit コードのアーキテクチャ (ARMv7) は全く異なるため、32bit 用に記述されたインラインアセンブリコードを 64bit 用にビルドすることはできません。そのため、iOS 版 SDKに以下の修正を施しました。

  • 実機用のコードは armv7 と arm64 の両方のコードを含み、シミュレータ用のコードは i686 と X86_64 の両方のコードを含むようにしました。
  • 以下に示す libmad_0.15.1b-arm64.diff を作成して libmad_0.15.1b に適用し、arm64 向けにビルドする場合、すなわち __aarch64__ が定義されている場合に、MP3 を遅延なく再生できるようにしました。あまり綺麗なパッチではありませんが、手元の iPad2, iPad Air, iPad Air2 では問題なく MP3 を再生することができています。
    --- libmad-0.15.1b-old/configure	2013-11-03 00:54:06.000000000 +0900
    +++ libmad-0.15.1b-new/configure	2015-01-11 15:47:17.000000000 +0900
    @@ -19083,7 +19083,7 @@
         then
     	case "$host" in
     	    i386-*)           ;;
    -	    i?86-*)           arch="-march=i486" ;;
    +#	    i?86-*)           arch="-march=i486" ;;
     	    arm*-empeg-*)     arch="-march=armv4 -mtune=strongarm1100" ;;
     	    armv4*-*)         arch="-march=armv4 -mtune=strongarm" ;;
     	    powerpc-*)        ;;
    
    --- libmad-0.15.1b-old/fixed.h  2013-11-03 00:50:30.000000000 +0900
    +++ libmad-0.15.1b-new/fixed.h  2015-01-12 20:42:18.000000000 +0900
    @@ -26,7 +26,11 @@
     typedef   signed int mad_fixed_t;
     
     typedef   signed int mad_fixed64hi_t;
    +#if defined(FPM_ARM) && defined(__aarch64__)
    +typedef unsigned long mad_fixed64lo_t;
    +#else
     typedef unsigned int mad_fixed64lo_t;
    +#endif
     # else
     typedef   signed long mad_fixed_t;
     
    @@ -239,7 +243,7 @@
     
     /* --- ARM ----------------------------------------------------------------- */
     
    -# elif defined(FPM_ARM)
    +# elif defined(FPM_ARM) && !defined(__aarch64__)
     
     /* 
      * This ARM V4 version is as accurate as FPM_64BIT but much faster. The
    @@ -455,6 +459,16 @@
     
     /* ------------------------------------------------------------------------- */
     
    +# elif defined(FPM_ARM) && defined(__aarch64__)
    +
    +#define OPT_SSO
    +
    +#define mad_f_mul(x, y) ((((long)(x))*(y))>>28)
    +#define MAD_F_MLX(hi, lo, x, y) {lo = ((long)(x))*(y);}
    +#define MAD_F_MLA(hi, lo, x, y) {lo += ((long)(x))*(y);}
    +#define mad_f_scale64(hi, lo)  ((lo)>>28)
    +#define MAD_F_SCALEBITS  MAD_F_FRACBITS
    +
     # else
     #  error "no FPM selected"
     # endif
    
  • 以下に示す libvorbisidec-1.0.2+svn18153-arm64.diff を作成して libvorbisidec-1.0.2+svn18153 に適用し、arm64 向けにビルドする場合、すなわち __aarch64__ が定義されている場合にビルドできるようにしました。
    --- libvorbisidec-1.0.2+svn18153-old/asm_arm.h	2013-11-03 01:04:36.000000000 +0900
    +++ libvorbisidec-1.0.2+svn18153-new/asm_arm.h	2015-01-11 16:18:56.000000000 +0900
    @@ -15,7 +15,7 @@
     
      ********************************************************************/
     
    -#ifdef _ARM_ASSEM_
    +#if defined(_ARM_ASSEM_) && !defined(__aarch64__)
     
     #if !defined(_V_WIDE_MATH) && !defined(_LOW_ACCURACY_)
     #define _V_WIDE_MATH
    
    
  • Xcode の設定ファイル project.pbxproj に以下の2行を追加しました。
    ARCHS = "$(ARCHS_STANDARD)";
    IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
    

1月2日

バグ報告「checkkey・bgmfadeout・bsp・delayの反応と設定のグローバル化」を元に、bgmfadeout 命令でフェードアウトの設定を行い、bgmstop 命令で音楽がフェードアウト中に、saveon 命令などによってセーブデータが作成されてそこからゲームを再開したときに、音楽が再生されてしまうバグを修正しました。

同じバグ報告を元に、マウスカーソルが画面外に出たときに、それを検知してボタンの表示状態を変更するようにしました。

同じバグ報告を元に、スキップ実行時もしくは CTRL キーを押した状態で、delay 命令で待ちが発生していたバグを修正しました。

同じバグ報告を元に、envdata に保存された kidokumode 命令による設定が、次回起動時に kidokuskip 命令で上書きされて反映されないバグを修正しました。setwindow2, textspeed 命令の設定につきましては、設定が保存されることはないように思いますが、勘違いをしているようでしたらご指摘下さい。

1月1日

Google Play で公開したアプリの総インストール数が4ヶ月間で 5000 を超えました。

バグ報告「bdownが機能しない」を元に、bdown 命令が正しく機能しないバグを修正しました。

バグ報告「未定義のlspにおけるbspの処理」を元に、bsp 命令で未設定のスプライト番号を指定した場合に無視するように修正しました。

バグ報告「未定義のlspにおけるspbtnの処理」を元に、spbtn 命令で未設定のスプライト番号を指定した場合に無視するように修正しました。

バグ報告「CTRLキーによる早送りでフリーズ」を元に、ループ処理内に bexec 命令もしくは textbtnwait 命令があり、かつキー入力などのイベントを見に行く命令が無い場合に、CTRL キーを押すと無限ループに陥るバグを修正しました。

バグ報告「画像の読み込みで落ちます」を元に、画像読み込み処理において、画像ファイルを正しく読み込めなかった場合の例外処理が不十分だったバグを修正しました。

バグ報告「動画再生後、CTRLを押してないのに早送りされる」を元に、いただいたパッチを適用し、CTRL キーを押した状態で SMPEG を使用した動画再生を開始し、動画再生中に CTRL キーを離した場合に、動画再生終了後もスキップ状態が続くバグを修正しました。

バグ報告「ScriptHandler.cpp にバッファオーバーフローがあります。」を元に、いただいたパッチを適用し、文字列のバッファがオーバーフローを引き起こすバグを修正しました。

バグ報告「スプライト番号0番のボタンが動作しません」を元に、bexec 命令でボタン番号に0を使用できないバグを修正しました。btnwait 命令ではボタン番号に0を使用できないことになっており、それと内部処理を共通化していたことが原因でした。

バグ報告「gameコマンドで落ちます」を元に、ラベルごとの先頭アドレスを管理する変数で、先頭の空白を含まないアドレスを格納するように修正しました。

バグ報告「checkkey・bgmfadeout・bsp・delayの反応と設定のグローバル化」を元に、bsp 命令の3番目の引数(マウスを押したときの処理)に対応しました。