星田オステオパシー

Racketで何か・・DD&D010 戦闘処理の続き「光明」

さて、前回「後はもう楽勝だろ!」とか言ってたわけですが・・
本日はその続き。早速前回途中だった戦闘関数をとりあえず完成させ、仮のデータではなくて環境変数からの参照にしていざ実行!

 いやまあ、出るわ出るわ・・エラーの嵐!まずMbonusの条件式にElseを作ってなかったのでエラー。攻撃ボーナス関数でD20に()を付けてなくてエラー。アイテム関係を別のファイルに入れてたんですが、そのデータがファイルをまたいで参照できないでエラー・・ちゃんとrequireしてるのに!?はい、参照先の方でall-defined-out書くの忘れてました(-_-;)

 今回は外部化出来るところはできるだけ最初からやっていく。
 しかしどんだけ引数多いねん、と。まあ、書き終わってから不要なのは減らしていくと言うことで

 そして最後にキー入力関数から移動先がENEMYだった場合に戦闘発生部分を書いて・・
 一応動くようになったのですがココで全くもって謎の挙動。ENEMYを倒すと新たにENEMYが現れたりHEROの位置がワープしたり!どういうことなんだ・・20分ほど原因を追求して判明、環境変数を引数に取る場面で半分近くが引数のwじゃなくてテスト用に設定したtest-battle-structを参照してしまっていた!こんなしょーもないことで時間を食うとは・・

 エラーを取り除いて一応完成。楽勝とか言ってて宿直帰りですぐ開始して5時間くらいやってますからね、コレ

 後は戦闘終了条件を・・もうこの頃になると朦朧としてるので無駄な書き方をしてるかも知れないけど、C-LISTからENEMY構造体を含んでいるのをフィルターして、そこにvariantでENEMYのものがなければ条件マッチでエンディング開始・・と、今書いててまさに無駄な書き方をしてるw 判定はフィルター後にnull?だけで済む話じゃないか

 エンディングはもうバイトまでの時間もなかったのでCametanさんから丸パクリで。BATTLE構造体に新たに追加したMONEYとEXPを表示するようにしてと。

 実行して・・今まさにENEMYの命が尽きようとしております


 おお、ちゃんと終わった!ここまで書けたら後は楽勝だろ!

 と、ここまでが昼の部。

 続きまして夜の部!
 そろそろ行数が増えてきて見返すのが大変になってきたので、晩ごはんの後でボーッとしてる間にファイルを分けて整理する。

 ま、ここでも色々と問題発生。なんか画像を挿入で入れた変数をrequireで参照すると謎のエラー。調べると公式が「バグです」と書いてるのが見つかったのでbitmap/fileで挿入。こっちだと問題なし!スクショの絵的に面白みが無いけど・・

 で、今夜は何をやるかと言いますと・・やっぱり攻撃のヒットエフェクトが欲しいな!と。
 ただそうなると、その情報をどうやってplace-imageに渡せば良いんだ?という話ですわ。現在の判定は全部on-key部分に渡すC-LIST(キャラクターと座標をconsしたリストを持つBATTLE構造体のスロット)で行ってるわけで、ここが更新される事で画像が変化するわけだけど、攻撃がヒットした情報をC-LISTに入れないといかんのか?(ヒットマークは攻撃された側に出るので前のアクティブマークみたいに簡単に行かない)
 となると

・C-LISTのケツに戦闘では直接使わない連想リストを毎回つけて、Place-imageではそっちを参照してヒットの有無、発生させる座標を参照させる

 という手があるかも知れないが。が、あまりにも面倒すぎる(-_-;)

 結局、こんな感じでBATTLE構造体にスロットを追加して、そこを更新することでPlace-imageに判定させるしか無いか・・と。しかし
・Place-imageに条件式が使えるのかが不明
・on-keyのC-LISTスロット内の操作では乱数を使用しているので、前に発見した別スロットに同じ判定式を書いて動かしても結果が違ってしまう

 という問題が・・・うーん・・どう考えても現在のスロットから別の任意のスロットを操作する方法があるべきやろ!じゃないとゲームになんないよ〜・・・と。
 というわけで何か別スロットを操作する方法が無いのかと探しまくる。

 確か・・例のRealms of Racketに構造体の「破壊的変更(ああ・・)」をしてるページがあったなぁ・・と。

 どうやらこのset-構造体名-スロット名!で任意のスロット内を書き換える事が出来るらしい。問題はこの他スロットへの干渉がBig-bangで許されてるのかということなんだけど・・

 仕組みとしてはE-ZAHYOスロットに初期値では#fを持たせておいて、#tならヒット状態ということなのでエフェクト。#fのままならはずれなので今までどおりということで。
 (foldを使ってキレイにするのは後にしてとにかくチェック。Ifでまるごと条件ワケするのは行数が嵩むけど、それも後でまた・・)

 ファ!?出たー!マジかよ・・別スロットからの干渉が出来るならはっきり言って何でも出来るんじゃないか?あ、これは最初にcircleの書き方を知らなくてsquareと同じで64にしたからです

 下のHEROが攻撃をしたので対象にヒットエフェクト。攻撃が終了したので次のHEROがアクティブになってますが・・エフェクトが表示されっぱなし。これな〜・・ENEMYの自動行動もそうなんだけど、適当な秒数で消えたりするように出来ないものか・・

 ま、とりあえずchange関数の頭に初期化する式をブッ込んでおいたので、キーを押したらエフェクトも消えて次のキャラがアクティブになるようになってますが・・

 という訳でもう24時過ぎてるのでここまで〜

 今回は諦めていた別スロットの変更が出来ると分かったので一気に展望が開けた感じだな!これさえ出来ればステータスだろうがメッセージだろうがガンガン表示できるぜ!





  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事