2024年01月21日
【ゲーム制作】3Dダンジョンロールプレイングゲーム あとがき
3Dダンジョンロールプレイングゲーム あとがきです。
思えば、2023年5月29日に第1回目をスタートさせ、早8か月弱…。
1日当たりの開発時間も短く、開発記事を書きながらとはいえ、1本のゲームにこれだけの時間をかけた事は初めてです。
多分一人で制作していたら、何度か躓いたところで制作中止していたと思います。
プログラミングの勘を戻すための習作だったはずなのですが、非常に思い入れのある作品になりました。
制作目的が目的なので、簡単なゲーム…、と、言う事で作り始めましたが、ロールプレイングゲームはマップを小さくする、イベントやアイテムを少なくする…くらいしか小さくできません。
決して「簡単」に作れるジャンルではありません。
言い換えれば、データの数が少ないだけで、プログラム本体は大規模なものと同じ。…と、言う事です。
(イベントやアイテムは数が少なくても、ロジックは作る必要がある。)
途中でも書きましたが、なぜこれを習作に選んだのか…。
余りにもブランクが長すぎて、勘が鈍っていた最たるものですね…。
そういえば最初の検証内容の結果を報告します。(2023年5月20日記事参照「3Dダンジョンロールプレイングゲーム」)
・検証課題
@ 基本はBASIC
A BASIC部で「MuSICA」でBGM演奏
B マップ表示はマシン語
C 敵表示用のFONT書換えもマシン語
・結果
@ タイトル表示一つ取っても非常に遅いので、ディスク関連以外はマシン語で組みました。
メインをマシン語、初期設定とディスク周りだけBASICが最適と考えます。
A メモリ不足で「MuSICA」利用無し。改めて別途検証します。
BC @に同じ。
・まとめ
「マシン語で組めるならマシン語で組んだ方が良い」と言う事ですね。
「マシン語症候群」再発した模様。(2023年4月23日記事参照「すべてをマシン語にする必要性」)
今作はここで完成としますが、今作では複数マップの切り替えをやっていません。
いつかシステムはそのままで、階層を5階層位作って、改めて作品としての3Dダンジョンロールプレイングゲームを作ってみようかな?と思います。
当然イベントも、アイテムも、魔法も、敵も適度に増やして、MSX1の市販ゲーム並にはしたいですね。
あと、以前に書いた通り「BMP to MSX」でコンバートして、オープニングや、エンディングのグラフィックも入れてみたいですね。
結構張り切ってここまで駆け抜けてきたので、少し休憩してから次回作品については考えたいと思います。
2024年01月20日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 公開!
「ゲーム制作」カテゴリで制作していた3Dダンジョンロールプレイングゲームが遂に完成しました!
プログラミングの勘を戻すため用の習作ですので、簡単に終わります。
ただ、習作ながら今私の持てる技術を最大限つぎ込んだゲームとなります!
▲タイトル画面
■主な新テクニック
・本格ロールプレイングゲーム
・独自スクリプト言語実装
・疑似3Dダンジョン表示
・走査線割込みによるBGM演奏
・「BMP to MSX」使用による綺麗で大きな敵グラフィック
・...etc.
・本格ロールプレイングゲーム
・独自スクリプト言語実装
・疑似3Dダンジョン表示
・走査線割込みによるBGM演奏
・「BMP to MSX」使用による綺麗で大きな敵グラフィック
・...etc.
完成作品としては、初の本格的なロールプレイングゲームになります。
また、走査線割込みを使ったゲームも、完成作品としてはこれが初です。
(共に未完成作品ならバンバン使ってました。)
MSXでの独自スクリプト言語の実装は、今作が本当に初となります。
習作なので規模の小さなロールプレイングゲームですが、プログラムは大規模なものと遜色ないので、いつか今作をベースに改めて規模を大きくしたもの(マップ・イベント・アイテム・魔法を増加)を作りたいと思います。
▲探索画面
▲戦闘画面
タイトル | 『 戻らずの迷宮 』 | 新作 | 1 | |
ストーリー | 不治の病に侵された妹を助けるため、万病に効くと言われる薬を求め「戻らずの迷宮」に挑む少年の物語…。 | |||
操作方法 | ■タイトル画面 タイトルで、「スペース」バー若しくはAボタンでゲーム開始 以降、開始したコントローラーでのみ操作可能です ■共通操作 ・メニューウィンドウ 「↑」「↓」:「」を動かし選択 「スペース」バー若しくはAボタン若しくは「→」:決定 「GRAPH」キー若しくはBボタン若しくは「←」:キャンセル メニューウィンドウの上枠に「▲」、下枠に「▼」が表示されたら、その方向にまだ選択項目があります・メッセージ表示後、右下に「▼」が表示されたら「スペース」バー若しくはAボタンで処理進行 ■探索時 「↑」:向いている方向に前進 「→」:向いている方向に対し、右を向く 「↓」:向いている方向に対し、後ろを向く 「←」:向いている方向に対し、左を向く 「GRAPH」キー若しくはBボタン:サブメニュー表示 ■戦闘時 共通操作と同じ | |||
対応機種 | MSX1、MSX2、MSX2+ | 製作年 | 2023年 | |
ダウンロード | リンク先へ | ジャンル | ロールプレイングゲーム |
※ゲーム内のキャラクタ、音楽は制作当時の物です。 公開前提に製作していないため、雑誌等から流用している物もあるかも知れませんので、著作権侵害の恐れのあるものは、ご連絡をお願いします。 |
2024年01月19日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第91.5回
3Dダンジョンロールプレイングゲーム 第91.5回目です。
.5なのでバグ取りです。
効果音のデバッグプレイ中、BASICに戻る直前の効果音が鳴らないバグを発見。
答えは簡単、BASICに戻る時には、毎回「走査線割込み終了処理」を実行するのですが、これを実行してしまうと、当然、BGM演奏ルーチンへ処理が飛ばないので、BGMも効果音もならなくなります。
効果音フラグを設定するロジックの場所を、フェードアウトなど時間のかかる処理の前に移動するなどして調整。
しかし、戦闘勝利時の効果音は長いので、どう調整しても「走査線割込み終了処理」までに演奏が終わらない。
どうなるか?
効果音の演奏が途中で一旦切れ、BASICへ戻り、再度マシン語に入り、走査線割込み開始後に続きから演奏されてしまう。
違和感しかない…。
解決策として、戦闘勝利時の効果音だけ、演奏終了まで待つことにしました。
これで解決です。
他の効果音は短いので問題なしです。
あと、タイトル画面変更しました。
エンディングの「Fin」の文字が「かっこいいな!」と思い、タイトルも合わせました。
いい感じ!
次回本当に公開します。
2024年01月18日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第91回
3Dダンジョンロールプレイングゲーム 第91回目です。
今回は効果音処理を組んでいきます。
前回、効果音が必要な個所に、効果音フラグ(&HE025)を立てましたので、後はBGMと同様「走査線割込み」処理内でフラグをチェックし、音を鳴らし始めたらフラグを「&HFF」にします。
BGMと異なるのは、鳴らし終わったらそこでフラグを「&H00」にして終了、繰り返しません。
私は基本的にPSGのチャンネルAとBをBGM用、チャンネルCを効果音用として使っていました。
過去作品の効果音を再利用しようかとも思ったのですが、シューティングやアクションが多かったので、合わない…。
止むを得ず、久しぶりの効果音作り…。
難しい!
うーん…、思ったような音になりません。
敵への攻撃時は、イースの「デュバッ」っていうのが良いんだけど、出来ない…。
因みに昔は作れてました…、昔どうやって作ってたんだっけ…?
今作で使っているBGM演奏ロジックではあまり複雑なことできないのでノイズやエンベロープも切り替えられないので、これ以上は無理ですね…。
とりあえず、あまり時間かけたくなかったので、一応それらしい効果音が出来たらそれを採用。
全9種類完成しました。
▲効果音データの一部
共通ロジック側の効果音は、ロジック内に組むには流石にメモリがない…。
止む無く&H9A00~&H9AFFまでを効果音データとして、メモリマップに入れました。
アドレス | データ名 | 備考 |
9A00〜9AFF | 効果音データエリア | 3種類、256バイト |
9B00〜9CB4 | アイテムデータエリア | 23種類×19バイト=437バイト |
9D00〜9D4D | 魔法データエリア | 6種類×13バイト=78バイト |
9E00〜9EAF | 敵データエリア | 8種類×22バイト=176バイト |
9F00〜9FE7 | レベルアップデータエリア | 29レベル×8バイト=232バイト |
A000〜A1B8 | 2Dマップデータ | 21マス×21マス=441バイト |
A200〜A7FF | 壁キャラクタデータ | 15パターン、1,536バイト |
A800〜ABFF | BGMデータ | 4曲(無音、ダンジョン、店屋、戦闘)1,024バイト |
AC00〜AFFF | システムメッセージデータエリア | 1,024バイト |
B000〜B7FF | フォントキャラクタデータ | 256キャラ×縦8バイト=2,048バイト |
B800〜BFFF | フォントカラーデータ | 256キャラ×縦8バイト=2,048バイト |
C000〜D9FF | マシン語エリア | 6,655バイト |
DA00〜DFFF | メッセージデータエリア | 1,536バイト |
E000〜E0FF | 変数エリア | 256バイト |
EF00〜EFFF | メニュー表示用ワークエリア | 256バイト |
再度、イヤホンを付けてのデバッグ作業です。
2024年01月17日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第90.5回
3Dダンジョンロールプレイングゲーム 第90.5回目です。
デバッグを頼んでいた友人から、
友人「これで完成!?」
私「なんで?」
友人「効果音は!?」
私「…は?」
なんと、「効果音」をすっかり忘れていました。
「次回公開!」と、言っておいて申し訳ないですが、今回はバグ取りです。
前にも書きましたが、私は普段パソコンの音は鳴らないようにしています。
BGMの作曲・確認にはイヤホンを使い、必要な時だけ聴いていました。
当然、デバックプレイ時は無音…。
BGM切り替え部分だけ確認したくらいです…。
そう言った訳で、「効果音」の存在に一切気付けずにいました…。
慌てて「攻撃」や「敵の遭遇」等、必要な個所に「効果音フラグ」(&HE025)を立てていきます。
名前 | 用途 | 種類 | |
0 | 無音 | 効果音無し | 共通 |
1 | 足音 | 探索時、プレイヤー移動 | 共通 |
2 | 遭遇 | 敵とエンカウントした時 | 共通 |
3 | 勝利 | 敵との戦闘に勝利した時 | 戦闘 |
4 | レベルアップ | レベルアップした時 | 戦闘 |
5 | 攻撃 | 敵にダメージを与えた時 | 戦闘 |
6 | 逃走 | プレイヤーか敵が、戦闘から逃走した時 | 戦闘 |
7 | ダメージ | 敵からのダメージを受けた時 | 戦闘 |
8 | 魔法 | プレイヤーか敵が、魔法を唱えた時 | 共通 |
9 | 衝突 | 前にある壁に衝突した時 | 共通 |
うーん…、効果音は種類が多いので、大変です…。
しかも、この段階から効果音追加するのはなかなか厳しいです…、特にメモリ容量的に…。
幸い(?)な事に、今作では使わない処理のロジック(フェードアウト等)をポロポロ組んで残してあったので、それらすべて削除。
及び、戦闘ロジックのみの処理はそちらへ移動。
ギリギリメモリは何とかないそうですが、大工事です…。
次回、効果音作成します。
2024年01月16日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第90回
3Dダンジョンロールプレイングゲーム 第90回目です。
バランス調整です。
敵の特殊攻撃の「毒」ですが、確率1/8にしたのですが、多い!
1/16に下げました。
あと、「シルバーウルフ」を倒せるようになるまで、ひたすら同じ通路を往復して何時間も「スライム」と戦い続けなければならない…。(大体レベル7目安)
これはダメだ…。
とりあえず、得られる経験値と、お金を増やします。
敵1の経験値とお金+10
:
敵5の経験値とお金+50
と言う感じに増やします。
改訂前
改訂後
これで経験値が上がり易く、多少はプレイし易くなりました。
レベル5位にはすぐに上がるようになりました。
んー、ちょっと簡単になりすぎたかな?
取り敢えず、これで完成です!
次回、公開しますね。
2024年01月15日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第89回
2024年01月14日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第88回
3Dダンジョンロールプレイングゲーム 第88回目です。
「エンディング」処理を組んでいきます。
エンディング処理は、エンディング用メッセージデータを作成して、イベントを作成。
ここまでくると、プログラム容量を気にしなくてもよいので、ガツガツ組んでいきます。
途中、スタッフロールさせるのに、いちいちボタン送りが必要なので、ボタン送りなしでイベントを進められるよう、新たなスクリプトを追加作成。
もう一つ、ボタン送りなしでイベント終了できるスクリプトも追加。(「PD」や「EG」はボタン送りが必要。)
命令 | 意味 | 記述 | 動作 |
TR | ThRough | TR | 入力待ち無しでメッセージを次の行へ。 |
EX | EXit | EX | 入力待ち無しでイベントを終了し、BASICへ戻る。且つ、BGM演奏は継続する。 |
これでスクリプト26種です。
「ドラゴン」討伐後のエピローグを表示した後、スタッフロールを流し、「Fin」で無限ループ。
完了です!
MSX1なので、グラフィックに力を入れられないのが残念…。
次回作は、せっかく「BMP to MSX」があるので、グラフィックに力入れてみようかな。
となるとアドベンチャーゲームかな?
さて、次回は、遂に後回しにしてきた問題のありそうな「CONTINUE」処理です。
2024年01月13日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第87回
3Dダンジョンロールプレイングゲーム 第87回目です。
前回で、メインプログラムは一通り完成です。
後は、「エンディング」及び、「CONTINUE」処理を残すのみ。
今回は、一通りプレイしてみてバグがないか探す、「デバッグ」作業を行います。
ゲームが完成した際は、アルバイトなど雇ってどこのソフトハウスも必ずやる作業です。
まぁ、最近はバグ修正パッチを簡単にネット配信できるので、昔ほど力を入れていないと聞いたことがありますが…。
うーん…。
仕方がないけど、ゲームバランス悪い…。
「スライム」と、次の強さの敵「シルバーウルフ」の強さ差が半端ない…。
(ドラクエマップの広さの敵レベルを21×21のマップ(移動可能エリアは更にその半分)に凝縮してるから仕方ない…。)
バランス調整で、取得経験値を上げてレベルを上げやすくするか、取得金を上げて武具・防具を買いやすくするか…。
ちょっと考えます。
「デバッグプレイ」の結果、細かいバグ多数と、大きなバグ数件発見。
細かいバグは、無数にありました。
簡単に修正できるような内容でも、メモリの空き容量がないのでなかなか修正が困難なものもありました。
これまでに掲載したロジックも、バグ取りで細かく色々変更になっていますので、ご了承願います。
(掲載しきれません。)
大きなバグは数件ありましたが、ほとんどが計算結果の8ビット越え。
なかでも与ダメージ値の計算。
(乱数*(攻撃力-敵防御力/2+1)/255+攻撃力-敵防御力/2)/4 |
最終ダメージ値が8ビット値(〜255)なので、掛け算・割り算の計算ロジック以外は8ビットで大丈夫だろうと思っていたのですが、足し算・引き算の計算ロジックで8ビット超えていました…。
何気にプレイヤー最強状態で「スライム」と戦った時、与ダメージ値「2」とか出るからなんだろうと思ってたら、これでした。
例えばプレイヤー攻撃値が「168」で、スライム防御が「3」、乱数が最大値で「255」だと、与ダメージ値計算式最後の「÷4」する前の結果が、「325」になり、8ビット値(÷256の余り)325-256=「69」。
最後、与ダメージ値計算結果は69÷4=「17」になります。
そのため乱数値次第で「2」が出たようです。
▲バグフィックスの一部
同じように敵が強すぎて、プレイヤーが弱い時の被ダメージ値計算も同じ状態になるので16ビット化。
まぁ、プレイヤーが弱々の時に、強敵と遭遇しないので、こちらは修正の必要ないかもと思いましたが念のため。
他にも、「ドラゴン」がやけに弱いと、思ってたら「ドラゴン」だけ初期体力が8ビット超えてる(350)…。
ドラゴンの体力が350-256=「94」になってたんですね…、そりゃ弱いわ…。
体力計算式をすべて16ビットに変更…。
上記理由で、ロジックだけ組み込んだ敵魔法の回復も16ビット化。
今作では使いませんので、こちらも不要かと思いましたが、念のため。
後は、プレイヤーが回復魔法かけた時の8ビット越え…。
最大体力「210」の時に、「回復2」をかけると回復値最大「100」で、計「310」になってしまう。
薬草だと回復値最大「27」なので超えない(210+27=237)のでとりあえずそっちは放置。
大変でした…。
こんなことなら詳細設計通り、全計算16ビットでしておけばよかった。
多少なりとも計算ロジックが短くなるので8ビットにしたのに、結果的にバグ取りで大きくなってしまった…。
最後は、なんと「レベルアップ時に魔法を習得しない」といった、致命的なバグでした。
開発時のテストデータで、最初から全魔法を習得させていた関係で、気付きませんでした。
修正。
これで「デバッグ」作業完了です!
共通マシン語エリアの空き容量がほぼなくなりました。
レベル最大時のステータス画面で、レベルアップ必要経験値(つぎ)の値がおかしいですが、ゲーム上不都合ないのでこのままいかせてください、修正できる容量がありません。
次回は、エンディングを組んでいきます。