2018年1月28日日曜日

アスカ見参の細かな疑問など

起動できない

Windows10で起動するにはいろいろありますのでこちらを参照してみてください。

起動するまでに時間がかかる

通常はすぐ起動するはずのアスカ見参で、どのKBか不明ですがメジャーではないアップデートで、起動までに10秒ほど待たされるようになりました。 自分の環境では、別のアップデートで一度またされなくなったけど、現在また待たされるように戻っています。

ム―ビーが飛ばせない

起動時のCHUNSOFTムービーや、イベントのムービーは飛ばせません。 起動時のCHUNSOFTムービー以降は、マップのみに割り当てられているボタンを押すことで高速に処理することができます。
デモムービーのみいつでもキャンセルして飛ばせます。

起動をしようとするとムービーから進まない

CHUNSOFTムービーが開始フレームで止まったままになる現象は、PCの起動時間に依存するアスカ見参のバグです。 OSを起動してから2147483648ミリ秒を経過すると発生します。
2147483648ミリ秒=24日20時31分23秒648ミリ秒
この起動時間を過ぎてアスカ見参を起動すると起きる現象です。
再起動を行えば普通に起動できるように戻ります。
Windows10ならタスクマネージャーで詳細をおして詳細表示の状態でパフォーマンスタブのCPUをクリックしたときに起動後の時間が表示されます。

起動中にBGMだけ流れ続けるが操作できない

また、起動中にこの時間を超えた場合にも上記の問題が発生します。
アスカ見参がアクティブの間は大丈夫ですが、一度ウィンドウが非アクティブになると、再びアクティブになっても音楽だけ流れ続けて操作できない状態になります。

コントローラーが使用できない

コントローラーが使用できないという現象はいくつか原因があるかと思います。

  • コントローラが認識されていない
    ウィンドウズ上で使用できない状態の場合はドライバを入手して使用可能な状態にする必要があります。
    PS3のデフォルトコントローラーは、標準ドライバでは使用できないと思います。
  • アスカ見参が対応しないデバイスのタイプである
    ほぼ対処法はないかと思われます。
  • 複数のコントローラーが接続されていて他のコントローラーが割り当てられている
    優先順は自動で決まるようなのでダメなら他のコントローラーを外すしかない。
  • XBoxコントローラーでLRトリガー同時押しができない
    XInputのAPIでしか正しく取得できないようにしたMicrosoftの陰謀です。
    AsukaPlusのコントローラー設定はXInputに対応しています。


2018年1月21日日曜日

AsukaPlus 0.9.0.0

AsukaPlus 0.9.0.0

変更点

  • オプションにコントローラ設定を追加
  • 支援機能メニューを追加
  • アスカ見参のコントローラーの初期化のバグを修正
  • AsukaPlusの細かい不具合を修正

オプション-コントローラー設定

オプション-コントローラー設定

アスカ見参のコントローラー設定にはいろいろ問題があったため、コントローラー設定を追加しました。
コントローラー設定を有効にするとアスカ見参のパッド設定は無視される仕様です。
有効にしない場合でもパッド設定のいくつかの問題を改善しています。

改善されること

初めにこの設定により可能となることをまとめておきます。
コントローラー設定を使用せずとも有効となる機能。
  • 軸の初期化をすべての軸に対して行う
  • DI8DEVTYPE_1STPERSON のデバイスタイプにも対応
コントローラー設定で任意で有効にできる機能。
  • XInput(XBox360コントローラー)での入力に対応(LRトリガー同時押しに対応)
  • コントローラーが複数ある場合の優先度を設定可能
  • アスカ見参起動後に接続されたコントローラーを認識可能

軸の初期化をすべての軸に対して行う

X軸とY軸しか取得値の範囲の設定を行っていなかったが他の軸に対しても行うように修正されます。
これによりアスカ見参のパッド設定の「移動」を好きな操作系統を選択できるようになります。本来のアスカ見参の実装しようと思っていた仕様になったはずです。
POVも普通に選択可能になります。

DI8DEVTYPE_1STPERSON のデバイスタイプにも対応

かなりマイナーな対面型のアクションゲームデバイスに設定されているコントローラーがありますが、アスカ見参は検出していないようだったので検出するように修正されます。
PS3パッド用のメジャーな非公式ドライバがこのタイプになるようです。
非公式ドライバが使えるのかという問題は別にありますが。

XInputでの入力に対応

XBox360コントローラーと呼ばれるタイプのコントローラーのAPIに対応。
(このAPIで入力を読み取らないとLRトリガーの同時押しを検知できない)
XInputは最大4つ接続可能で#1~#4として認識されますが、どのコントローラーが#1かという情報を取得するAPIは提供されないので「XBox360コントローラー#1」などと表示します。接続状況により#1がどのコントローラーになるかは保証されない仕様なので、複数のXBox360コントローラーを使用されている場合が使えない場合は優先順を変更してみてください。
DirectInputとしても同時に検出されますが、こちらを使用するとLRトリガー同時押しが反応しません。

