Making「ASALT」その4

Home PC-6001mkII Program etc

 このページでは、次Verの実装過程を書いています。

Making「ASALT」 Top


2009/08/某日:グレネード案
 mkII版の動画も公開して一段落がついた。(作る予定だった初代機版はまだなのだが)

 回転と拡大縮小については、ほぼ最初に思い描いたとおりになったが、やはりグレネードが実現できていなかったのが多少の心残りだ。

 とはいえ、回転/拡大縮小した画面にうまく合うようにグレネードの爆風の位置や大きさを計算するのはかなり骨が折れる。もしできたとしても極端に遅くなるかも知れない。こうして、なんとなくお蔵入りになろうとしていた。

 ある日ふと思った。こうすればいいのではないだろうか?

画面

 地形のデータに直接グレネードの爆風を書き込めば、グレネード用に回転/拡大縮小を考える必要がなくなるので、その分楽にできるのではないか?

 爆風の解像度がかなり荒くなる点は気になるところだが、試す価値はありそうだ。

2009/08/某日:処理方式検討
 グレネードの大まかな処理について考える。

 まず、グレネードの飛距離調整+発射をスペースキーで行う。スペースキーを押しっぱなしで飛距離調整(前方向のみ)、飛距離調整中にスペースキーを離せばグレネード発射にする。左右のカーソルキーを両方押す方が本物に近いのかも知れないが、そこは余裕ができてから考えよう。

 グレネードの状態を以下のように大まかに決める。
  1. 初期状態(自機移動可能)
  2. 飛距離選択中(自機移動不可)
  3. グレネード発射中(自機移動可能)
  4. グレネード爆発(自機移動可能)
 あともう一つ必要なものがある。グレネード位置にある地形データの退避処理だ。これがないと、グレネードを表示上消せなくなってしまう。

 おそらく作り始めると必要なものが増えるとは思うが、まずはこの辺りで作り始めてみよう。でもグレネードを実現するんだったら敵も欲しいな...。妄想は広がっていく。

2009/09/05:初代機版作成
 ここまで書いておいてなんだが、現状のmkII版をベースに初代機版を作成することにする。グレネードや敵表示が初代機のメモリに納まるのかを確かめたいからだ。

 mkII版から初代機版への移植は前回「回転」も行っているが、今回はもう少しだけ高度にする。前回は4色+黒表示だったのを8色+黒表示に拡張しよう。

 ここで初代機版セミグラフィックのデータ構造について少し説明する。

 1キャラクタ辺り、ドット色8色(黒は背景色固定なので除外)で3ビット、ドットデータが2×3ドットで6ビットで、最低9ビットの情報が必要となる。このため、1キャラクタ分を描くのに2バイト必要になる。

 この9ビット分の情報をアトリビュート部分とデータ部分の緑部分に記述するのだが、ここは本題ではないのでさらっと流しておく。ちなみに、4色の場合はデータ部の1バイトのみ変更すれば良いのでその分処理が楽になる。

アトリビュート部
bit7
bit6
bit5
bit4
任意
bit3
任意
bit2
任意
bit1
色1
bit0
任意
データ部
bit7
色2
bit6
色3
bit5
ドット1
bit4
ドット2
bit3
ドット3
bit2
ドット4
bit1
ドット5
bit0
ドット6

 1キャラクタが2バイトになるということは...1キャラクタを1バイトで表現していたmkII版の面データを倍にする必要がある。とはいえ、単純に倍にするとデータだけで32KBになってしまい、プログラムが1バイトも入らなくなる。

 幸い、今回の場合は右側の空白部分が大きいので、横幅を半分(256キャラクタ→128キャラクタ)にして対応する。まあこれでもデータだけで16KBと、使用可能なメモリの半分を使ってしまうのだが。

 という事で、mkII版の面データを初代機版の面データに変更するプログラムをHSPで作成し、データ変換を行う。

 マシン語部分は、表示部分は全面的に見直しを行ったが、移動処理や音の処理についてはmkII版のものをそのまま流用する。ちょこちょこと修正や微調整をして、最後にBASICプログラムの後ろにつなげる。

 出来上がったテープイメージを読み込ませて実行。ちゃんと動いた!

画面

 ただ、プログラムを動かすと空きメモリが約3KBになってしまう。これからエンハンスする分は果たしてメモリ内に収まるのだろうか?

2009/09/06:風呂敷広げ
 実現できるかどうかはわからないけど、ついでなので敵の移動についても考えてみよう。

 まず敵の表現方法だが、実行速度をなるべく落とさず、かつ手間がなるべく少ない方式を模索する。となれば、やはりこれしか考え付かない。グレネードと同様に個々の敵も地形の一部にするのだ。

 現状のマップから、敵とおぼしき数を数えてみる...ざっと50個強。止まっているものと数に数えずに多少目減りさせたとしても、40くらいは欲しいところか。
そう思ってはみたものの、40キャラクタを同時に動かすとかなり遅くなる事は目に見えている。

 どうするか。とりあえず一つの案としてあるのが時分割だ。幸い、本家ASSAULTでも敵の動きは遅いので、例えば4回に1回だけ動かすようにすれば、同時に移動する敵キャラは10個で済むので結構マシになるのではないだろうか。  できるようなできないような、微妙な具合だ。

