PSACプレイ補助用Luaスクリプト(仮)


ここに掲載しているのはPSXjin用のスクリプトです。

改造コードでは実現が難しそうなことをやっていければと思うんだけど、いつもの気まぐれで放置する可能性が高そう。

Lua自体は色々と解説しているサイトがあるものの、PS1エミュでのLuaに関する情報がイマイチ見つからんね。単純に俺の探し方が悪いのか、そもそも情報自体が無いのか…(いかんせん開発が終了しちゃったものだしね)。とにかく知識もスキルもちゃんと勉強する気力も無いだけに僅かに見つかるサンプルや情報でも物凄く参考になるのでもっと色々見てみたいんだけどねぇ…。


●戦闘補助GUI表示スクリプト

アリーナ用:GUI_PSAC_Arena.txt

ミッション用:GUI_PSAC_Mission.txt

初代AC・PP・MAで戦闘中に幾つかの情報を表示するスクリプトです。3作全てで使用可能ですが、ゲームを切り替えた場合はスクリプトの再起動が必要となります。

お手数ではありますが、アリーナとミッションとで違うスクリプトを実行する必要があります。ミッション用のスクリプトでは仕様がよくわからないため、与ダメージ表示と被ロックオン警告を無効化しています。

習作も兼ねているので、無駄に色々表示して画面が見辛ぇ。邪魔な項目は適当に消した方が良いかも?多分、無駄な処理が多いと思うけど(表示などの常に実行するものと、フレーム更新時のみ実行するものをまとめた方が良いんだろ〜ね)、よくわからないし特に処理落ちするようなことも無かったからもう良いや〜。参考になるかわからないけど、スクリプト内に色々と説明を書いています。

距離表示と被ロックオン警告が便利すぎるので、慣れすぎるとマズいことになると思います。どういった状況でロックされてるか、普段ほとんど表示されない距離を確認出来るとどうなるか、って軽い気持ちで表示してみたけど動かし方自体が変わりかねんヨ(慣れてから標準の無しに戻した時のことを考えると…)。AC2以降には標準で使える機能だけど、やっぱりPSACにも欲しかったなぁ…。

<アリーナ用スクリプトの実行例>

<座標、実速度、速度値表示>

画面右下に表示。上からX・Y・Z座標で、左から現在の座標、括弧内は実速度、速度値。

実速度は現在の座標と前フレームの座標の差を絶対値で表示したもの。座標や速度値なんかはRAM WatchやView Memoryなどでも確認出来るんだけど、こういった表示に関してはLuaならでは。あとは別ウィンドウではなく、ゲーム画面内に表示出来るってのも便利だねぇ。

実速度を見ると限界速度ってのがよくわかるんじゃないかと思います。その他、初期機体で地上ブーストしてみたり(水平の限界速度の75が出せる)、ある程度速度の出る軽2と軽4で空中で移動してみたり(75と84と差が出る)、2脚と4脚で上昇・落下速度を比較してみたり(こっちも差が出る)、ブレホ中の速度の推移(水平には瞬間的に加速したり上昇や旋回が4倍になる)、2脚系で地上を歩いてみる(速度値が変化せず座標だけ変化する)、改造コードで速度等を上げた場合、などといったことを確認してみると面白いのではないかと。

<角度表示>

画面左下に表示。上から左右角度、上下角度。値はどちらも4096(0x1000)を360度とした内部角度の値。左右角度の括弧内は前フレームからの差分。上下角度の括弧内は内部角度を普通の角度に直したもの。

左右角度は値を4096で割った余りを表示した方がわかりやすくなるかもしれないけど、とりあえず実際の値を表示するようにしています。

上下角度は上向きがマイナス、下向きがプラスになっています。座標もそうだけど、上をプラス、下をマイナスにした方がわかりやすいかもしれないけど、こちらも実際の値を表示するようにしています。

本当は↑の座標・速度と並べて表示したかったんだけど、スクリーンショットを見ての通り、チャージングの警告灯と被ってしまうので分けて配置。

角度には前フレームの値って役割のアドレスが無かったのでLuaの方で求めています(ポーズ時の処理で相当苦労したヨ…)。ブレホの左右範囲ギリギリ付近でブレホをかけた時の差分に注目すると瞬間的に通常の4倍もの速度で急旋回したのがわかるんじゃないかと(ブレホ直後にポーズしないとわかりにくいかも?)。

<ジェネ残量>

画面左のエネルギーゲージの根元付近に数値で表示。

数値じゃなくてパーセント表示もやってみたけど、特に必然性が感じられなかったので没。あと、前フレームとの差分も表示しようとしたものの、何故か時々表示がおかしくなる問題を解決出来なかったのと(正常値と0を交互に表示することがある)、回復とブースト移動はともかくE兵器の消費に関しては発射直後のフレームしか消費量が表示されなくて消費量を視認するのが困難なので没。没にしたものはコメントアウトした状態で残しているので、気になるのであればてきと〜にコメントアウトを解除するなどして試してみてください。