コントローラーが複数ある場合の優先度を設定可能

いつも使いたいコントローラーは決まっているが、それ以外のコントローラーを外さないと使えないことがあるので、優先順を決めれる仕様としました。

起動後に接続されたコントローラーを認識可能

多くのゲームは面倒なので起動時にしかコントローラーの検出を行わないので起動後に接続されたコントローラーは認識されません。アスカ見参もそうなのですが、コントローラー設定を使用すると起動後に接続されたコントローラーも自動で認識し、優先順次第でコントローラーが変わります。

このような仕様にした個人的理由

デスクトップPCは常にいくつかコントローラーが接続されているがその都度付け外しをしたくなかった。
GPD-WINの場合は、パッド部分はマウスかコントローラーか切り替える仕様なため、起動をマウス操作で行うと起動の瞬間はコントローラーが接続されていない状態となるため起動後に認識したかった。
わかりにくい仕様になっているかもですが、一度設定するとあまり変更する必要はないはずですのでご容赦願います。

方向指定のiDashについて

ドリームキャストのときにあったアナログコントローラーを倒すだけでiDashする仕様は、PC版でも設定できますが使用しづらいのでコントローラー設定では対応していません。
ボタン+方向のiDashは対応しています。

決定+取消し

このキー割り当ては本来存在しないものですので、標準仕様でプレイしたい場合は使用しないでください。
普通に決定+取消しを操作すると、ボタンを解除するたびに取消しを押した後のように方向指定の切り替えになったりしてしまいますので、純粋にターン経過だけできるようにカスタマイズが入っています。

2018年1月7日日曜日

Windows10クリーンインストールから起動まで(64ビットOS)

Windows10のクリーンインストールから起動の検証

一般的な環境として以下で検証しました。
エディションは、「Windows10 Home」64ビット版
バージョンは、現地点で最新の「Fall Creators Update」。
クリーンインストールからの検証です。
何で失敗してるかを確認するためにあえていろいろなエラーを出しながら進めてみます。

Windows10インストール直後


アスカ見参をインストール

インストーラーの選択肢はすべて変更せず、インストール先のフォルダも既定のままで
C:\Program Files (x86)\CHUNSOFT\AsukaPC
としました。
※パスの区切り文字の「¥」が「\」(説明用に全角で書いています)に見えたりするのはフォントによって表示が違うだけで同じ文字です。

何も考えずに起動してみる

普通に起動してみると、DirectPlay のインストールを促されます。
DirectPlay はネットワーク接続を使用する機能です。
以前のアスカ見参はネットワーク接続する機能があったため必要と出ますが、実際には使用しないのでインストールしなくても起動できます。
ですが毎回出るのでスキップが手間に感じるならインストールしてもよいかと思います。
一度インストールすれば以後でなくなります。
上記の続きが実行されると次はWindowsのバージョンのチェックが行われ結果エラーとなり起動しません。
これは過去のWindowsでしか起動しないようにチェックされているからですが、ショートカットから呼び出される初めのプログラムはWindowsのバージョンをチェックしたのち本体のプログラムをよびだしているだけのようですので、本体のプログラムを直接呼び出すようにショートカットを変更します。
(互換モードでも回避することはできます。ウィンドウスタイルが変わるのが気にならなければですが。)

ショートカットの変更

ショートカットのプロパティを開くためにスタートメニューから「Chunsoft」の中の「女剣士アスカ見参!」を右クリックしてファイルの場所を開きます。
ショートカットのフォルダが開きますので、ショートカットを右クリックしてプロパティを開きます。
ショートカットのプロパティのダイアログが開いたら、「リンク先」を変更します。
変更前の値
"C:\Program Files (x86)\CHUNSOFT\AsukaPC\loader.exe"
この値の最後の「loader.exe」を「asfpc.exe」に変更してOKをクリックします。
変更後の値
"C:\Program Files (x86)\CHUNSOFT\AsukaPC\asfpc.exe"
OKを押すと変更するために管理者権限を要求されます。
これはインストーラーが設定したショートカットを変更することになるため要求されています。
続行を押して変更します。
これで以降はWindowsのバージョンチェックで起動しない現象は回避できます。

一度起動してみる

ショートカットを変更したのでWindowsバージョンのチェックはなくなっています。
ですが起動できません。
これが有名なSafeDiscのチェックに失敗した場合に出るメッセージですがメッセージの内容に意味はなく管理者権限で実行しても変わらず同じエラーが出ます。
※管理者権限とメッセージには出ますが、アスカ見参を起動するために管理者権限は不要です。

AsukaPlusを追加

