GUST NOTCH? DIARY

スタートレックのソースを読む その9

その8からの続きです。

  • 光子魚雷


2800 IF D[5] >= 0 THEN 2830
2810 PRINT "PHOTON TUBES ARE NOT OPERATIONAL"
2820 GOTO 1270
2830 IF P>0 THEN 2860
2840 PRINT "ALL PHOTON TORPEDOES EXPENDED"
2850 GOTO 1270
2860 PRINT "TORPEDO COURSE (1-9):";
2870 INPUT C1
2880 IF C1=0 THEN 1270
2890 IF C1<1 OR C1 >= 9 THEN 2860
2895 C2=INT(C1)
2900 X1=C[C2,1]+(C[C2+1,1]-C[C2,1])*(C1-C2)
2910 X2=C[C2,2]+(C[C2+1,2]-C[C2,2])*(C1-C2)
2920 X=S1
2930 Y=S2
2940 P=P-1
2950 PRINT "TORPEDO TRACK:"
2960 X=X+X1
2970 Y=Y+X2
2980 IF X<.5 OR X >= 8.5 OR Y<.5 OR Y >= 8.5 THEN 3420
2990 PRINT USING 3000;X,Y
3000 IMAGE 15X,D,",",D
3010 A$=" "
3020 Z1=X
3030 Z2=Y
3040 GOSUB 5680
3050 IF Z3=0 THEN 3070
3060 GOTO 2960
3070 A$="+++"
3080 Z1=X
3090 Z2=Y
3100 GOSUB 5680
3110 IF Z3=0 THEN 3220
3120 PRINT "*** KLINGON DESTROYED ***"
3130 K3=K3-1
3140 K9=K9-1
3150 IF K9 <= 0 THEN 4040
3160 FOR I=1 TO 3
3170 IF INT(X+.5) <> K[I,1] THEN 3190
3180 IF INT(Y+.5)=K[I,2] THEN 3200
3190 NEXT I
3200 K[I,3]=0
3210 GOTO 3360
3220 A$=" * "
3230 Z1=X
3240 Z2=Y
3250 GOSUB 5680
3260 IF Z3=0 THEN 3290
3270 PRINT "YOU CAN'T DESTROY STARS SILLY"
3280 GOTO 3420
3290 A$=">!<"
3300 Z1=X
3310 Z2=Y
3320 GOSUB 5680
3330 IF Z3=0 THEN 2960
3340 PRINT "*** STAR BASE DESTROYED *** .......CONGRATULATIONS"
3350 B3=B3-1
3360 A$=" "
3370 Z1=INT(X+.5)
3380 Z2=INT(Y+.5)
3390 GOSUB 5510
3400 G[Q1,Q2]=K3*100+B3*10+S3
3410 GOTO 3430
3420 PRINT "TORPEDO MISSED"
3430 GOSUB 3790
3440 IF E<0 THEN 4000
3450 GOTO 1270

まず、最初に光子魚雷が故障していないかを確認します。(2800行)
故障中の場合は、メッセージを出して、コマンド入力待ちに戻ります。

次に、魚雷の残量を確認します。(2830行)
魚雷が残っていない場合は、メッセージを出して、コマンド入力待ちに戻ります。

魚雷が利用可能な場合は、コースの入力です。C1 でコースの値を受け取ります。
コースはワープと同じく1から9の値で指定されます。
0が入力された場合は魚雷発射がキャンセルとなり、コマンド入力待ちに戻ります。(2880行)
コースの値が範囲外の場合は、再度コースの入力に戻ります。(2890行)

ここからはワープの時と同じような処理が続きます。
C1の整数部をC2にします。(2895行)
単位あたりのX軸方向、Y軸方向の移動量を求めます。(2900行、2910行)
変数 X, Y に、エンタープライズの現在位置を保存します。これは魚雷の初期位置です。(2920行、2930行)
魚雷の数を減らします。(2940行)

次の2950行からが魚雷の弾道軌跡の表示です。
2960行から3060行を宇宙域の外にでるか、何かにあたるかするまで繰り返します。何かがあった場合は、ループを抜けて3070行に飛びます。

まず、魚雷が命中したものがクリンゴンであるかを調べます。(2070行から3110行)
クリンゴンでない場合は、4040行の星であるかの比較に飛びます。
クリンゴンである場合は、宇宙域内のクリンゴンの数と、銀河系内のクリンゴンの数を減らします。(3130行、3140行)
クリンゴンが全滅の場合は任務終了でゲームオーバーです。(3150行)
まだ、クリンゴンが残っている場合は、今撃墜したクリンゴンが、宇宙域中のどのクリンゴンであるかを特定し(3160行から3190行)、そのクリンゴンのエネルギーを0にして(3200行)、その座標を空白にする処理に飛びます(3210行)。

次に星に命中したのかを調べます。3220行から3280行です。
星でもない場合は3290行からの基地との比較に飛びます。
星の場合は3270行のメッセージを出して、3420行に飛びます。これからわかるように、星は魚雷では壊れません。後の移植版では魚雷で星を破壊できるものがありますが、それの方が良いと思います。なぜなら、エンタープライズが星に囲まれる状況が発生する可能性は0ではなく、その場合に身動きが取れなくなり、それへの対処方法がないからです。

最後に基地に命中したのかを調べます。3290行から3350行です。
同様の処理で命中した場合は宇宙域内の基地の数を減らします。(3350行)
ここで、銀河系内の基地数B9も減らすべきです。ステータスレポートで表示される基地数はB9を使っているので、整合性がとれなくなってしまいます。また、全部なくなってしまった場合はメッセージをだすなり、終了時の評価を下げるのに使うなりしたほうがいいのではないかと思ったりします。

撃墜したのがクリンゴンか基地の場合は、その座標の情報を空白にします。(3360行から3390行)

3400行で、銀河系の情報も更新します。

魚雷を発射すると、クリンゴンからの攻撃があります。ワープの時に説明したのと同じ処理です。(3430行)
つまり、3つのクリンゴンがいた場合、魚雷だけで攻撃しようとすると少なくとも2回、クリンゴンからの攻撃ターンがあるわけです。攻撃自体は3回行われることになります。
攻撃によるエネルギー損失と、フェーザによる一括攻撃をとるかが、駆け引きになります。

エネルギーの残量を確認して、なくなっていたらゲームオーバーです。(3440行)
そうでない場合は、コマンド入力待ちに戻ります。(3450行)

次はシールド制御です。
その10に続きます。