ONScripter 開発日誌

Since: Feb. 6, 2002
Last updated: Nov. 2, 2016

2016年

11月2日

NSOggVolume, NSOggFade 命令で、音量の範囲が正しくは最大が0で最小が-10000のところを、最大が100で最小が0と解釈していたバグを修正しました。

10月25日

バグ報告「btn命令における不具合」を元に、blt 命令において、7・8番目の引数に負の値を指定すると画像が描画されないバグを修正しました。

待ち時間が0の場合にイベントのチェックのみでアニメーション処理をしていなかったバグを修正しました。

10月16日

iOS 版 SDKを更新し、Info.plist に以下の情報を追加しました。

<key>CFBundleShortVersionString</key>
<string>1.0</string>

20150810 で DataDownloader.java に加えた zip ファイルの展開処理の高速化に関する修正がなぜか消えていたので、Android 版 SDKを更新して修正を再度適用しました。

10月10日

getlogtext 命令にバッファーオーバーランを引き起こすバグがあったため修正しました。

10月9日

Android 版において、ボタンを画面の上下左右からフリックによって引き出す際のフリックの速さの閾値を 2500[pixel/s] から 500[pixel/s] に下げ、より少ない動きで引き出されるようにしました。また、見た目に違和感があったため、左クリックボタンを左(上)側に、右クリックボタンを右(下)側に配置しました。この変更に伴い Android 版 SDKも更新しました。

本体を更新し、Android 版の上ホイールボタンと下ホイールボタンが押されたときに、それぞれ bexec 命令で"WHEELUP"と"WHEELDOWN"が返るようにしました。

10月8日

Android 版において、Immersive モードでナビゲーションバーを非表示にできる場合は常に非表示となるようにし、デバイスの画面全体をゲーム画面として利用するようにしました。この変更に伴いAndroid 版 SDKも更新しました。

追加機能の要望「Android版においてソフトウェアボタンの位置を変えられないか」を元に、ボタンを画面の上下左右からフリックによって引き出す方式に変更し、ゲーム画面に重ねて表示するようにしました。ボタンの透過度はメニューから設定できるようになっています。これによって、ゲームの解像度によってはボタンがつぶれて表示されしまう問題も解消されています。

10月5日

iOS 版の SMPEG で再生終了時に落ちることがあったため、20160920 でiOS 版 SDKを更新しましたが、この修正をAndroid 版 SDK に反映させていなかったため、反映させて更新しました。修正内容は以下のとおりです。

--- smpeg-0.4.5+cvs20030824-old/video/video.cpp	2001-04-28 08:12:17.000000000 +0900
+++ smpeg-0.4.5+cvs20030824-new/video/video.cpp	2016-09-20 16:32:45.000000000 +0900
@@ -1191,7 +1191,9 @@
 
             next_start_code( vid_stream );
 