Asfpcのあるフォルダに配置します。
Program Files (x86) 配下に置くため、管理者権限を要求されます。


起動してみる

AsukaPlusが使用しているランタイムがインストールされていないので起動に失敗します。
※Visual Studio 2013 を使用して作ったために必要となっています。

Visual Studio 2013 の Visual C++ 再頒布可能パッケージのインストール

OSが64bitでも間違えなくx86版(32bit版)をインストールします。
ファイル名は「vcredist_x86.exe」です。
※最新版はランタイムを不要にするよう設定を変更しましたのでこの作業は不要です。

起動してみる

AsukaPlusはオフラインパッチ後のバージョン1.7.0.0を対象としますが、オフラインパッチを当てずに起動できない方が結構いたのでエラーメッセージを追加しました。

オフラインパッチをインストールする

オフラインパッチをダウンロードしてインストールします。
ファイル名は「AsfPCN1800.exe」です。
インストールが完了すると、
AsfPc.exeのファイルバージョンが1.7.0.0になります。
※たぶん1.8.0.0にするつもりだったけどオフラインパッチが間違えてると思います。

起動してみる

管理者権限での起動や、互換モードでの起動は不要です。
特に管理者権限は不要なのに管理者権限で起動することはセキュリティリスクを増やすだけですのでやめましょう。
知らない方向けに管理者権限が必要と書かれているページが多すぎるので気を付けましょう。


セーブデータのフォルダ

アスカ見参はかなり過去のゲームのため、インストールフォルダにセーブデータなどを作る仕様となっています。
ですがWindowsVista以降は、UAC(ユーザーアクセスコントロール)の機能によってインストールしたファイルを誤って壊されないように、管理者権限がないとProgramフォルダ
C:\Program Files や C:\Program Files  (x86)
に書き込めない仕様に変更されました。
※普通のフォルダにインストールした場合は普通に書き込まれます。
そのため管理者権限で起動した場合はインストールフォルダにセーブデータが作成されますが、管理者権限でない場合はプログラムがインストールフォルダに書き込もうとしてもOSが代替えのフォルダに書き込む仕様となっています。

元のフォルダのパスが以下の場合
C:\Program Files (x86)\CHUNSOFT\AsukaPC
以下のパスに置き換えて処理されます。
C:\Users\(ここはユーザ名)\AppData\Local\VirtualStore\Program Files (x86)\CHUNSOFT\AsukaPC
AppDataが隠しファイルとなっているため、隠しファイルを表示するか直接パスを入力して移動する必要があります。

通常セーブファイルを見る必要はないですが、バックアップ時などのため覚えておくとよいかと思います。

インストールフォルダにデータや設定ファイルを作ってしまうような過去のソフトは、Programフォルダにインストールせず、普通のフォルダにインストールして運用するほうが楽です。例えばCドライブにフォルダを作って
C:\Game\CHUNSOFT\AsukaPC
のようなインストール先にしておけば、 UACによる書き込み保護はないため普通にインストールフォルダに書き込まれるので、どっちか言うとこの対応のほうが楽です。

DirectXについて

過去のバージョンのWindows10は、新しいDirectXを使ってほしかったのかDirectX8はインストールされていませんでしたが、クレームが多かったのか途中のバージョンから初めからインストールされているようです。
あまりないかもしれないですが、過去のバージョンのWindows10を使ってる方はDirectX9(DirectX8が含まれている)のインストールが必要になるかもしれないです。

2017年12月24日日曜日

アスカ見参のパッド設定の問題

アスカ見参の妙に納得いかないコントローラーの仕様を調査しました。

コントローラー(ジョイパッド)の検出

コントローラーは起動時にしか検出していないので、起動後に接続してコントローラーは使用できません。

複数のコントローラー

複数のコントローラーが発見された場合は、強制的にどれか一つだけに決定されます。
どうしても使用したいコントローラーが使用できない場合は他のコントローラーはずしながら再起動してチェックするか、他をすべて外す必要がありそうです。

アナログコントローラー時の軸の初期化の問題

