GUST NOTCH? DIARY

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

その4からの続きです。

  • 短距離センサの出力


4120 FOR I=S1-1 TO S1+1
4130 FOR J=S2-1 TO S2+1
4140 IF I<1 OR I>8 OR J<1 OR J>8 THEN 4200
4150 A$=">!<"
4160 Z1=I
4170 Z2=J
4180 GOSUB 5680
4190 IF Z3=1 THEN 4240
4200 NEXT J
4210 NEXT I
4220 D0=0
4230 GOTO 4310
4240 D0=1
4250 C$="DOCKED"
4260 E=3000
4270 P=10
4280 PRINT "SHIELDS DROPPED FOR DOCKING PURPOSES"
4290 S=0
4300 GOTO 4380
4310 IF K3>0 THEN 4350
4320 IF E= 0 THEN 4430
4390 PRINT
4400 PRINT "*** SHORT RANGE SENSORS ARE OUT ***"
4410 PRINT
4420 GOTO 4530
4430 PRINT USING 4540
4440 PRINT USING 4550;Q$[1,3],Q$[4,6],Q$[7,9],Q$[10,12],Q$[13,15],Q$[16,18],Q$[19,21],Q$[22,24]
4450 PRINT USING 4560;Q$[25,27],Q$[28,30],Q$[31,33],Q$[34,36],Q$[37,39],Q$[40,42],Q$[43,45],Q$[46,48],T
4460 PRINT USING 4570;Q$[49,51],Q$[52,54],Q$[55,57],Q$[58,60],Q$[61,63],Q$[64,66],Q$[67,69],Q$[70,72],C$
4470 PRINT USING 4580;R$[1,3],R$[4,6],R$[7,9],R$[10,12],R$[13,15],R$[16,18],R$[19,21],R$[22,24],Q1,Q2
4480 PRINT USING 4590;R$[25,27],R$[28,30],R$[31,33],R$[34,36],R$[37,39],R$[40,42],R$[43,45],R$[46,48],S1,S2
4490 PRINT USING 4600;R$[49,51],R$[52,54],R$[55,57],R$[58,60],R$[61,63],R$[64,66],R$[67,69],R$[70,72],E
4500 PRINT USING 4610;S$[1,3],S$[4,6],S$[7,9],S$[10,12],S$[13,15],S$[16,18],S$[19,21],S$[22,24],P
4510 PRINT USING 4620;S$[25,27],S$[28,30],S$[31,33],S$[34,36],S$[37,39],S$[40,42],S$[43,45],S$[46,48],S
4520 PRINT USING 4540
4530 RETURN
4540 IMAGE "---------------------------------"
4550 IMAGE 8(X,3A)
4560 IMAGE 8(X,3A),8X,"STARDATE",8X,5D
4570 IMAGE 8(X,3A),8X,"CONDITION",8X,6A
4580 IMAGE 8(X,3A),8X,"QUADRANT",9X,D,",",D
4590 IMAGE 8(X,3A),8X,"SECTOR",11X,D,",",D
4600 IMAGE 8(X,3A),8X,"ENERGY",9X,6D
4610 IMAGE 8(X,3A),8X,"PHOTON TORPEDOES",3D
4620 IMAGE 8(X,3A),8X,"SHIELDS",8X,6D

まず、4370行までのところで現在の宇宙域の状態を求めます。具体的には

  • 基地に停泊中かどうか
    • 停泊中ならばエネルギーと魚雷を満タンにして、ステータスを「DOCKED」に
  • 停泊中ではない場合
    • クリンゴンがいれば、ステータスを「RED」に
    • クリンゴンがいない場合
      • エネルギーが少なくなっていれば、ステータスを「YELLOW」に
      • それ以外の通常の場合は「GREEN」に

となります。

4120行から4210行のループで、宇宙域内でのエンタープライズの周囲に基地があるかを確認しています。4140行で、注目座標が8x8の範囲外になっている場合はNEXTまで飛んですぐに次の座標の確認に移ります。4150行から4170行で、基地を表す文字列と座標を設定し、4180行で5680行からの文字列比較ルーチンを呼びます。もし基地があれば Z3 が1になるので4240行にとびます。

4240行で D0 を停泊中を示す 1 にします。状態を表す文字列 C$ を "DOCKED" にして、エネルギー E を満タンの3000に、魚雷の数 P も満タンの10 にします。停泊中はシールドを下げる必要があることになっているので、S を0 にします。そして、短距離センサの状態チェックへ飛びます。

周りに基地がない場合は、ループを抜けてそのまま4220行にきます。D0を0にして、宇宙域の状態を確認するために 4310行に飛びます。

4310行から4370行は状態チェックです。
4310行でクリンゴンの有無を確認します。クリンゴンがいる場合は4350行で状態を「RED」にして、4380行に飛びます。
クリンゴンがいない場合はエネルギーの残量を確認します。4320行で、E

    • D[1]: ワープエンジン
    • D[2]: 短距離センサ
    • D[3]: 長距離センサ
    • D[4]: フェーザ
    • D[5]: 光子魚雷
    • D[6]: シールド制御
    • D[7]: ダメージコントロール
    • D[8]: コンピュータ

短距離センサが壊れている場合、壊れていることを示して4530行のRETURNまで飛びます。

短距離センサが壊れていない場合は、4430行からの表示を行います。HP BASICは、PRINT文で書式指定ができるようで、その書式の定義が4540行から4620行に記述されています。
具体的に 4450行の命令を見てみましょう。これは2行目の表示です。4560行の書式を使用して、宇宙域の2行目の状態と宇宙暦を表示します。
4560行の書式は、推測ですが、"X" が空白文字を意味していて、"8(X,3A)"は、「スペースと文字列3文字が8回」という意味だと思われます。その後、スペース8つ、"SATARDATE"の文字列、スペース8つ、と続いて、最後の "5D" は「整数を5桁で表示」だと思います。4570行ででてくる"6A"は、「文字列を6文字分」だと思われます。

具体的な表示結果を示してみると、こんな感じになるはずです。

                                                                • -


* STARDATE 2340
* * CONDITION RED
+++ QUADRANT 3,7
<*> * SECTOR 5,4
ENERGY 3000
* PHOTON TORPEDOES 10
+++ SHIELDS 0

                                                                • -

プチコンでは書式指定はありませんが、要は一行ずつこのような表示ができればいいわけです。こんな感じで実現できます。


DIM LABELS$(8)
LABELS$(0)=""
LABELS$(1)="STARDATE "
LABELS$(2)="CONDITION "
LABELS$(3)="QUADRANT "
LABELS$(4)="SECTOR "
LABELS$(5)="ENERGY "
LABELS$(6)="PHOTON TORPEDOES "
LABELS$(7)="SHIELDS "
〜〜〜
〜〜〜
@P_SRS
PRINT "---------------------------------"
FOR I=0 TO 7
FOR J=0 TO 7
PRINT " ";Q$(I,J);
NEXT
PRINT " ";LABELS$(I);
IF I==0 THEN PRINT
IF I==1 THEN PRINT T
IF I==2 THEN PRINT C$
IF I==3 THEN PRINT Q1;",";Q2
IF I==4 THEN PRINT S1;",";S2
IF I==5 THEN PRINT E
IF I==6 THEN PRINT P
IF I==7 THEN PRINT S
NEXT
PRINT "---------------------------------"

次回はメインループとワープコマンドです。
その6へ続きます。