このスクリプトを作っていて初めて気が付いたけど、ミッションとアリーナでエネルギーゲージの縦座標が微妙に異なっていたのね。ミッションと同じ位置だと機体名表示と被ってしまうようなのでアリーナでは少しだけ上にズラしていたみたい。

<距離計>

画面中央の下に数値として表示。

PSACではロックオンすると消えてしまう距離計の値。

ロックオン時のみ表示(厳密には非ロック時以外に表示)。数値は距離計の値なので、距離が離れるほど大雑把な値になっていく。

本当は本来距離計が表示されるべきロックカーソルの辺りに表示したいんだけど、現状ではよくわからないので妥協。

<被ロックオン警告>

画面中央の下、距離計の下に表示

対戦相手にロックオンされると表示。↑の距離計と同じく厳密には非ロック時以外に表示するため、エイミング中やミサイルのロックオン前でも表示される。

無駄に明滅。直視しなくてもなんとなく見やすくするって効果は出ているかも?

かなり便利だけど、これに関しては特に慣れてしまうとマズいような気がするかなぁ。

微妙に中央からズレているような気がしないでもないんだけど、フォントは奇数座標に設定出来ないし、奇数文字だとピッタリ中央には収まらないっぽいので諦めました。

ミッションだと敵がどんな仕様になっているのかわからないので無効化しています。

<累計ダメージ表示>

APの左下辺りに表示。

数字は緑色の枠が付いているのが累計与ダメージで、赤い枠が付いているのが累計被ダメージ。

1秒間(22フレーム)途切れずにダメージがあると値が増加していきます(表示中にポーズをかけても大丈夫)。どれくらいの時間が妥当なんだろうねぇ?

こちらもミッションでは敵の数が多いし、よくわからないこともあるので無効化しています。

<上下エリアオーバーライン>

エネルギーゲージの左に表示。

赤部分がエリアオーバー、黄色が警告部分、緑部分が通常エリア。真ん中部分の白線は上下座標の中心点で(高度0)、大抵のマップでは地面。微妙に長い白線が自分の現在の高度。

これもどう配置すれば良いのかわからなかったので、スクリプト冒頭部分で変数をいじることで位置や長さを変えられるようにしてあります。

上方向の警告ラインの値が0になっている場合は上下エリアオーバーが無いので(落下エリアオーバーだけあって上空エリアオーバーが無いというマップは無い)、全域を緑色で表示するようにしています。また、下方向の警告ラインの値が0になっている場合は下側のみ緑色で表示するようにしています。一部のマップでは下方向にラインが設定されているものの、実際にはエリアオーバーにならないって場合があるけど(縦横一定範囲内だけ落下エリアオーバーになるのかなぁ?)、それには対応していません。

<上下角度計>

画面左下のエネルギーゲージの右下辺りに表示。

上下角度計は半円のうち、黄色い範囲(±67.5度)が操作可能な範囲。緑は角度0の真正面。操作不能な範囲と色が被ってるけど、黄色い範囲の中にある赤い線が現在の角度。

色々試した中ではこのカラーリングが一番マシだったけど(普通の計器みたいに緑をメインにするとENゲージと近いのでかえって見辛かった)、どんなカラーリングにすれば良いのやら。

三角関数なんて習った当時はほとんど理解出来なくて完全に忘れきっていたけど、初めて実用出来たような気がするヨ…。

なんか円の描画が使えず、仮に描画出来たとしても半分だけ消す、みたいなことが出来るわけでもないので、直線の組み合わせによるチープな表示になってます。

<方位計>

レーダーの周囲に方位計を表示。

レーダー無しだと四角い枠に文字が被ることがあるけど、どうせレーダー無しで戦うことも無いと思うので妥協。レーダーの種類の値を読み取ってレーダー無しの場合だけ方位計の半径を大きくすれば良いんだろうけど、そうすると現在選択中の武器表示と被っちゃうんだよねぇ。肩レーダーやグリッドでも試したけど、これらに関しては大丈夫みたい。

これも微妙にズレているような気がするけど、前述したように半ドットでの位置調整は出来ないからもういいや。

<リロードタイム>

画面右の武器一覧の下辺りに表示。

射撃後の残りリロード時間をバーと数字で表示。

大半のキャノンが本来のリロードから1引いた値が実際のリロードになっていること、実グレとIRは本来のリロードが表示されるものの数フレームだけ残りリロードが減らずにリロードが長くなっていること、リロード中にブレードを振るとブレードモーション中はリロードが減らないことなどが確認出来ます。

残りリロード時間はブレード以外の全ての武器で共通なため、武器自体のリロードの値を使うとリロード中の武器切り替えでバーの表示がおかしくなってしまうので、残りリロードが大きくなったフレームの残りリロードをリロードの最大値として使用しています。

残りリロードが0まで減ったら0.5秒で表示が消える。

<ミッション用スクリプトの実行例>

