ゲーム名を「たまねとりっぷ!(仮称)」と名付けた。何とか今年のコンテストに応募できるように形にしたい。
マップデータの作成について考える。
複数面を準備してクリアしていくゲームにはしないので、ゲームスタート時に1つだけマップを作る。
ランダム性を持ったマップを動的に生成するためのロジックと、仕組みを考えていく。
マップを作るために必要な条件を考えた。
- クリアするまでの床数
- 床から次の床までの間隔
- スコア加算のための旗を置く
大枠のルールとして、100フロア登り切ったらクリア。と設定。
100フロアといっても、床と床の間隔分も作らないといけない。この間隔を適切にしないと、ジャンプして登れなくなる。
ジャンプ力は、あるギミックをもとに可変させる予定なので、床と床の間隔も可変させないといけない。
あとは、スコアを加算するためのギミックで各フロアに旗を1本置く。
これらの条件を加味しつつ、マップを作っていくのだが、一番の問題は、配列の数。
マップを作るにあたって、まずはX×Yの数分、1次元配列を定義しなくてはならない。
床の間隔を固定すれば、計算できるが、今回は可変させるため、マップが出来上がるまでYの数が確定しない。しかも、上から順に作っていかないといけない。
そこで、HSP3の特徴的な文字列操作機能のnoteを使うことにした。
noteは、培養臼でもステージデータ管理で使ったが、ファイルを読み込むのではなくて、一時的なバッファして使う。
notesel命令でバッファにする変数を指定して、1フロア分の文字列を生成し、noteadd命令でどんどん足していく。
このときは、床から上に向かって足して作るので、マップの向きは逆に出来上がる。
マップ作りのベースが決まったので、次は床の間隔と旗の設置ロジックを考える。
床の間隔を決めるのは、ジャンプ力と重力の設定値。何チップ分のジャンプができるかを算出する。
es_gravity命令は便利な反面、最高到達点がすぐにわからない。重力の問題なので、物理の公式で求められるはず。
ただ、ゲーム内の疑似重力なので、実際の公式のままは適用できず、ごにょごにょっと適当計算式wで、ジャンプできるチップ数を算出。そのチップ数-1を、床から床の間隔になるようにした。
旗は、床を設定したら、その次の段に必ず置くため、床を設定したら、旗を作成するフラグを1に、旗を設置したらフラグを0にするという単純な考え方で行ける。そのとき、床が無いところに旗を立てることができないので、1つ前の床の状態を変数にバッファとして残して、乱数で旗の位置を決めたら、その下に床がないとやり直しするようにした。
あとは、作りたいフロア数分、do~whileループして、床、旗、空間→床、旗、空間→…を繰り返し行っていけばよいだろう。
が、床の作成でちょっと困った。最下層はすべて床になるのだが、それより上はすべて、どこかに空間の空いた、穴あきの床になる。
始めに考えたのは、20ブロック分を20ビット分に見立てて、0~$FFFFFまでの1つの数字を乱数で作成し、ビットごとに0と1に分解して床にするというもの。
この方法では、数字のばらつきが大きすぎることと、大きな値にならないと床がほとんどないので、左半分がスッカスカ、右半分がまばらな床になるという、高難易度なフロアマップができあがった…

そこで、左10ビット、右10ビットに分けて2つの乱数を発生させて結合する方法で、ある程度、床のあるマップになったw
いったんこれで進めることにした。

そうして作ったnoteをもとにして、map用の配列変数にチップNoをセットする。
mapの配列数は、X方向のチップ数×noteに登録した行数で定義できる。
あとはnoteを末尾の行から先頭までひっくり返して、map用の配列変数にセットしていけば、できあがり!
マップ作成のめどが立った。