ギャラクシーウォーズ

IchigoJam+PanCake用のギャラクシーウォーズです。

操作方法

プログラム1~3をSAVEした状態で、プログラム1をRUNしてください。 カーソルキーで左右に移動、スペースキーで発射/前進。 ミサイルを操作してUFOに当てます。 UFOの中心に当てると得点が2倍。連続して中心に当てると、さらに倍率が上がります。 50点で1機増えます。

動作環境

以下の環境で動作を確認しています。これより古い環境には対応していません。

IchigoJam 1.0.1
PanCake 0.9

ソース

3つに分かれています。できれば保存領域の1~3に番号通りに保存してください。 保存先の番号が連続してさえいればEEPROMの任意の場所でも大丈夫です。

プログラム1

1 'GW1B
10 CLV:Z=128:O=255:L=8:W=44:G=44
20 LC0,-1:VIDEO0:?CHR$(Z,4,5,1)
30 LET[26],#7B6F,#1249,#79CF,#73CF,#1F6D,#73E7,#7BE7,#124F,#7BEF,#13EF
40 LET[36],#18,#3C,#3C,#18,#3C,#24,#00,#00:?CHR$(Z,4,0,0)
41 LET[44],#00,#00,#00,#00,#00,#00,#18,#18
42 LET[52],#00,#18,#3C,#34,#18,#00,#00,#00:?CHR$(Z,14,3,36,16,15,#18,#3C,#3C,#18,#3C,#24,#00,0)
43 LET[60],#14,#AA,#55,#BA,#5D,#AA,#55,#28:?CHR$(Z,14,3,24,16,10,#FF,#F7,#E7,#C1,#E7,#F7,#FF,0)
44 LET[68],#00,#08,#10,#08,#10,#00,#00,#00:?CHR$(Z,14,3,48,16,10,#FF,#EF,#E7,#83,#E7,#EF,#FF,0)
45 LET[76],#00,#10,#08,#10,#08,#00,#00,#00:?CHR$(Z,14,3,36,28,10,#FF,#91,#B5,#91,#D7,#97,#FF,0)
46 LET[84],#42,#24,#18,#7E,#DB,#66,#00,#00:?CHR$(Z,12,11,0,0,1,254,80,84,87,84,O)
47 LET[92],#00,#66,#18,#7E,#DB,#66,#00,#00:forI=1to3:?CHR$(Z,7,11,I,0,0,O):next
50 [25]=50:R=2:V=2:forI=2to16step2:[I+1]=I*2:next:I=O
60 WAIT1:ifINKEY()=0andI I=I-1:GOTO60
61 LRUN FILE()+1,10
90 WAIT120:?CHR$(Z,4,5,0):CLS:VIDEO1
91 ?"SCORE=";S
92 ?"LEVEL=";N
99 END

プログラム2

1 END:'GW2B
10 ?CHR$(Z,4,0,0):M=6:N=N+1:Y=20:Q=N:GOSUB40
11 ?CHR$(Z,8,1,L+2,G,L+W+5,G,9):D=D+1:ifD>E*3 E=E+1:D=E:V=V+1
12 K=1+(W/E):J=3*(W/D-1):forA=20to22:I=RND(J):J=J-I:[A]=K+I:next:[A]=1
13 H=1:T=0:forI=0to9:[I*2]=0:next
20 Y=4:Q=S:GOSUB40:[2]=L:U=(8-M)/2:ifM%2=0 [2]=L+W:U=-U
30 [0]=L+W/2:[1]=G-6:F=-5
31 ifS>=[25] R=R+1:[25]=[25]*2:?CHR$(Z,10,11,1,1,18,96,80,96,O)
32 Y=35:Q=R:GOSUB40:WAIT20:?CHR$(Z,7,11,1,0,0,O)
34 LRUN FILE()+1,10
40 X=64
41 C=0:K=#7FFF:GOSUB45:C=1:K=[26+Q%10]:GOSUB45:Q=Q/10:ifQ X=X-4:GOTO41
42 RETURN
45 ?CHR$(Z,14,3,X,Y,C,K&7,(K>>3)&7,(K>>6)&7,(K>>9)&7,(K>>12)&7,0,0,0):RETURN
50 C=0
60 ?CHR$(Z,14,3,[Q],[Q+1],C);:forI=0to7:?CHR$([P+I]);:next:RETURN
70 Q=0:P=36:GOSUB50:Q=2:P=84+T:GOSUB50:ifABS([0]-[2])<2 H=H+1:C=5 else H=1:C=4
71 P=60:GOSUB60:forI=1toH:?CHR$(Z,10,11,1,1,16,64,80,96,O):WAIT15:S=S+N:next:GOSUB50
72 M=M-1:ifM GOTO20
73 WAIT80:GOTO10
80 Q=0:P=36:GOSUB50:P=60:C=2:GOSUB60:?CHR$(Z,11,11,1,1,80,78,62,46,30,O):WAIT60:GOSUB50
81 ifR R=R-1:GOTO30
90 LRUN FILE()-1,90

