2023年11月05日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第40回
3Dダンジョンロールプレイングゲーム第40回目です。
・変数名の書換。
・各種データ領域変更。
・システムメッセージのデータファイル化。
・それらに伴うメモリマップの再編成。
やり切りました!
あー、大変だった…。
でも、結構早かった。
なかなか順調に進んで、一通りのデバッグ処理完了です。
しかし、今回の作業は、あくまでデバッグ。
作業量は膨大だったけど、ゲームの製作進捗は全く進んでいない…。
マイナスがゼロになっただけです。
なんか、空しい…。
では、次回から開発再開します。
次回は、イベントを作成していきます。
2023年11月04日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第39回
3Dダンジョンロールプレイングゲーム第39回目です。
メモリマップ改訂したので掲載しておきます。
(赤字が前回からの変更箇所)
アドレス | データ名 | 備考 |
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〜DFFF | マシン語エリア | 8,192バイト |
E000〜E0FF | 変数エリア | 256バイト |
E100〜E9FF | メッセージデータエリア | 2,304バイト |
EA00〜EBB4 | アイテムデータエリア | 23種類×19バイト=437バイト |
EC00〜EC4D | 魔法データエリア | 6種類×13バイト=78バイト |
ED00〜EDAF | 敵データエリア | 8種類×22バイト=176バイト |
EE00〜EEE7 | レベルアップデータエリア | 29レベル×8バイト=232バイト |
EF00〜EFFF | メニュー表示用ワークエリア | 256バイト |
各種データエリアの領域は、まだ変動します。
ただ、&HE000~&HEFFFを超えることはないと思うので、暫定でこれで行きます。
さぁ、マシン語エリアが&HDFFFまでに収まるかが最大の課題です。
2023年11月03日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第38回
3Dダンジョンロールプレイングゲーム 第38回目です。
今作で使用するスクリプト命令一覧です。
以前に掲載したものと、パラメータに若干の変更がありますので、ご了承願います。
命令 | 意味 | 記述 | 動作 |
NX | NeXt | NX | 次のメッセージへ。 |
FN | FlagNext | FN,n | フラグをn値に設定し、イベントを継続。 |
FE | FlagEnd | FE,n | フラグをn値に設定し、イベントを終了。 |
FS | FlagSet | FS,e,n | イベントeのフラグをn値に設定する。 |
end | イベント終了。 | ||
MS | MessageSpeed | メッセージ表示速度をn値に設定。(初期値:40) | |
YN | Yes/No | YN,y1,x1,m1,m2,m3 | 座標(x1,y1)に「はい/いいえ」の選択ウィンドウを開く。「はい」が選択されたら、メッセージm1、「いいえ」が選択されたら、メッセージm2、キャンセルが選択されたら、メッセージm3へ。 |
WO | WindowOpen | WO,y1,x1,x2,y2,n | 座標(x1,y1)にメッセージ欄幅x2、高さy2のウィンドウを開く。nで枠線の有無設定。(0:有 1:無) |
SW | SelectWindow | SW,y1,x1,x2,y2,n | 座標(x1,y1)にメッセージ欄幅x2、高さy2の選択ウィンドウを開く。選択肢数はn。幅は、選択肢最大文字数+2。選択肢数が高さを超えていると、選択肢上下スクロール。 |
JP | JumP | JP,n | メッセージnへ。 |
CF | CheckFlag | CF,e,m0,m1,m2,m3,… | イベントeのフラグが0ならメッセージm0、1ならメッセージm1、2ならメッセージm2...へ。 |
ES | EventStart | ES,e | イベントeを実行する。 |
SS | SetSelect | SS,e | イベントeのフラグに選択ウィンドウで選択された項目数を設定する。 |
IS | ItemShop | IS,y1,x1,n,i1,i2,i3… | 店屋。座標(x1,y1)にn種類のアイテムと金額の選択ウィンドウを開き、アイテムi1、i2、i3…を購入する。若しくは所持品と売却額の選択ウィンドウを開き、売却する。 |
CI | CheckItem | CI,i,m1 | アイテムiを所持していなければ、メッセージm1へ。 |
GI | GetItem | GI,i,m1 | アイテムiを所持する。これ以上持てなければメッセージm1へ。 |
LI | LoseItem | LI,i | アイテムiを所持品から消失させる。所持していなければ何も起こらない。 |
IN | INn | IN,g,m1 | 宿屋、所持金額をg減らし、HP・MPを全回復させる。所持金額が足らなければメッセージm1へ。 |
BE | BattleEnemy | BE,e,m1 | 敵eとイベント戦闘を開始する。負ければメッセージm1へ。 |
DW | DefaultWindow | DW | 標準(デフォルト)メッセージウィンドウを表示する。 |
GP | GoldPrint | GP | 所持金を表示する。 |
計21種類の命令でした。
必要かと思い、今作では使わない命令まで組んでしまいました。(SW、CF、ES、SS等)
2D「ドラクエ」タイプのロールプレイングゲームだと、これにイベント移動の命令などが必要になるので、30個強になります。
このスクリプトが出来てるから、比較的楽に作成できそう。
下表はメッセージ中に組み込む制御コードです。
組込文字 | キャラクタコード | 動作 |
^ | &H5E | 改行。 |
_ | &H5F | 入力待ち。 |
| | &H7C | メッセージ終了。(入力待ち無) |
計3種類の制御コードでした。
2023年11月02日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第37回
3Dダンジョンロールプレイングゲーム 第37回目です。
今回はメモリ節約のために、プログラム中のシステムメッセージを一纏めにして別ファイルにします。
システムメッセージのあった領域分が空くので、その領域をプログラムで使おうという取り組みです。
意外とシステムメッセージデータは多く、それだけで最終的にはかなりの容量を使ってしまいます。
現状、メモリマップのBGMデータの後ろが空いているので、そこにシステムメッセージデータエリアを作り格納します。
あちこちに散らばっているシステムメッセージデータを集めて「3DRPGSYS.MES」ファイルを作成します。
結構なデータ量散らばっています。
これ、戦闘部分になると格段に増えますので、このタイミングに思い立って良かった…。
システムメッセージデータを削除した領域と領域の間に残ったプログラムを可能な限り片寄し、大きな領域が確保できました。
結構な領域が空きました。
イベント発生判定ロジックくらいなら、この領域内で収まりそう。
2023年11月01日
細かく修正L
「Laboratory」のテーマメニューに新しく2テーマを追加。
「ゲーム制作」の「3Dダンジョンロールプレイングゲーム」で前後回へのリンク切れが複数見付かったので修正。
「ダウンロード」に追加で新規公開したゲームやツール、サンプルの記事へのリンク追加、「Laboratory」テーマメニューの公開分記事へのリンク追加。
それ以外は、画像の貼り直しや、記事の誤記の修正程度です。
2023年10月31日
Laboratory再々々々追加
MSX1でゲームを製作するにあたり、一番の基本だけど、とても大切なことを忘れていました。
SCREEN1.5の設定方法です。
SCREEN1.5はこの機能が有ると無いとで、ゲームの出来栄えに雲泥の差が出ます。
当たり前すぎて、MSX1の標準機能と思ってしまいます。
あと、MSX2でSCREEN1.5を使ってシューティングゲームを作りたい時に必須のSPRITEモード2の設定方法です。
テーマ | ||||
26 | SCREEN1.5を使いたい |
標準のSCREEN1では、画面をきれいにするにも限界がありますが、SCREEN1.5を使うことによって、MSX1のグラフィック機能のすべてが使えるようになると言っても過言ではありません。
27 | SCREEN1.5でSPRITEモード2を使いたい |
MSX2の機能ですがSPRITEモード2が使えるようになれば、2枚重ね3色や、横ライン毎1色、水平方向同時表示8枚など、SPRITE機能が強化されます。
2023年10月30日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第36回
3Dダンジョンロールプレイングゲーム 第36回目です。
今回は、プログラム中の変数の書換えを行います。
簡単なBASICプログラム作って、変数部分(&HD000~&HD0FF)を検索してみます。
今回、変数に&HD000台を使っているので、PEEKで「&HD0」を探せばいいです。
「&HD0」はマシン語コード「RET NC」で、私は全く使わない命令ですので、見付かればまず変数と思ってよい。(あとは、「JP」、「JR」の飛び先指定くらいですかね…。)
まぁ、それがせめてもの救いですね…。
こんなにあった…。
37行×6個で222箇所…。
あと、「&HD1」(メッセージデータ開始アドレス)と、「&HDF」(選択ウィンドウ選択肢格納ワーク)も併せて検索します。
こちらは「&HD1」、困ったことに「&HD1」は「POP HL」でもあるので、結構ありました…。
ほとんどが「POP HL」だと思います。
仕訳が大変そうです。
こちらは「&HDF」、こちらもマシン語コード「RST 18H」で私は使いません。
なのでほぼ変数だと思われます。
まぁ、結構な数ありますね…。
ボチボチ変換かけて行くことにします。
一括変換機能が欲しい…。
これもハンドアセンブルじゃなく、アセンブラ言語なら簡単だったのかな?
2023年10月29日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第35回
3Dダンジョンロールプレイングゲーム 第35回目です。
…あぁ…。
…あぁ、遂にマシン語部が&HCFFFに達してしまいました!
前回、スクリプト命令「BE」で掲載されたプログラムで気付かれた方もいると思いますが、遂にこの時が来たという感じですね。
うーん、戦闘部分だけプログラムを分けるか、変数・データエリアをズラすかで悩んでいたのですが、まだ、システムメニューも、イベント発生ロジックも組めていない…。
と言う訳で、必然的に変数・データエリアをズラす方になります。
まぁ、今回のメッセージ表示ルーチンへの「|」制御コード追加など、プログラムの最初の方のルーチンのバグフィックスで、プログラムの最後の方に修正分を追加したところがいくつかあるので、まぁ、そうなるだろうなと薄々感じてはいましたので、それほどショックは大きくない。
もし、戦闘部分だけプログラムを分ける方にしても、膨大な作業量であることに変わりないですしね。
と、言う訳で変数群及び各種データエリアを&HD000→&HE000にズラします。
その分をマシン語エリアに充てるので、マシン語エリアが倍になります。
作業的には、なんと、プログラム中の変数はすべて書き換えです。
各種データは、登録用のBASICプログラムで保存先を変更するだけで済みますが、変数はそうはいかない…。
一体何カ所の変更が必要なのか…。
怖いです…。
「最初の見込みが甘いとこうなるよ」と言う反面教師にしてください…。
しかし、&HC000~&HCFFFは4kバイト…。
あっという間に埋まりましたね。
MSXのメモリ、本当に少ないんだなぁと、改めて感じました。
これ以上の拡張は難しいので、プログラムなるべく節約していきます。
うーん、プログラム書き換えに結構時間かかるかも…。
2023年10月28日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第34回
3Dダンジョンロールプレイングゲーム 第34回目です。
さて、今回も残りのスクリプト命令「BE」を組んでいきます。
ただ、メッセージデータを見て気になることがひとつ…。
「WO,16,0,30,6,0」が多い…。
宿屋4箇所
宝箱2箇所
ゲート3箇所
デフォルトのメッセージウィンドウを表示することで、
・イベント終了時に、メッセージを消す
・選択メニューを開いた際の、メインウィンドウ再表示
が目的ですが、あまりにも多すぎる。
1箇所につき、13バイトも取ってしまいます。
そこで、新たに「DW」(Default Window)命令を作って、13バイト→2バイトに縮めて、1箇所当たり11バイトのデータ圧縮を図ります。
「DW」命令プログラムサイズが32バイトなので、3箇所直せば元が取れます。
ああ、スッキリしました。
他のイベントも併せ、まだ途中なのに既に14箇所あったので計154バイト圧縮、154-32=122バイトの節約になりました。
意外とメリット大きい!
まだまだイベント組むので、「DW」命令どんどん使うと思います。
最終的に何バイトの節約になるのか楽しみです。
次に「BE」ですが、これは戦闘ルーチンが完成後、それと連動させますので今は呼び出し口だけ作成しておきます。
これで、今作で予定していたスクリプト命令は、全て組み込み完了しました。
次回は、今回組み込んだスクリプト命令の使い方やパラメータをまとめます。
2023年10月27日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第33回
3Dダンジョンロールプレイングゲーム 第33回目です。
さて、今回も残りのスクリプトの命令「CI」、「LI」を組んでいきます。
「CI」(Check Item)は所持アイテムをチェックして、指定アイテムの有無に応じメッセージを変更します。
例えば、持っていなければ「もっていません。」メッセージ表示。
持っていれば「LI」命令実行。と言った使い方をします。
「LI」は単純に所持アイテムからアイテムを消失させます。
そのアイテムを持っていなくても特に何も起こらないので、確実に消したい時は「CI」命令と併用してください。
共に、アイテムを使う処理に使います。
ドアの鍵開けや、アイテムを所持している事でイベントが発生など。
次回、残りのスクリプトを全部組み込んでいきます。