2023年11月20日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第49回
3Dダンジョンロールプレイングゲーム第49回目です。
今回はセーブ処理を組んでいきます。
「セーブ」はシステムメニューの4番目。
セーブ数は3つです。
ファイル選択後、一旦BASICに戻り変数エリア(&HE000~&HE0FF)をBSAVEにて保存し、再度マシン語に復帰します。
マシン語プログラムリストです。
BASICプログラムリストです。
元々のメインルーチンに601行〜604行を追加しています。
システムメニューからセーブして、ちゃんとゲームに戻る事を確認。
とりあえず以前のようなBSAVEの悪夢は起こらず…。
ちゃんと保存されているかは、「CONTINUE」処理を組む際に分るでしょう。
何にしても一番最後です。
駄目ならまた変数エリアのアドレスをズラすしかない…。
でも、それで解決できるのが判ってるから気は楽です。
さて、次回…。
ん−、処理を進めたいところですが、ステータス表示してみて、「やっぱり標準FONTじゃ味気ないなぁ…。」と痛感。
次回は閑話休題、文字FONTを書き換えてみます。
2023年11月19日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第48回
3Dダンジョンロールプレイングゲーム第48回目です。
では、今回は前回設計した通りに「ステータス」表示を組んでいきます。
「ステータス」はシステムメニューの3番目。
1ページ目は強さに関する表示を左右に分けて表示します。
中央線(!)は専用のFONT作る予定です。
仮にアイテム装備させてみて、攻撃力・防御力・素早さの()内装備品込値にちゃんと反映されてるかチェック。
問題なしです!
2ページ目は装備品に関する表示です。
こちらも仮に装備させた装備品が、ちゃんと反映されてます。
ステータス表示のプログラムリストです。
容量節約しないといけないのに、これだけで&H128も使ってしまった…。
まぁ必要な処理故、止むを得ない…。
次回はセーブ処理を作成していきます。
BSAVEの悪夢が再現しないことを祈ります…。
2023年11月18日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第47回
3Dダンジョンロールプレイングゲーム第47回目です。
第19回にシステムメニュー表示して、「次回以降それぞれの処理を作ります。」と、言っておきながら、システムメニューすっかり後回しになってしまいました…。
今回はシステムメニューの「ステータス」の表示について設計します。
今作では、画面下部1/3にしか文字が表示できないため、そこに収まる範囲の表示しかできません。
しかし、表示項目が多く標準メッセージウィンドウに一度に表示し切れないので、2ページに分けて表示することにします。
1ページ目は強さに関する表示を左右に分けて表示します。
[ステータス (つよさ)] | ||
レベル:値 | | | こうげきりょく:値(装備品込値) |
たいりょく:値/上限値 | | | ぼうぎょりょく:値(装備品込値) |
まりょく:値/上限値 | | | すばやさ:値(装備品込値) |
じょうたい:状態 | | | けいけんち:値 |
おかね:値 | | | つぎ:>値 |
2ページ目は装備品に関する表示です。
[ステータス (そうび)] | ||
けん:区分0装備品名 | ||
たて:区分1装備品名 | ||
よろい:区分2装備品名 | ||
かぶと:区分3装備品名 |
ステータス表示は、1項目ずつ変数を16進数→10進数変換掛けて、桁数指定(ゼロサプレス処理有)表示ルーチンでメッセージワークに書き込み、全項目書き込み終わったら表示となります。
しかもその項目数が、3桁数値11個、5桁数値3個、文字列5個もあり、完全な力技になります。
圧縮しようのない、最も容量を食う処理の1つです。
装備品込みの攻撃力・防御力・素早さ表示のために、算出ロジックを組みます。
これは戦闘時にも必要なのでサブルーチン化します。
同じく、レベルアップに必要な経験値表示のために、算出ロジックを組みます。
これも戦闘後のレベルアップ判定に必要なのでサブルーチン化します。
次回は今回設計に則り、ステータス表示を作成します。
2023年11月17日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第46回
3Dダンジョンロールプレイングゲーム 第46回目です。
さて、今回はマップ移動時発生イベントを組んでいきます。
何それ?と、思われるかもしれませんが、前回組んだイベントの中で、「宝箱」や「ゲート」等に関して「移動後座標って何?」と思われた方もいるのではないでしょうか?
イベント名 | 初期座標 | 移動後座標 | タイプ | |
1 | ゲート | (14,1) | (0,0) | 接触 |
2 | 宝箱 | (0,0) | (1,1) | 接触 |
3 | 宿屋 | (20,16) | 接触 | |
4 | 武器屋 | (20,18) | 接触 | |
5 | 道具屋 | (20,17) | 接触 | |
6 | 武器屋案内 | (19,18) | (0,0) | 設置 |
7 | 道具屋案内 | (19,17) | (0,0) | 設置 |
8 | 宿屋案内 | (19,16) | (0,0) | 設置 |
9 | ボス戦闘 | (19,9) | 接触 |
「宝箱」は初期座標が通路に面していない壁の中(0、0)ですので接触できません。
また、「ゲート」はイベント終了後そこに存在すると先に進めません。
「案内」イベントは、毎回表示すると煩いので初回通過時のみとします。
そこで、フラグ値に応じてイベントを移動させる必要があります。
実際のイベントを使って説明します。
ゲートがあって進めません。
鍵を使ってゲートをあけます。
本来なら、これでゲートは開いているはずので通過できるはずなのですが、現状だとイベントがそのまま残っていますので、進もうとすると…
進めません。
そこで、フラグ値に応じてイベントを消す必要があるのです。
イベントを消すには絶対に触れられない場所(今作だと座標(0,0))に移動させれば良いです。
このルーチンはマップを移動した際(イベント位置が初期座標にある)、そのマップ内のイベントを毎回フラグ値に応じて移動させる(移動後座標に配置換え)必要があるので、マップ移動時発生イベントと私は呼んでいます。
複雑なイベントを組むのなら、これも別ファイルでスクリプト化した方が便利です。
例えば学校探索系のロールプレイングゲームで、教室のドアが複数あるなど。
今作は5つなので、直プログラムします。
これで、敵がいない状態で最後のボス戦まで進むことが出来るようになりました。
次回は、システムメニューを組んでいきます。
2023年11月16日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第45.5回
3Dダンジョンロールプレイングゲーム 第45.5回目です。
.5ですが、バグではありません。
簡単なイベントを追加します。
前回、イベントの配置と進行を組みました。
ただ、やはり壁に店屋と宿屋がめり込んでいるのは、「普通気付かないだろう」と考えました。
そこで、大した容量も労力も費やさないので、「案内イベント」を用意することにしました。
「武器屋」、「道具屋」、「宿屋」の前を最初の通過時のみ、「東に『**屋』がある。」と表示するのです。
すると、壁にめり込んでいても、壁側に何かあると気付きますよね。
1回表示したら「ゲート」同様、イベントを移動させます。
そうする事で、2回目の通過以降はイベントが発生しなくなります。
イベント一覧です。
イベント名 | 初期座標 | 移動後座標 | タイプ | |
1 | ゲート | (14,1) | (0,0) | 接触 |
2 | 宝箱 | (0,0) | (1,1) | 接触 |
3 | 宿屋 | (20,16) | 接触 | |
4 | 武器屋 | (20,18) | 接触 | |
5 | 道具屋 | (20,17) | 接触 | |
6 | 武器屋案内 | (19,18) | (0,0) | 設置 |
7 | 道具屋案内 | (19,17) | (0,0) | 設置 |
8 | 宿屋案内 | (19,16) | (0,0) | 設置 |
9 | ボス戦闘 | (19,9) | 接触 |
通路上にあり、その座標に乗ったら発生するイベントなので、「設置」型となります。
今作は「設置」型のイベントがなかったので、ちょうどいい紹介になりました。
次回はマップ移動時発生イベントを組んでいきます。
2023年11月15日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第45回
3Dダンジョンロールプレイングゲーム 第45回目です。
さて、今回はイベントの配置と、進行を組んでいきます。
要するに敵が出ない状態でエンディングまで進めるようにします。
今回の3Dロールプレイングゲームは、マップが1面でイベントも6種類しかありませんので、簡単です。
イベントに座標と、設置型か接触型かのフラグと、発生イベントb持たせておいて、イベント発生した時、そのイベントbフメッセージが表示される仕組みとします。
イベント部分の変数表です。
イベントの配置と座標です。
イベント名 | 初期座標 | 移動後座標 | タイプ | |
1 | ゲート | (14,1) | (0,0) | 接触 |
2 | 宝箱 | (0,0) | (1,1) | 接触 |
3 | 宿屋 | (20,16) | 接触 | |
4 | 武器屋 | (20,18) | 接触 | |
5 | 道具屋 | (20,17) | 接触 | |
6 | ボス戦闘 | (19,9) | 接触 |
可能なら、3D画面表示の際、これらのイベント画像(宝箱など)を表示できればいいのですが、容量節約のため、とりあえず表示はナシのメッセージのみとします。
(最後、余裕があれば表示するようにします。)
とりあえずメッセージデータは全て組みました。
しかし、このままでは「ゲート」の鍵を開けられても、イベントがその座標に残っているので、先に進めません。
その対策として、イベントが終了したらイベントを移動させる必要があります。
というわけで、次回はマップ移動時発生イベントを組んでいきます。
2023年11月14日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第44回
3Dダンジョンロールプレイングゲーム 第44回目です。
さて、不具合もとりあえず解消したので製作再開します。
ただ、根本的な原因が解消できていないので、いつ再現するかとビクビクしています…。
今回はイベントの発生方法について説明します。
イベントの発生と一言で言っても、大きく2種類あります。
1つ目は「城」や、「街」、「落とし穴」や、「特定の場所」等、その座標に乗った時に発動する「設置型」。
2つ目は「町人」や「ドア」、「宝箱」等、目の前にあるイベントに接触した時に発動する「接触型」。
それ以外にも、地形イベント、マップ移動時発生イベント、アイテム使用時発生イベントなどあります。
因みに、
・地形イベントは、「毒沼」等プレイヤーがいる地形により発生するイベントです。
・マップ移動時発生イベントは、マップ移動を起点として発生するイベントです。
・アイテム使用時発生イベントは、アイテム使用を起点とするイベントです。
今作では関係ありませんが、結構大変なのが、2D「ドラクエ」タイプの移動する町人。
町人が移動している時に接触した時の判定が結構面倒。
まぁ、説明する機会があれば、その時にでも。
次回は、イベントを配置、作成していきます。
2023年11月13日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第43回
3Dダンジョンロールプレイングゲーム第43回目です。
メモリマップ改訂したので掲載しておきます。
(赤字が前回からの変更箇所)
各種データエリアを&HE800→&H9B00へ。
マシン語エリアを少し縮小し&HC000~&HDFFF→&HD9FFに。
メッセージエリアを&HE100→&HDA00へ。
今のところ、変数エリア(&HE000~&HE100)は壊れないようです。
アドレス | データ名 | 備考 |
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データ | 3曲?(ダンジョン、店屋、戦闘)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バイト |
本気でカツカツですね!
折角広げたマシン語エリアが、また狭くなったのが痛いですね…。
メッセージエリアも文字列はちゃんと保存されるのに、制御bフ「0」、「1」、「2」が壊れてしまい、発生して欲しいイベントと、全く異なるイベントが発生してしまったり、同じ接触イベントなのに1回目と2回目で違うイベントが発生したりする。
壊れる領域と壊れない領域の差って何なんだろう…?
因みにこれも&HE100→&HDA00へ移動したら直りました…。
また、&HE500付近を書き換えるとフロッピーディスクが壊れるようです。
DISK-BASICの詳細記事何処かにないかなぁ…。
バカなのでテクハンだけじゃ解らないです…。
2023年11月12日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第42回
3Dダンジョンロールプレイングゲーム 第42回目です。
ネット上のMSXのフロッピーディスク関連についていろいろ調べましたが、解りませんでした。
そもそも、フロッピーディスク関連の記事が少ない。
因みに仮データ、保存先アドレスを元に戻して(&HE800→&HE000)登録すると、ちゃんと登録されました!
そういえば、DISK-BASICだとデバイス用のメモリを使うから、その分使えるメモリが少なくなると覚えています。
MSX-BASIC時のフリーメモリ
DISK-BASIC時のフリーメモリ 5kバイトも減ってる…!
でも、&HE800当たりのメモリを使うんだとしても、アイテム名だけ正常に保存されるのはなぜ?
全部壊れていれば、悩まずに済んだのに…。
以前書いた通り、私にフロッピーディスク関連の知識は、全くありません。(2023年10月10日記事参照「マシン語からのファイル制御」)
このまま、調査続けて無駄に時間を費やすよりも、保存先アドレス変更した方が早いな…。
&HE000台、どこまで正常に使えるんだろう…。
いっそのこと、大きくBASIC部が増えることはないだろうから、各種データを&H9800に移動させるか…。
BASIC部は、あと戦闘開始(敵データの読込と、戦闘ロジック呼び出し)、死亡処理、エンディングスタートくらいかな。
完成時には初期値書き込み部分は削除されるから、容量は減ると思われます。
とりあえず、解決に時間掛かりそうなので各種データ&H9800に移動の方向で進めます。