プログラム3

1 END:'GW3B
10 T=8-T:B=0
20 ifF<0 F=F+1:WAIT4:GOTO30
21 X=[0]:X=X-BTN(LEFT)*(X>L)+BTN(RIGHT)*(X<L+W):ifBTN(SPACE) F=2 elseifF F=1
22 Y=[1]:ifF=2orT Y=Y-F:ifY<0 Y=G-6:F=0
23 Q=0:P=36:C=15:GOSUB70+20*([0]=X)*([1]=Y)
24 ifF=2 P=44:C=3:GOSUB90:B=1
30 P=52:C=7
31 forQ=16to6step-2:X=[Q]:ifX=0 GOTO35
32 ifQ%4 X=X+D else X=X-E
33 ifX<LorX>=W+L [Q+2]=[Q]:X=0
34 Y=[Q+1]:GOSUB70
35 next
36 if[18] [6]=[18]:[18]=0
37 if[A] [A]=[A]-1:if[A]=0 [6]=L:A=A-1
40 X=L+([2]+U-L+W)%W:Y=[3]:Q=2:P=84+T:C=13:GOSUB70
41 if[1]<Y+6andABS([0]-X)<5 F=3
50 if[4] X=[4]:Y=[5] else Y=Y+2:I=ABS([0]-X):ifRND(I*M)>6 GOTO60
51 Y=Y+V:ifY>GorF<0 X=0
52 I=Y/4:ifI>2andABS([I*2]-X)<3 X=0
53 Q=4:P=68+T:C=10:GOSUB70
60 ?CHR$(Z,4,12,(F=2));:ifB Q=0:P=44:GOSUB80
61 ifF<3 GOTO10
62 I=FILE()-1:ifF=3 LRUN I,70
63 LRUN I,80
70 K=C:GOSUB80:C=K:[Q]=X:[Q+1]=Y:GOSUB90
71 ifQ>3 ifABS([0]-X)<3andABS([1]-Y)<5andF<3 F=4
72 RETURN
80 C=0
90 ifP>67 P=P^8
91 if[Q] ?CHR$(Z,14,3,[Q],[Q+1],C,[P],[P+1],[P+2],[P+3],[P+4],[P+5],[P+6],[P+7]);
92 RETURN

解説

3つのプログラムが互いにLRUNしながら動作するので、変数は全プログラムで共通です。ほぼすべての変数と配列を使っています。

変数

A 隕石出現テーブルのポインタ(19-22)
B ロケット噴射の有無
C 引数:色
D 隕石右向き速度
E 隕石左向き速度
F ミサイルの状態 <0:なし 0:未発射 1:遅 2:速 3:UFO撃墜 4:ミス
G 定数:44 (地面のY座標)
H 連続ヒット数
I ワーク
J ワーク
K ワーク
L 定数:8 (左端のX座標)
M 残りUFO数
N レベル
O 定数:255
P 引数:画像ポインタ(36-92)
Q 引数:座標ポインタ(0-16)または数値
R ミサイル残機
S スコア
T ループを回る度に0/8
U UFOの移動量
V UFOの弾の速度
W 定数:44 (メイン画面の幅)
X ワーク
Y ワーク
Z 定数:128

※ここでは便宜上、配列のインデックス値のことを「ポインタ」と呼んでいます。

配列

[0-1] ミサイルの座標
[2-3] UFOの座標
[4-5] UFOの弾の座標
[6-17] 隕石の座標x6
[18] 隕石の処理用ワーク領域
[19] 0で固定
[20-22] 隕石出現制御テーブル
[25] 1UP判定
[26-35] 数字フォント:0-9
[36-43] ビットマップ:ミサイル
[44-51] ビットマップ:ロケット噴射
[52-59] ビットマップ:隕石
[60-67] ビットマップ:爆発
[68-75] ビットマップ:UFOの弾 1
[76-83] ビットマップ:UFOの弾 2
[84-91] ビットマップ:UFO 1
[92-99] ビットマップ:UFO 2

※座標値は、連続した2個の配列要素を使って、X,Yの順番で表します。