2009/09/07:敵データ Ver.1
 敵出現の考えが出たところで、敵の制御用データの形式を考えることにする。

 大まかに何が必要かと列挙すると、以下のようになる。
  • X座標
  • Y座標
  • 種類
  • 状態
 初代機にも対応させることを念頭に置くと、これらのデータはできるだけ少なくしておきたいところではあるが、X座標とY座標はそれぞれ2バイトにする。小数点以下の値が必要なことと、移動処理を単純化するためだ。

 その代わり、敵の種類と状態は1バイトにまとめることにする。どちらも処理の分岐で使用するものなので、2つに分かれているより1つにまとまっていたほうがいいだろう...多分。

 種類/状態の値を決めるにあたり、必要な情報を整理する。まず敵の種類だが、とりあえず簡単に時期に向かって移動するタイプ(移動)と移動しないタイプ(固定)の2つにする。一応、それぞれ2種類の色違いという事にして4種類にしようか。

 敵の状態だが、本家ASSAULTを参考に以下のようにしてみる。
  • 未移動(自機を認識していない状態)
  • 通常
  • 破壊確定(グレネードが当って爆発する前の状態)
  • 爆発中(爆発の時間分状態を用意する)
  • 破壊後

 これらの情報を元に、以下のように値を割り振ってみる。
内容
00H移動敵1 通常
01H移動敵1 破壊確定
02H移動敵2 通常
03H移動敵2 破壊確定
04H移動敵1 未移動
05H移動敵2 未移動
06H固定敵1 通常
07H固定敵1 破壊確定
08H固定敵2 通常
09H固定敵2 破壊確定
0AH-0DH共通 爆発中
0EH共通 破壊後

 荒削りではあるが、これで最低限の処理は書けると思う。これで少し処理を書いてみるか。

2009/09/1x:頓挫
 これまで考えた情報を元に、グレネードと敵移動の処理を行うマシン語を個々に作成する。

 一応mkIIの他に初代機でも動作させる事を念頭に置いてはいるが、初代機ではメモリ内に収まるか否か微妙な状況だ。多分どこか空き領域を確保する羽目になるのだろう。

 と、ここで問題が発生する。どうも今の仕様だと、頭で思い浮かべても面白くないのだ。具体的にどこが面白くなさそうなのかはよくわからないが、このまま進めるのにためらいがある。

 さて、どうしたものか...。

2009/12/30:再開
 頓挫したまま、あれよあれよという間に時が過ぎてしまった...。

 しかし、ここで、再開のきっかけになる小さな出来事があった。ニコ動の「攻撃は?」というコメントだ。そうだよねやっぱり欲しいよね。ただ、このまま進めても余り面白くなる気がしないという所は変わらない。とすれば次に取るべき手段、それは手戻りだ。

 おそらく面白くなりそうにない理由は、敵が単調すぎることだろう。あまり複雑な動作はできないにせよ、動き方や移動速度をある程度変更可能にするだけでも、もう少し良くなる気がする。

 かくして、年の瀬に帰郷の新幹線の中でイメージを作り上げていく。とりあえず名前はこれ以外にないだろう。「ASALT PLUS」。

2010/01/04:敵データ Ver.2
 帰省帰りの新幹線で、敵データについて考える。

 前のVer.1レベルのマシン語も机上で途中まで考えていたが、ここでソースを晒してまた作り直す事にする。

 前回考えたものより強化したいのは、柔軟性だ。例えば以下のような事ができるようにしたい。
  • 敵の速度を変えられるようにする
  • 敵の種類を増やせるようにする
  • 敵の耐久力を付けられるようにする
 という事で、以下のように敵1つあたり8バイトのデータ形式にしてみる。
#説明値範囲備考
1 移動速度 00H:停止
01H〜FEH:移動速度
FFH:初回のみ(初期値)
移動速度は多いほど速い
2 移動カウンタ 00H〜FFH
初期値;01H
移動速度を加算し、
桁あふれしたら移動。
3 敵種類+状態 00H〜FFH 上位3ビットは状態、
下位5ビットは敵種類
4, 5 敵X座標 0000H〜FFFFH 上位8ビットは整数部
下位8ビットは小数部
6, 7 敵Y座標 0000H〜3FFFH 上位8ビットは整数部
下位8ビットは小数部
8 移動方向 00H〜1FH 32方向
自機の方向データと対応させる

 あとは、肝心の敵種類だが、今の所アイディアを列挙するに留める。処理速度の限界もあるし、最終的にどこまで実現できるかは未知数だ。
  • 自機にゆっくり近づく。壁や他の敵に当ると足止め。耐久力もつける?
  • 自機方向に一直線で動く。壁や他の敵に当るとまた自機方向に向きを変え一直線。
  • ランダム方向に一直線で動く。壁や他の敵に当るとまたランダム方向に向きを変え一直線。
  • 停止し、一定時間おきに自機に向けて弾を撃つ。耐久力もつける?
  • 停止し、一定時間おきに決まった方向に高速弾を撃つ。耐久力もつける?
  • 弾1:何かに当るまで一直線に動きそのまま消える。
  • 弾2:弾1でさらに一定距離でも消える。


その3 Making「ASALT」 その5