CASIO pocket computer
PB-100の宇宙

タイニーRPG最終進化!!
トロネコの大冒険4
by PBロッキー

公開日 2003/06/08

プログラムリスト

P0
E=B:F=G*90:H=SIN F-COS F*9:I=SIN F*9+COS F:FOR J=0 TO 2:K=J*6-1
FOR L=1 TO 2:IF FRAC (1ₑ3*SQR (E+H*L<.5;K=K+L:L(J*ABS O)=2
NEXT L:E=B-H+I:I=-I:O(J)=K:NEXT J:PRINT
PRINT A;MID(P,1);MID(10-O,1);MID(Q,1);MID(G+1,1);R;CSR 3;
IF B≦13+D*43;C=362:D=7:PRINT "♥( Fin":GOTO #1
IF B+H=51+D*46;PRINT "□";:IF A=3;O=4:PRINT CSR 3;" ";
W=X+7:IF B=C+99;R=INT W*4:PRINT "'";
IF RAN#<.1 THEN 13
IF KEY="4";G=G-3+4*SGN (3-G:GOTO 1
10 IF KEY="6";G=G+3-4*SGN G:GOTO 1
11 IF KEY≠"5" THEN 9
12 B=B+H*SQR ABS O:IF O≠4 THEN 1
13 V=O+7+INT ABS (COS B*4:S=V*5:PRINT CSR 3;MID(V+9,1)
14 R(J)=R(J)-INT (RAN#*V(J):PRINT :PRINT R;S;:IF R<1 THEN #1
15 J=RAN#↑RAN#↑RAN#+FRAC π:IF KEY="0";IF J≧1 THEN 1
16 IF S>0 THEN 14
17 IF V(J)=A+9;A=A+1:PRINT "♦"
18 X=X+SQR V/W:GOTO 1
P1
A=0:B=C+99:$="↑←↓→ )○>・○ (○<syπΩS& @¥"

移動画面がもたつきますがバグではありません.なるべく高速な機種、PB-100等の(いわゆる)Ver.1 BASIC機でのプレイを推奨します.

PB-100 の初期出荷バージョンの一部で正しく動作しないケースがあります.その際はPB-100初期出荷バージョンの異常動作についてを参照してリストを変更してください.

技術情報

変数表

変数内容ノート
Aオーブの数0~3
B座標99~
C, D裏面用表面:C=0:D=0、裏面:C=362:D=7
E座標計算用
F向き計算用F=G*90
G向き0:, 1:, 2:, 3:
HG=0:9, G=1:1, G=2:-9, G=3:-1
I1行目の値、3行目では反転する.G=0:1, G=1:9, G=2:-1, G=3:-9
JFOR~NEXT、攻撃側またはオーブ獲得判定とウェイト

1~3行目では 0:前方を調査, 1:左と左前を調査, 2:右と右前を調査

14行と17行については行番号マップを参照.

K視界計算用
LFOR~NEXT
O視界前・前進処理用-1: , 0:, 1:, 4:白亜の扉の通過、ボス出現
P視界左5: , 6:), 7:, 8:>
Q視界右11: , 12:(, 13:, 14:<
Rトロネコの HP
S敵の HP
V敵の種類(強さ)6~14
Wトロネコの強さ
Xトロネコの経験値
M, N, U未使用(破壊)
T, Y, Z未使用

行番号マップ

行番号処理概要ノート
1視界計算準備
2~3視界計算L(J*ABS O)=2 について.IF J*O=0;L=2 から1ステップ減らしたもの.前方を調査(J=0)している場合はループを抜ける.1歩前が壁(O=0)の場合はループを抜ける.
3~4迷宮移動画面表示
5エンディング
6白亜の扉
7妖精さんによる HP 回復他
8敵の出現
9左を向く
10右を向く
11キー入力を待つ
12前進O=-1, O=1 のいずれかなら1歩前進.O=4 の場合、2歩前進.
12扉通過チェックO=4 の場合、ボス戦に入る.
13敵設定、敵キャラクタ表示出現する敵は座標と視界前(O)から求めている.O を絡めることで出現する敵をバラつかせ、ボスを出現させる.
14ダメージ計算、戦闘画面表示、ゲームオーバーJ<1:敵の攻撃, 1≦J:トロネコの攻撃
15攻撃側またはオーブ獲得判定、ウェイト、逃げる判定
16勝利判定
17オーブ入手J<1:他の条件が揃えばオーブを獲得, 1≦J:獲得しない
18経験値獲得
P1-1初期設定他

今作で解説すべきは1~3行の視界計算だけでしょう.

迷路データは数式から

まず、壁や通路の情報の入った迷路データの見当たらないないことに驚かれることでしょう.本作では数式から迷路を生成しています. これは昔の雑誌の PB-100 用投稿ゲームでは、しばしば見かけたテクニックです.

IF FRAC (1ₑ3*SQR (E+H*L<.5;K=K+L:L(J*ABS O)=2

2行目の FRAC(1000 × √座標) が0.5より小さければその座標は壁、0.5以上なら通路になります.

しかしこれだけで、迷路の形が決まるのではありません. 座標(B)は、X 方向に 1 歩進む時は +1 または -1、そして Y 方向には +9 または -9 しています.この Y 方向の値が変わることでも迷路の形が変わります.

1つの変数で2つのデータを扱う

X・Y 座標の2つの値を1つの変数で扱うのは、これもよく見かけたテクニックです.

その理由はマップは2次元ですがメモリの都合から1次元的にデータ化することが多く、それとの相性を考えてのことでしょう. 30文字まで入る $ はしばしば迷路データの格納に使われました.16進数を応用してデータを処理し、1フロアにつき最大 6×5 マスの迷路を PB-100 の中に出現させたのです.

本作では省メモリ以上に、広大で不定形な迷路をつくるのに一役かっているのですが、簡潔に説明するうまい言葉が見つかりません…

3歩進んで2歩下がる

F=G*90:H=SIN F-COS F*9:I=SIN F*9+COS F

1行目で求めている前(H)と左(I)のとる値は、 それぞれ -9,1,9,-1(H)、1,9,-1,-9(I)となります.

これは、トロネコの向き(F)から求めた前方と左方の値になります.(なんかこの辺り、うまい表現じゃありませんね...) 例えば、現在位置(B)に対して左斜め前の座標は B+H+I に、右隣は B-I に、 2マス前は B+2*H になります.

これだけわかれば2~3行や6行、12行の解析は容易でしょう.ちなみに前進は B=B+H でできますね.

コラム
ひとつの命令に複数の意味を込める

J=RAN#^RAN#^RAN#+FRAC π

ここでは、15行目の J=RAN#↑RAN#↑RAN#+FRAC π について解説します. この命令では、戦闘中の表示用ウェイトと敵もしくは自分の攻守の決定をしています.

まずウェイトについては、π↑π↑π を実行すると0.5秒程度のウェイトになることは、ポケコンジャーナル誌上でも紹介されています. BASIC でウェイトといえば FOR~NEXT が真っ先にあがりますが、こういった負荷の高い計算が有効なウェイトになる場合があります.

今作ではこの πRAN# に置き換えることで、さらに攻守を決する乱数の働きをさせています.


R(J)=R(J)-INT(RAN#*V(J))

ここで14行目のダメージ処理の R(J)=R(J)-INT(RAN#*V(J)) の変数をずらせば FRAC を外せるんじゃあ、と思われた方はさすが!であります. しかし今作では他の処理との絡みで FRAC を外せないわけがあります.

敵に遭遇し戦闘ルーチンに突入するとすぐに R(J)=R(J)-INT (RAN#*V(J)) が実行されます. このときに J の値が敵のターン(0≦J<1)または自分のターン(1≦J<2)のどちらでもないことを示す値(2≦J)でないと、どちらかが不当にダメージを負うことになってしまいます.

しかし :J=2 などとしていては4ステップを消費してしまいそれは可能な限り避けたいところです.

敵の出現時 HP をばらつかせるために、敵がダメージを負うぶんにはアリか?とも考えましたが、トロネコの攻撃力が上がるとどうしようもなくなる、と断念しました.

そこで今作では、移動画面表示時点で必ず一定の値をとる視界計算用のループの FOR J=0 TO 2NEXT J を利用することにしました. 視界表示の終了時点では常に J=3 になっているので、これを戦闘開始前のターン用変数の初期化と兼ねることができるのです. 戦闘が連続で発生することが無く必ず一度は視界表示を挟むのも、このようなことができた一因です.

ということで、J=3 で戦闘ルーチンに入ってくるので、14行目の FRAC を外すと具合が悪いことはお分かりいただけるでしょう.

敵のターン(3≦J<4)・自分のターン(4≦J<5)になってしまい戦闘突入の度に敵が攻撃してきます.


以上の例のように PB-100 作品では、リストの各部が入り組んだモザイクのように影響しあうことがしばしばです. PB-100 プログラミングがパズルのような魅力を持つと言われる所以でもあります.

ひとつの作品が誕生する過程では推敲を重ねる毎にダイナミックに各命令の位置と意図が変化していきます. その様はまるでソレ本来の姿に辿り着くべく胎動しているようでもあり、プログラマーはもはやそのエネルギーに惹きずられるに任せるほかないのです.

もはや末期です、ハイ.