-            while( ! next_bits( 32, PICTURE_START_CODE, vid_stream ) )
+            // modified by Ogapee in 20160920
+            while( ! vid_stream->film_has_ended &&
+                   ! next_bits( 32, PICTURE_START_CODE, vid_stream ) )
             {
                 if( next_bits( 32, GOP_START_CODE, vid_stream) )
                     break;

iOS 版 SDKを更新し、ゲームデータをダウンロードする際とアプリに内蔵されたゲームデータをコピーする際のプログレスバーの進捗を表す数字を等幅フォントに変更しました。SDKのファイル名は変わっていませんが更新されています。

10月4日

NSEnd 命令を実装しました。

スプライトおよび Lua のアニメーションの表示タイミングを、指定された表示間隔を積分する方式から、現在時刻を基準にする方式に変更しました。従来よりもアニメーションがきびきび動くようになると思います。

10月3日

バグ報告「IOS版をインストール中である画面の実装希望(プログレスバーなど)」を元に、iOS 版 SDKを更新し、iOS 8 以降で、ゲームデータをダウンロードする際とアプリに内蔵されたゲームデータをコピーする際にプログレスバーが表示されるようにしました。ゲームデータをダウンロードする際には、以前からプログレスバーが表示されるようになっていたのですが、表示に使用していた UIActionSheet と UIAlertView が iOS 8 以降で非推奨となり、最新の OS では表示されなくなってしまったため、UIAlertController を使って書き換えました。また、手元の端末は全て iOS 9 以降で古い API の挙動をテストすることができないため、SDK は iOS 8 以降のみをサポートすることにします。

9月28日

バグ報告「Android 4.2で起動しない」に関して、リリース版を旧来の方法で署名していたため、リリース版をAndriod 4.2 にインストールすると失敗することが分かりました。Android 4.4.2 以降では問題なくインストールできていたため気づきませんでした。以下のように、署名の仕方を変更したところ、リリース版を Android 4.2 にインストールすることができるようになりました。

> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore release.keystore bin/ONScripter-release-unsigned.apk releasename

9月27日

バグ報告「Android 4.2で起動しない」を元に、Android 用 SDK の ONScripter.java 内で、SMPEG ライブラリを明示的に読み込むように指定していなかったバグを修正しました。Android 4.4 以降では、明示的に指定していない場合でも自動的に読み込まれていたため気づきませんでした。Android 版 SDKを更新しました。

9月25日

レイヤーを使った MPEG1 動画の再生において、動画を再生中に別の動画に切り替えると、黒画面が一瞬表示される場合があるバグを修正しました。20160923 の修正が不完全でした。

Android 版にて、外部アプリで動画を再生した後に、スクリーンショット画像が正しく取得できない場合があるバグを修正しました。

iPad Air 2 で movie 命令を使用した MPEG1 動画の再生が遅延する件ですが、SMPEG ライブラリを最適化オプション -O3 を付けてビルドしたところ映像の遅延はなくなりました。これまでは、最適化オプションなしでビルドしていました。この修正を反映して、iOS 版 SDKを更新しました。

音声が遅れていた理由は、ONScripter が音声デバイスのサンプリング周波数を 44.1KHz に設定しているのに対して、その動画の音声のサンプリング周波数が 48KHz だったからでした。そこで、動画の再生を開始するときに、動画の音声ストリームのサンプリング周波数と一致するように音声デバイスを設定し直すことで解決しました。その結果、SMPEG ライブラリを使って遅延なく MPEG1 動画を再生できるようになりました。しかし、動画の前に再生されていた音声が終了してしまうという別の問題が発生しています。なお、スクリプト実行時は、複数の音源をミックスして出力するので、デバイスのサンプリング周波数を 44.1KHz か 22.05Hz に統一しています。また、レイヤーを使った MPEG1 動画の再生では音声ストリームは無視しています。

日付は変わっていませんが、i-FunBoxの 4.0 Preview が更新され、iOS 10 に対応していました。

9月24日

ここしばらく Android 4.4.2 の端末でしか検証していなかったのですが、Android 5.1.1 の端末で試したところ Lua の io_open に追加した tmpfile が NULL を返すことが分かりました。そのため、stdout を返すようにAndroid 版 SDK を修正しました。

9月23日

レイヤーを使った MPEG1 動画の再生において、再生開始時に直前に再生された動画の画像が一瞬表示される場合があるバグを修正しました。

9月22日

NSDSp2 命令において、指定された転送元の範囲が画像よりも大きい場合に表示がおかしくなるバグを修正しました。

NSSp2Move 命令において、出力オプション(普通、加算合成、減算合成)に対応しました。

movie 命令において、音声ストリームがない MPEG1 動画を再生しようとすると落ちるバグを修正しました。

最近はもっぱら iPad Air 2 でゲームの実行とデバッグをしていますが、iOS 10.0.1 にアップグレードしたところ i-FunBox でファイル転送ができなくなってしまいました。しかし、Xcode の Windows → Devices から Installed Apps の ONScripter を選択し、Download Container でアプリのファイル一式を Mac 側にコピーし、Finder で中身を編集してから、Replace Container で端末に書き戻すことによって、少し面倒ですが同じようにファイル転送をすることができます。

9月21日

NSExec 命令にバッファーオーバーフローを引き起こすバグがあったため修正しました。

waittimer 命令などの時間待ち命令において、実際の経過時間を正確に反映するようにしました。これによって、layermessage による動画再生とスクリプトのタイミングがずれる問題も解消されています。

9月20日

iOS 版において、SMPEG を利用した動画再生に対応しました。ただし、iPad 2 Air では処理が追いつかず、画像のみの場合でも動画のみの場合でも2~3割程度再生速度が低下します。ないよりはまし程度に思ってください。また、iOS 版の SMPEG で再生終了時に落ちることがあったため、iOS 版 SDKを更新して対策を施しました。

NSOggFade 命令を暫定的に実装しました。フェード処理は行わず、closeflag の状態に応じて、すぐに音量を変更するか、もしくは演奏を終了します。

9月12日

setlayer, layermessage 命令を実装しました。ただし、layermessage は wcmpg.dll によるレイヤーでの動画再生のうち一部の機能(open,play,pause,stop,setloop)にのみ対応しています。wcmpg.dll の機能は SMPEG を利用して実装しています。動画再生とスクリプトのタイミングがずれる場合がありますが、これは今後修正する予定です。

Android 版 SDKiOS 版 SDKに SMPEG を導入しました。ただし、SMPEG は MPEG1 動画の復号にのみ利用し、YUV Overlay による出力機能は無効にしています。Android 版での通常の動画再生は、今までどおり外部の動画再生アプリを使用して実行します。

savedir 命令で、指定されたディレクトリが存在しない場合は設定しないようにしました。

9月10日

iOS 版 SDKにLuaを導入しました。本家のバージョンは5.1のようですので、LuaのバージョンはAndroid 版 SDKと同様に5.1.5にしました。また、Lua で書き込み用のファイルのオープンに失敗し場合に tmpfile() で生成されたディスクリプタを返すようにしました。

Android 版 SDKを更新して、Lua で書き込み用のファイルのオープンに失敗し場合に tmpfile() で生成されたディスクリプタを返すようにしました。

--render-font-outline オプションを有効にして文字の輪郭を描画する場合に、文字の色が暗い(輝度が0x80未満)場合には白で輪郭を描画するようにしました。

9月9日

getlogtext 命令を実装しました。

NSDCall, NSDDLL 命令を実装しました。ただし、NSDDLL 命令は deffontd.dll にのみ内部で対応しています。

UTF8 から SJIS への変換ルーチンを実装し、nsutf の nsutf_to_ansi を内部で実装しました。

9月7日

NSCALL_text, NSCALL_load に対応しました。

NSDDelete, NSDLoad, NSDPresentRect, NSDSp2, NSDSetSprite, NSExecAnimation, NSOggClose, NSOggLoad, NSOggPlay, NSOggVolume, NSSp2Clear 命令を実装しました。

autosaveoff, savepoint 命令を実装しました。

実行時のコンテキストを保存することによって、スクリプトを経由して Lua の関数を再帰的に呼び出せるようにしました。

pretextgosub が指定されている状態で、タグの直後に本文がなく、次行以降に本文がある場合に、その本文で再度タグを解釈していたバグを修正しました。

getcursorpos2 命令で、文字の座標計算の誤りを修正しました。

AnimationInfo のインスタンスをコピーする際に、動的メモリを再確保するようにしました。

nsutf, dpshadow の Lua モジュールを ONScripter 内部で登録するようにしました。ただし、nsutf_from_ansi 以外は空実装です。

Android 版 SDKを更新して、Lua で書き込み用のファイルのオープンに失敗し場合に stdout を返すようにしました。外部SDカードにアクセスした場合への対策です。

8月14日

バグ報告「ゲーム選択画面について」を元に、20160726 以降のAndroid 版 SDKを使うと Android 5.0 以降ではゲーム選択画面で Render Font Outline の設定ができなくなってしまったため、メニューからフォントの輪郭の表示・非表示を切り替えられるように SDK を更新しました。ただし、設定は次回に起動した時に反映されます。

8月3日

バグ報告「IOS版でゲーム起動後に強制終了」を元に、20160726で発生した textgosub 命令に関するバグを修正しました。ScriptHandler::getWait() が、wait_script が NULL の場合に、従来と同じ挙動となるように next_script を返すようにしました。

7月30日

Android 版で、Android 6 の某端末で起動時に落ちるという報告を受けました。この記事によると、どうやら OPEN_DOCUMENT_TREE を扱う Intent が見つからない場合があるようなので、例外処理を追加してAndroid 版 SDKを更新しました。

7月29日

Android 版で、ボタンが非表示の場合に、Immersive mode を利用してナビゲーションバーも非表示となるようにしました。Android 版 SDKも更新しました。

7月28日

20160726 で発生した savescreenshot 命令のファイル名の生成に関するバグを修正しました。

iOS 版の開発環境を OS X 10.11 El Capitan + Xcode 7.3.1 に変更し、iOS 9.3.3 の端末で正常に動作するようにiOS 版 SDKを更新しました。修正内容は以下の3点です。

  • Xcode の Deployment Target を 5.1.1 から 7.0 に変更
  • Xcode の Build Settings → Build Options → Enable Bitcode を Yes から No に変更
  • SDL_image/IMG_ImageIO.m の CGColorSpaceCreateCalibrateRGB 関数を CGColorSpaceCreateDeviceRGB 関数に変更

7月27日

Android 版の 20160726 に primary の SD カードが存在しない場合に落ちるバグを修正しました。Android 版 SDKも更新しました。

7月26日

バグ報告「STRING_BUFFER_LENGTH の値を大きく」を元に、STRING_BUFFER_LENGTH の値を 2048 から 4096 に変更しました。

バグ報告「セーブについて」を元に、textgosub 命令を使っている際に、改ページ待ちの扱いにバグがあり、正常にセーブできなくなる問題を修正しました。20160327でバグが発生していたようです。

Android 版において、Android 5.0 以降で、Storage Access Framework の OPEN_DOCUMENT_TREE 権限を利用し、外部SDカードにセーブデータを保存(書き込み)できるようにしました。これによって、Android 5.0 以降でも、外部SDカードにゲームデータを置いてゲームを進めることができるようになります。ただし、Android 4.4 以上 5.0 未満の場合は外部SDカードにセーブデータを保存(書き込み)できません。このことに伴いAndroid 版 SDKも更新しました。アプリのビルド手順も、事前に Android Support Library V4 をコピーする必要があるなど若干変わっています。

onscripter_android/project.properties で target=android-21 とし、NDK を使って C のソースをビルドすると、Android 5.0 未満の端末では C の関数の一部(srand や signal など)が実行時に見つからずエラーになります。そのため、onscripter_android/jni/Application.mk に以下の内容を記述し、C のソースは android-15 の環境でビルドするようにしました。また、最新の NDK ではデフォルトで arm64-v8a 向けにビルドを行い、ARM のアセンブリ言語で書かれた一部のソースがビルドできないため、以下のように armeabi 向けにビルドするように指定しました。

APP_ABI := armeabi
APP_PLATFORM := android-15

3月27日

バグ報告「Lua5.3で動作しない(ソースの書き換えにより動作)」を元に、luaL_checkint 関数を luaL_checkinteger 関数に置き換えました。

バグ報告「lspで未定義のbspで表示が乱れる」を元に、いただいたパッチを適用し、bsp 命令のボタン番号が不正な場合に、残りの引数を読み飛ばさないバグを修正しました。

バグ報告「改ページ(\)で文字切り出し処理のバグ?」を元に、いただいたパッチを参考に、textgosub 使用時に、改ページ(\)のクリックウェイト以降の文章が処理されないバグを修正しました。

texec 命令の中で saveon 命令を実行するようにしました。

3月21日

ONScripter をホストしているOSDNで、3月8日にOSなどのアップグレードが行われました(詳細)。このことに伴い、デフォルトのRubyのバージョンが2.1.5に変更されたことが原因で、BTS として使用している影舞から MySQL のデータベースに接続できなくなり、BTS が使用できなくなっていました。そこで、以下のようにして解決しました。

  1. mysql-ruby-2.8.2.tar.gzをダウンロードし、以下のようにビルドしました。
    > tar -xzf mysql-ruby-2.8.2.tar.gz
    > cd mysql-ruby-2.8.2
    > ruby1.8 extconf.rb
    > make
    
  2. 生成された mysql.so を kagemai_root/lib にコピーしました。