まず、sf(n) という変数はフラグであるという点。
これは 1 であれば弾が出ているとき、0 は弾が出ていないを表す。
SHOT_NUM は弾の数(定数)。これは変数ではありません。
repeat SHOT_NUM
if sf(cnt)=0 { sf(cnt)=1: sx(cnt)=x+3: sy(cnt)=y: break }
loop
ここは、sf(cnt)=0 (弾がでていない)ならば、弾の初期化をして弾のフラグsf(cnt)を1にする
x+3 の +3 は自機と弾の表示パターンの調整のためです。+3 を色々変えてみればわかります。
sy(cnt)=y は自機のy座標を発射ポイントとして指定しています。
弾はひとつ処理したら抜けなければいけないので、break でループを抜けます。
ようするに、これは sf(0〜4) の配列変数の空きがあれば発射する、という処理になります。
各命令の上にカーソルを合わせて F1キーで説明がでますから、読んでみてください。
弾の移動を決めているのは下記の部分です。sy(cnt)-=12 が速度。
// ショットの動き
repeat SHOT_NUM
if sf(cnt) { sy(cnt)-=12: if sy(cnt)<0 { sf(cnt)=0 }}
loop