更新確認

HSPTVブラウザで、Temples Trick がVer1.12に更新されない環境があるようです。
OSやHSPのバージョンとの関係は不明だけど、うちの環境だと、主力開発機がVer1.05のまま。
予備機は説明がVer1.05で、動作バージョンが1.12。HSPを入れなおしてみたけど改善せず。


まあ、気を取り直して今回はマップ情報の持ち方について解説。
例によって1次元配列を使っています。
2次元で考えると横15、縦11。プレイフィールドは9x9ですが、画面がすべてマップ配下として覆われるサイズにしています。


マップ情報は2種。便宜上、グランドマップとフィールドマップと呼ぶことにします。
グランドマップは壁と床(空き、魔法陣)の情報を持ちます。ステージデータから展開される固定情報で、赤魔石が魔法陣の上にあるかどうかのチェックに使います。
初期化時は、まずマップ配列全体を-1(&HFFFFFFFF)で埋めて、9x9のプレイフィールドに対応する要素についてステージデータを展開し、魔法陣があれば1、なければ0としています。
フィールドマップはその場所にある障害物(壁、魔石)のオブジェクトIDを格納します。こちらはフレームごとに更新します。
壁の位置は固定ですが、これもフィールドマップに書き写すことで、移動可能な場所かはフィールドマップだけでチェックできます。
ちなみに、グランドマップ→フィールドマップの転記は、以下のようなコードで床描画をするタイミングに行っています。

	lpoke pcnt ; 魔法陣個数クリア
	c1=128:gosub *vardupc1 ; Workエリア準備  ここのc1は床面彩度初期値とワーク用オブジェクトIDを兼用
	repeat EMAPNUM
		e1p=cnt,1:gosub *posclc; 座標計算、Pos設定、マップ値参照のdup対応を行う。
		if(emapg){color 200,200}else{ hsvcolor 92>>(hlcx&1),c1,200} ; 床色決定
		c1^64 ; チェック模様のため床面彩度変更
		grect egx,egy; 床面描画
		celput ,emapg+1	;オブジェクト描画(魔法陣、壁)
		pcnt+(emapg=1)	;魔法陣の個数をカウントする
		emapf=emapg&128	;フィールドマップへ壁情報を反映(空きID=0、壁ID=128に変換)
	loop

冒頭で呼び出しているサブルーチンvardupc1は、c1で指定されたオブジェクトについて、オブジェクトテーブル配列をe1p等の変数にDup処理し、テーブルを操作しやすくする処理。
後で位置計算するサブルーチンposclcを使うために、オブジェクトID128をワークエリアとして準備しています。
EMAPNUMはマップ配列の要素数で、Repeat中のcntはマップ上の位置を指定します。
オブジェクト情報に指定位置と移動カウント1を入れてサブルーチンposclcを呼ぶと、対応するグランドマップ、フィールドマップの要素をそれぞれ emapg、emapf にDupし、egx,egyに画面上の描画座標(pos済)を格納するようになっています。
床色は、壁か魔法陣(emapgが0ではない)なら黄色、空きなら水色をベースにチェック模様とスタン時の効果を付加。
床色の彩度パラメータc1は、1マスごとに128と192が交互に使用され、1段が奇数マスなのでチェック模様になります。
前もってgmode 2,48,48と指定したサイズでgrect。
その上に、あらかじめbuffer 1に用意した壁(Cell#1)と魔法陣の六芒星(Cell#2)の画像をcelputでかぶせます。
グランドマップでは壁は-1、魔法陣は1なので、Cell#の指定はマップ値を⁺1するだけ。
描画は画面全体にわたり、プレイエリア以外すべて壁(煉瓦色)で覆われます。フレームごとの画面クリアは不要です。
空き床についても描画処理されますが、Cell#1に用意されているのは透明色だけの画像であるため床色のまま。
最後にフィールドマップへの変換。
グランドマップの値を128でANDすることで、移動可能な場所(魔法陣と空き床)は0、壁のみID128として転記をしています。