2023年11月11日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第41.5回
3Dダンジョンロールプレイングゲーム 第41.5回目です。
前回の不具合の続きです。
原因不明なので、とりあえずデータが正しく登録されているか確認する事に。
保存された「3DRPG.ITM」をBLOADし、メモリに書き込まれた値を確認するための簡単なBASICプログラムを組んで検証してみました。
アイテム名の後ろ2バイト(0〜65535)が金額なのですが、2バイト目以降全て「0」になってる!
(でも、「エリクサー」の&HFFはちゃんと残ってる!?)
うーん、結果「3DRPG.ITM」は壊れてる…。
では、どこで壊れたのか?
「ITMSET.BAS」起動後の時点ではどうか?
結果は同じ、BSAVEした後のメモリの時点でおかしい…。
えー…、なんで?
何度かプログラムを変更して試行錯誤を繰り返しましたが、結果は同じ。
まぁ、そもそもプログラムは変更していないから、動作は正常なはず…。
念のためにと、メモリに書き込んだ直後、BSAVE前でプログラムを終了し、その時点のメモリを確認する事に。
実行。
あ、正常だ。
当然ですが、メモリ内の表示プログラムは同じものを使っています。
BSAVE実行すると、アイテム名以降のデータが壊れる事が分かりました。
BSAVEが悪さしていることは分かりましたが、アイテム名部分はちゃんと保存されて、それ以降だけ壊れる意味が分からない…。
そんな事ある?
まさか、こんなことで躓くとは…。
どなたか知識ある方、ご教授ください!!
2023年11月10日
【ゲーム制作】3Dダンジョンロールプレイングゲーム 第41回
3Dダンジョンロールプレイングゲーム 第41回目です。
原因不明の問題が発生しました!
他カテゴリの記事で時間稼いで、少しでも制作先に進めようと画策していたのですが、完全に予定外です…。
プログラムの改修が完了したので、新たなメモリマップに則って各種(仮)データの登録を行い、登録出来たか確認のためにメインプログラム(3DRPG.BAS)を起動したところ、「File Not Found in 740」と出ました!?
「は?」と思い、FILESを実行したところ、「いかぎ」と言うファイルが作成されており、「FILE1.SAV」と「3DRPG2.FNT」がなくなっている事が判明。
「いかぎ」…、アイテムデータに(仮)登録した「あおいかぎ」の事か!?
ファイルが壊れたので、慌てて取ってあったイメージディスクのバックアップから戻して、再び(仮)データの登録を行ったが、現象は再現せず…。
「何だったんだろう?」と、思いながらもテストプレイを続けていると、「あれ!?」。
「店屋のアイテムの金額がおかしい!?」事に今気づいた!
慌てて、アイテムデータ登録用のBASICプログラム「ITMSET.BAS」を確認。
特に問題なし。
保存先のアドレスくらいしか変更していません。(&HE000→&HE800)
そもそも、プログラムは変更していないから、正常に動作することは確認済み。
んー?
何がおかしいんだろう?
次から次へと問題が発生するなぁ…。
ブログでやってなければ、既に断念してたかも…。
2023年11月09日
Laboratoryテーマ27「SCREEN1.5でSPRITEモード2を使いたい」
水平方向にSPRITEを16枚並べた時、8枚まで表示される。
今回は、Laboratoryテーマ27「SCREEN1.5でSPRITEモード2を使いたい」です。
(MSX2以降の機能となります。)
SCREEN1.5は前回書いた通り、FONTが非常に扱い易いモードです。
このモードを使ってシューティングゲームなんかを作りたい!
しかしながらMSX1の機能であり、スプライトの機能が貧弱です。
そこで、SCREEN1.5で、SPRITEモード2が扱えないか?
実は扱えます!
代表作がコナミの「スペースマンボウ」ですね。(2023年10月2日記事参照「MSX語り」)
やり方ですが、システムワークとVDPの設定で行います。
詳細を説明すると非常に長く、専門的になってしまうので、今回は必要な設定のみ記載します。(簡潔に説明しきるスキルがない…。)
詳細は、「MSX2 TEchnical Hand Book」等で調べてみて下さい。
ラベル名 | アドレス | 初期値 | 内容 | 設定値 |
T32ATR | &HF3C3・F3C4 | &H1B00 | SCREEN1スプライトアトリビュート・テーブル | &H1E00 |
GRPATR | &HF3CD・F3CE | &H1B00 | SCREEN2スプライトアトリビュート・テーブル | &H1E00 |
名称 | 対応するVDP | 機能 | 設定値 |
R#0 | VDP(0) | モードレジスタ#0 | &H4 |
R#5 | VDP(5) | スプライトアトリビュートテーブル(LOW) | &H3F |
R#8 | VDP(9) | モードレジスタ#2 | 第3ビットを「1」 |
モードレジスタ#0(R#0)
0 | DG | IE2 | IE1 | M5 | M4 | M3 | 0 |
DG:1のとき、カラーバスを入力モードにして、データをVRAMに取り込む
(デジタイズ機能を持ったMSX2でのみ使用可能)
IE2:Interrupt Enable2(1のとき、ライトペンによる割り込みを可能にする)
IE1:Interrupt Enable1(1のとき、水平帰線による割り込みを可能にする)
M5:表示モードの設定に使用する
M4:表示モードの設定に使用する
M3:表示モードの設定に使用する
(IE2はMSXでは使用しません。常に「0」)
(R#1のM1、M2と、R#0のM3~M5が「00010」でグラフィックモード3(SCREEN4)となります。
モードレジスタ#1(R#1)
0 | BL | IE0 | M1 | M2 | 0 | SI | MAG |
BL:1=画面表示、0=画面非表示
IE0:Interrupt Enable0(1のとき、垂直帰線による割り込みを可能にする)
M1:表示モードの設定に使用する
M2:表示モードの設定に使用する
SI:スプライトのサイズ 1=16×16、0=8×8
MAG:スプライトの拡大 1=拡大する、0=拡大しない
スプライトアトリビュートテーブル(LOW)(R#5)
A14 | A13 | A12 | A11 | A10 | A9 | 1 | 1 |
(A9は必ず「1」に設定)
モードレジスタ#2(R#2)
MS | LP | TP | CB | VR | 0 | SPD | BW |
MS:1=マウスを使用する(カラーバスは入力モード)、0=マウスを使用しない(カラーバスは出力モード)
LP:1=ライトペンを使用する、0=ライトペンを使用しない
TP:カラーコード0の色をカラーパレットの色にする
CB:1=カラーバスを入力モードにする、0=カラーバスを出力モードにする
VR:VRAMの種類を選択する(1=64K×1bitまたは64K×4bit、0=16K×1bitまたは16K×4bit)
SPD:1=スプライト非表示、0=スプライト表示
BW:1=白黒32階調、0=カラー(Composit encoder にのみ有効)
(MS、LP、BWはMSXでは使用しません。常に「0」)
因みに「SPRITE EDITOR」はSPRITEモード2に対応しています。
BASICのサンプルプログラムです。
90行と100行でSPRITEモード2に設定できます。
2023年11月08日
Laboratoryテーマ26「SCREEN1.5を使いたい」
今回は、Laboratoryテーマ26「SCREEN1.5を使いたい」です。
MSXのSCREEN1は、8FONT毎に前景色と背景色で2色しか扱えないという、独特な仕様です。
しかし、SCREEN1はFONTがもの凄く扱いやすい…。
せめて、SCREEN2のように横8ドット毎2色扱えればなぁ…。
と、言う要望をかなえられるのがSCREEN1.5です。
やり方は簡単、「BIOS」の「SETGRP」(&H007E)を使って内部処理(VDP)だけをSCREEN2にします。
ラベル名 | アドレス | 変化するレジスタ | 使い方 |
SETGRP | &H007E | すべて | VDP のみを GRAPHIC2 モードにする |
因みに「FONT EDITOR」も、SCREEN1.5に対応しています。
BASICサンプルプログラムです。
80行のみで、SCREEN1.5にする事が出来ます。
では、次回はLaboratoryテーマ27「SCREEN1.5でSPRITEモード2を使いたい」です。
2023年11月07日
PVについて
2023年11月06日
「ゲーム制作」40回突破!
「ゲーム制作」も、ついに40回を迎えました。
まさかこんなに長丁場になるとは思ってもいませんでした…。
制作よりも不具合対応の方が時間がかかっている気がする。
EDITORのマウスが使えないから始まり、メモリ不足対応など…。
まだまだこれから「イベント発生」、「システムメニュー」、そして最大の難関「戦闘」が残っています。
本業が忙しく相変わらず開発速度は亀の歩みとなりますが、完成まで頑張るのでお付き合いください。
まぁ、MSXのプログラミングを思い出す第一作目として、題材にロールプレイングゲーム選択した時点で、間違いだったような…。
プログラミングの勘を取り戻すだけなら、サクッとアクションゲームでも作っておけばよかったんですよね。
なんでロールプレイングゲームにするかな?
でもまぁ、おかげで勘を取り戻すどころか、進化している気さえします。
昔は結構悩んだ気のするロジックも、なんだかサクサク組めている気がします。
しかも、以前にロールプレイングゲーム作ってた時は、スクリプトもここまで完成度の高い物じゃなかった気がします。
このスクリプトを使えば、アドベンチャーゲームと、ロールプレイングゲーム(命令の追加は必要ですが)は比較的簡単に制作できると思います。
これは、Windowsで制作していたツールで、色々鍛えられたおかげでもあります。
「努力は裏切らない」と言う言葉をなんか思い出しました。
2023年11月05日
【ゲーム制作】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」ファイルを作成します。
結構なデータ量散らばっています。
これ、戦闘部分になると格段に増えますので、このタイミングに思い立って良かった…。
システムメッセージデータを削除した領域と領域の間に残ったプログラムを可能な限り片寄し、大きな領域が確保できました。
結構な領域が空きました。
イベント発生判定ロジックくらいなら、この領域内で収まりそう。