<敵の現在AP>

自分のAPの下辺りに表示。ミッション用。

現在アクティブな敵のAPを表示。アクティブな敵は最大15体まで。敵に限らず僚機のAPも兼ねている。

敵の数が多いミッションで使ってみると15体の枠を巧みに使い回してやりくりしているのがわかるんじゃないかと。

このGUIはデモシーンでもお構いなく表示されるため、デモシーンに出てくる機体にもAPが設定されているのが確認出来る。PPの要人捕獲作戦で要人にも恐らくAPが設定されているっぽいんだけど、APが3000もあるのかよ(笑)。オマケにヘリから出てきた要人とビルから出てきた要人は別固体の可能性があるみたいで、クリア時のデモシーンではAP3000の何かが2体とAPが10000のコーラルスターのAPを確認することが出来る(コーラルスターは最初のデモの時点で10000なので地雷を踏んだ、みたいなオチではなさそう)。

PPでコーラルスター、要人の乗った護送車、拡散ビームのチャージから発射終了するまでのファンタズマなどのAPが毎フレーム完全回復することも確認出来ます(笑)。本部施設襲撃で最初に待機しているスミカはAPが減らすことが出来たのね。まぁ、APを0にしても炎上すらしないようだけど。

敵の数が多いと通信と表示が重なっちゃう点はご了承を。ミッションだけ被ダメージ表示の位置を別の場所にズラして敵のAP表示を2列くらいにするって手もあるだろうけど、なるべく同じ場所の方が良いだろうしなぁ。

待機中の敵の現在AP表示もとりあえず80体分作ってみたけど(初代の調査車両救出の76体が最大?いや、PPの本部施設強襲が90体なので足りないか)、量が多すぎて画面が見辛くなるし処理落ちするんで調査目的以外じゃ使い物にならんね。コメントアウトを解除すれば使えます。あと、待機中の敵の最大APのアドレスもわかったので、AC2以降のような残り敵勢力ゲージみたいなものも作ったものの、敵以外もカウントしてしまうのとやっぱり微妙に処理落ちしているような気がしたので没。


<ロケット発射角度確認用>

-- 通常腕2脚:0xA5D0E
-- 武器腕2脚:0xA5E06
-- 4脚:0xA6072
-- 通常腕戦車:0xA58B2
roc_ang1 = 0
roc_ang2 = 0
roc_ang1 = memory.readwordsigned(0xA58B2)
roc_ang2 = memory.readwordsigned(0xA58B2)

gui.text(236,182,string.format("Ue :%05d", -- Y軸の座標、移動距離、速度を表示
512+roc_ang1))
gui.text(236,190,string.format("Shita:%05d", -- Y軸の座標、移動距離、速度を表示
-512+roc_ang2))

if roc_ang1 <= -768 then
gui.drawbox(282 , 182 , 288 , 188 , "#E84820" , "#E84C24")
end
if roc_ang2 >= 768 then
gui.drawbox(282 , 190 , 288 , 196 , "#E84820" , "#E84C24")
end

MAで左肩に装備したロケットの上下角度の確認用。上か下に限界まで向いた状態で各動作ごとの値を確認。

上下兼用で作るのが面倒だったので、上向き用と下向き用を別個に作成。ロケット角度が機体の上下角度限界である±768(±67.5度)以上になったら数字の横に警告代わりの赤い四角を表示。これが出た場合は上下反対側で再確認。


いや〜、一体どうやってテキストの色変えるんだろ〜ね?説明見てもエラーが出てサッパリ上手く行かないヨ。

gui.text(int x, int y, string msg[, color="white"[, outline="black"]])

ってことになっているので、例えば

gui.text(120,160,string.format("TEST"),color="white",outline="black")

みたいに書けば良いじゃないかと思ったんだけど、エラーが出ちゃう。色の部分へ単純に数値を入れると文字色と文字の縁の透過度が変わるだけで色は変わらない。具体的なサンプルを見りゃ一発で解決出来るとは思うんだけど、ど〜すりゃ良いんだか。というか、幾つかサンプルを見つけられたんだけど、実際にテキストの色を変えているケースが見つけられなかったし、まさか未実装ってオチじゃないよね?もう更新が止まったものだし諦めるしか無いか。他にLuaが使えるPS1エミュとしてはBizHawkがあるので、そっちに移行した方が良いのかなぁ。


上下角度計が正しく表示出来たのか確認のために円描画をしてみようと思ったんだけど、これもなんかエラー出て使えなかった。

gui.drawcircle(x0, y0, radius, colour)

ってことになっているので

gui.drawcircle(25, 178 , 25 , "#FFFFFF")

本来ならこんな感じに書けば良いはずだよねぇ…?


●改造コード

改造コードだと必ずしも処理に割り込めないことがあったのでLuaならどうかと思ったんだけど、なんか上手く行かず。エリアオーバーしないように出来ないかと思ったけどダメかなぁ。


戻る