アスカ見参はDirectInput8で入力を判定しています。
アスカ見参のDirectInput8での軸の入力は、X軸とY軸しか考慮していない問題があります。
コントローラーの初期化時にX軸とY軸の取得値の範囲を-1000から1000に設定しています。
取得値が中央値の0に近い値が取得できる際は未入力と判定するという意味になります。
この初期化自体はおかしくないですが、X軸とY軸しか考慮していないため範囲の設定をX軸とY軸しか行っていませんでした。
アナログコントローラーは他にも軸がありますが、取得値の範囲を設定していない軸は、多くのコントローラーでは0から65535の範囲となってます。
アスカ見参にはパッド設定があり、ボタンの設定以外に「移動」という項目がありデフォルトで「Axis」(X軸とY軸に相当)になっています。
変更する場合は「移動」を選択して何かの方向キー(十字キー)やスティックを入力すると変更できる仕様に作られています。
範囲指定していない軸の入力値も-1000から1000で取得される前提で実装されているため、以下のような現象が起こります。
例えば右スティック(X回転とY回転)がある場合の範囲を設定されていないため未入力は32767付近の値が取得されますが、これを1000の方向に入力中を判定されるため、結果的に右下方向に常に入力されている扱いとなっていまい、即「Axis2」(X回転とY回転)に設定されてしまう不具合があります。
ここで設定をキャンセルすればまだよいですが、決定してしまった場合は、常に右下を入力してる扱いになって戻すこともできなくなり大変なことになります。
この状態にしてしまった場合の対処は、常に下にカーソルが移動するけど頑張って「デフォルトにもどす」を選択して「決定」を押すか、起動していないときにレジストリを編集してなおすか、再インストールとなります。

DirectInputの仕様

実装したことない方向けにDirectInput8のコントローラ入力の取得について少し捕捉します。
スティックがない昔たくさんあったデジタルパッドと言われる方向キー(十字キー)だけのコントローラーは、方向キーがX軸Y軸に設定されていました。
その後スティックが二つあるアナログコントローラーが作られ、多くのアナログコントローラーは左スティックがX軸Y軸、右スティックがX回転Y回転に設定しているものが多く作られました(DualShock4はなぜか右スティックはZ軸Z回転のようです)。
方向キーはどうなったのかというと視点切替(POV=Point of View、ハットスイッチとも呼ばれます)に割り当てられています。
POVは軸ではなく方向なので値は角度の100倍で取得されます(多くは0,4500,9000,13500,18000などの固定値で上が0で時計回り)。
古いプログラムで移動が左スティックだけになっているのは大抵はPOVを考慮していないのが原因です。
そういうプログラムで方向キーを使いたい場合は、入力を読み替える外部ツールを使用するか、アナログがないデジタルパッドを使用するかどちらかになるでしょう。

アスカ見参のパッド設定

アスカ見参は、移動入力もカスタマイズできるように出来ていたのは優秀でしたが、軸の範囲の設定をX軸とY軸しか行っていないのに、他の軸も範囲を設定した前提で値を読み取っていた不具合で移動設定は触ると危険なメニューとなっています。
なおレジストリで「KCfg_PAD_DIRT」の値を5に設定するとPOVにも設定でき、POVにもちゃんと対応していることがわかります。

XInput対応コントローラーの話

XInputに対応しているコントローラーもDirectInput8でコントローラーとして検出されます。
逆にXInputに対応していないコントローラーはXInputではコントローラーとして検出されません。
DirectInput8でXInputに対応しているコントローラーを使用すると、左トリガーはZ軸の+値、右トリガーはZ軸の-値となっており軸を共有する設定にされています。
何が問題かというと、両方入力すると値が相殺されることになり両方入力していない値として取得されてしまいます。
それ以外の点に関しては特に問題はなさそうなのでトリガーを使用しない、または同時に使用しないのであれば使用できないこともないといった事になりますが、アスカ見参は多くのボタンを使用する仕様となっているためそうもいかないことになります。
一般的な対応策は、XInputで入力を読み取り入力を置き換えるツールを導入することになります。

2017年12月17日日曜日

オプション-負荷軽減

オプション-負荷軽減

負荷を下げるための設定

アスカ見参のゲームループ

普通は「内部処理→画面描画→次回処理時間待ち→内部処理」を繰り返すが、「次回処理時間待ち」の部分で、「次の時間になったか確認→次の時間になったか確認」を繰り返すだけの処理となっているようで「次回処理時間待ち」にも常にCPUを全力で使用し続ける作りになっています。
今どきのCPUコアの数が多いPCなら、一つが100%のままでも他があるので問題ないと言えますが、バッテリ稼働のPCの場合は無駄な負荷となるとバッテリの消費となるのであまり良くはないです。

描画毎にSleep

上記の仕様により負荷がかかるため、描画が終わった直後に固定のSleepを設定することで、CPUリソースを開放し負荷を下げる設定です。
ただしSleepの数値が多すぎる場合や、アスカ見参自体が重いときでもSleepするため、この設定のせいで、アスカ見参の処理が遅くなったり、間に合わなかった描画を飛ばされたり(カクカク)することもあります。
1フレームは1/60秒=16.66…ミリ秒ですので、17ミリ秒以上に設定すると1秒間に60回は絶対描画できなくなりますので16ミリ秒までしか設定はありません。
なおこの設定により、アスカ見参が遅くなる可能性はありますが、速くなることはありません。
バッテリ稼働ではない余裕のあるPCで実行する場合は、設定しないほうが処理落ちしにくいということになります。
ノートPCなどでは設定しておくべきかと思います。