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に移動の方向で進めます。
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で制作していたツールで、色々鍛えられたおかげでもあります。
「努力は裏切らない」と言う言葉をなんか思い出しました。