play the jitoh-san RPG

2月の雑感

メモ:ウインドウや効果は一つのクラスにまとめ、updateからは選択済み・再生済みを示すT/Fで返すことにする(選択肢の返し方要検討)すべてのウインドウがTならキューからイベント行を1つ実行し、キューがゼロならウインドウ全消しして移動に戻る?

内容は書き換えるにしてもTでそのままいてほしいのは例えば戦闘中のHP表記とか…

操作感との検証はしたいものの、16pxキャラに16pxグリッドよりDQ5であった半マスを試してみる? 外壁を8pxで組めるので画面内の情報量を増やせるし、中央を歩ける街路が32pxで作れるんだよね……

プレイザジトーさんRPG、いったんソースを崩して色々と整備を始める。16pxスプライトですが8pxで移動できるようにしたり、マップチップはイメージバンク0から1に逃がしてみたり、あとはイベントキューをどこに持つかな……Globalに置いちゃうでもいいんですけど。

プレイザジトーさんRPG、不具合ありそうだなの気持ちでいる。
毎フレーム、まずウインドウ(メッセージや演出すべて)が存在するとき
いずれかのウインドウが完了待ち→何もしない
全完了でイベントキューがある→次のウインドウを新規作成
全完了でイベントキューもない→存在するウインドウを全削除

ウインドウが存在しないとき
イベントキューがある→次のウインドウを新規作成
イベントキューがない→プレイヤーとオブジェクトが自由に動き回れる

……プレイヤーやオブジェクトのupdateが後方にあるのでその処理でイベントキューが登録された場合は次フレームまで発火しないくらいか。

イベントキューの消化はApp.update()かつウインドウの未解決検査後なので必ず順次行われると見ていいと思いますが、イベントキューの登録はプレイヤー・オブジェクトから各々起こりうるので同フレームで発生した場合に並んでしまうか。

んー……プレイヤー優先するとオブジェクトからのイベント発火をメニュー開閉で上書きできてしまう(同フレームでメニューを開くと踏んだマスのイベントを発火させなくできる系)ので、オブジェクトからのイベント発火時はプレイヤーのイベントを何があろうとキャンセルするのが無難なところか。

まあ……でも接触イベント・A話しかけイベント・床踏みイベントはプレイヤーからの発火ですし、接触されイベントは今回使わなくなるので「プレイヤーがウインドウ起こしてたらオブジェクトは全部ストップ」で別にいいのかな……

プレイザジトーさんRPG、Pyxelおべんきょうのほうはイベントキューを整理・実装していました。イベント発生中に別イベントをキューに積んでしまう問題があったような気がしましたが、フレーム単位の入力で発生すると疑われるので再現できず比較的強引な対処で片づけてしまう回。

プレイザ。いまさらpythonのミュータブルをきちんと把握する。3D計算でもしない限りパフォーマンスで目くじら立てる必要はありませんが、代入で逐次変えていく変数はintベタ(イミュータブルな型)ではなくlistとかdict(ミュータブルな型)にしといたほうがいいんですね。

一方で、dictで持ったステータスのマスターデータをコピって誤差とかフラグとか追加すると参照渡し的に処理してしまい共有してしまうという裏面もある。copy()しましょう。

プレイザ、とりあえず殴り合い(たたかう)での戦闘はできるように。戦闘中に背景にフィールドを出したままにしたかったため通常のウインドウと同じ処理内で戦闘させるようにした結果、静的にもつイベントと動的に生成するイベントを行ったり来たりするという複雑怪奇なことになっちゃったな……

そしてウインドウはupdate()から完了済みを示すT/Fを返し、全ウインドウ回してすべてTなら次のキューを動かす~のつもりだったんですが
complete = True
for ウインドウ
complete = complete and ウインドウ.update()
で判定していたため想定通りに並列処理がされない問題。理由はお分かりですね…

答え:update()でFを返すウインドウが現れるとcompleteがFになるので、次以降は左辺でFが確定するのでupdate()を実行してくれなくなる

短絡評価ってやつですね。これまでテストしていたイベントでは動作すべきウインドウは常に1つ(イベントの完了を待って次のイベントが動く)でしたが、今回「敵グラフィックの点滅」と「○○のダメージ!メッセージ」が同時に動いて欲しかったので見逃していた不具合が顕在化したという寸法。

プレイザ、とりあえず戦闘中にたたかう・単体回復・範囲呪文攻撃・にげるができるように。あとレベルアップ処理、メニューでの特技仕様、エンカウントができればものすごーく基礎的な部分はゲームになるかな…

敵の特殊行動・それを封じる特技はそのあとかな。といっても今月はLv5キャップで出そうと思ってるのであんまし関係ないですね(端的に言うとラリホーはLv7なので)

あ、ちなみに範囲呪文攻撃になってるのは私の色気の問題。敵は3体まで並べられるようにしてあり、味方は……一応拡張余地は残して組んでおいてあります。それに伴ってギラ相当が全体魔法になってます。

プレイザ、とりあえずマップメニューで回復・帰還ができるように。ゴールドをわざと排しているので初期位置に帰る場合はHPMPを全回復するしサンドイッチも1つもらえる。

プレイザ、敵表示向けベースとしてイメージバンク2は64×64の非透過想定とする。ついでと言うにはアレなんですがジトーさんのを0番位置に描いてみました。……何に使うの? と思ったのでタイトル画面に置いてみました。横スライドしてきて暗転するアレは2024年に引き続いて今回もですがそれに使おう。

あとはサンドイッチを食べる機能(?)といったん無効化しちゃってる床踏みイベント、エンカウントを組んだら……まあお馴染みの地下水路でテストダンジョンでもという感じですね。今月号そこまで行けるかな?

しかし非透過前提だと透過色抜きに4色使えるのでリッチさが全然違いますね。スプライト3色だと輪郭・髪・肌でほぼ確定しちゃうからな……ジトーさん髪と顔で灰色2色使うので白を透過にせざるをえんみたいな問題点がある。GB向きのキャラデザじゃないのな!!

ちなみに2024年版では別に透過色を持つというズルをしていた。気づいてはいた。

プレイザ、ガリガリ改装する予定とはいえ土台をDQに学んでいるのでLv4でギラ的なものを覚える。しかし仮に「ほのお」と名付けているわけですが、ジトーさんなら「いんか」でしょという気がする反面、「いんか」ならバフ効果では…?みたいなのはある。どしよかな…

ギラは終盤お役御免になるので、特定レベルで進化しちゃうでもいいか…?(Lv10くらいからスカラを兼ねるとか)

プレイザ、gen_bgm()を使ってBGMを仮においてみる。なんかこう……シンプルな3~4小節ではあるんですが、音が入るだけでなんかちゃんとゲームって感じになるの不思議だなあ。規定としては0-7のBGMしか記録できないPyxelですが、gen_bgm()のシード指定だとほぼ無限大に用意できるのいいな…

プレイザ。ちゃんと作ってるよのあれそれでありますが、あと中ボスイベント(=画面にあるメダル埋め)を作ったら晴れて拠点(館)と最初のダンジョン作りじゃなあ……

ついに館のマップを起こさないといけないわけですが、洋館の間取りとか改めて考えると全然身にはついてないなという。いや多少歴史的建造物の見学くらいはしてるんですが……

プレイザ、フラグでのオブジェクトのありなし切り替えを置いた。if分岐での扉の通過判定もあるのでこれで体験版ダンジョン的なものはできるかな……いや、2月の短さを理由にはできませんが間に合うかはちと怪しい。

ジトーさんはカウンター起因で山のようにバフを載せてデバフをばらまいて通常攻撃で戦うので、DQ1にならいつつも原型をとどめずそういうの載せまくっていきたいね……

ターン戦闘でカウンターをするとすぐぶっ壊れるのは奇しくもHDのDQ1で証明されているので、(攻撃手番+1とか攻撃無効化とかの意味での)カウンターはたぶん入れないんじゃないかなー…とは思っています。たぶん。

2/28になりましたのでpyxelの2月号を掲載。楽しいかとか難易度設定がしっかりしているかはともかくとして、なんかゲームっぽい体裁にはなってると思います。きっと。