風呂STG

風呂につかって考えた。
本来ノベルゲーム目的に作られたNScripterがCPU占有率100%なんてことをすることはない。それは異常な事態なんだ。ならば、本来の動作を思い出させてやればいい。
ノベル系の、実害のない命令をはさんでやれば……と思って風呂を出ると、http://d.hatena.ne.jp/eiji8pou/20051016/1129471721#c1129559501で而さんから同様のアドバイスが。しこうさんと読むのかな? ありがとうございます。

追加要素

  • 移動する方向に弾が飛ぶようにした。
  • 敵はやられると爆発に変わる。爆発「*」は一定時間画面残り、そこに敵がつっこむとさらに誘爆する。
  • 数字は上から「自分の弾で倒した敵数」「誘爆で倒した敵数」「出現した敵数」「倒した敵合計/出現敵数のパーセンテージ」
  • 敵が弾をうつようになった。現時点で敵の弾を排除する方法はない。
  • くらい判定を作った。命は一機だけ。

スクリプト

 *define
numalias hp,100 ; その存在のHP。0以下になると爆発する。
numalias x,101 ; その存在の位置
numalias y,102
numalias dx,103 ; その存在のx方向移動量
numalias dy,104
numalias sp,105 ; その存在のスプライト種類
numalias mv,106 ; その存在の動き方
numalias ct,107 ; その存在で汎用的に使うカウンタ
numalias on,108 ; その存在が使われているかどうかのフラグ
numalias rd,109 ; 角度とか

numalias score,190
numalias score2,191
numalias enemy,192

for %0=100 to 109
	dim ?%0[201]
next

defsub abs
game
 *start
saveoff
; グラフィックの設定
lsph 0,":s/32,32,0;#0000FF▲",0,0
lsph 1,":s/32,32,0;#FF0000■",0,0
lsph 2,":s/32,32,0;#FFFFFF△",0,0
lsph 3,":s/64,64,0;#FFFFFF*",0,0
lsph 4,":s/32,32,0;#FF0000・",0,0
lsph 5,":s/32,32,0;#FFFFFF●",0,0
lsph 6,":s/32,32,0;#FFFFFF▽",0,0
for %0=100 to 109
	for %1=0 to 201
		mov ?%0[%1],0
	next
next
mov %5,1

; 自分の設定
mov ?x[0],320
mov ?y[0],320
mov ?on[0],1
mov ?sp[0],0
mov ?hp[0],100

mov ?mv[201],3

 *main
resettimer
 *main_my
; 自分の位置を決定
getmousepos %0,%1
mov ?dx[0],%0-?x[0]
mov ?dy[0],%1-?y[0]
mov ?x[0],?x[0]+?dx[0]/5
mov ?y[0],?y[0]+?dy[0]/5
if ?x[0]<0 mov ?x[0],0
if ?x[0]>639 mov ?x[0],639
if ?y[0]<0 mov ?y[0],0
if ?y[0]>479 mov ?y[0],479
; 射撃中かどうか決定
isdown %0
if %0=0 goto *main_brid_move
mov %50,1 ; 弾番号
 *main_brid
inc %50
if %50>51 goto *main_brid_move
if ?on[%50]=1 goto *main_brid
mov ?on[%50],1
mov ?hp[%50],1
mov ?x[%50],?x[0]
mov ?y[%50],?y[0]
mov ?sp[%50],1
mov ?dx[%50],?dx[0]
mov ?dy[%50],?dy[0]
if ?dx[0]=0 && ?dy[0]=0 mov ?dy[%50],0-32
; 弾の移動
 *main_brid_move
for %50=2 to 51
if ?on[%50]=0 goto *main_brid_move_next
mov ?x[%50],?x[%50]+?dx[%50]
mov ?y[%50],?y[%50]+?dy[%50]
if ?x[%50]<0 mov ?on[%50],0
if ?x[%50]>639 mov ?on[%50],0
if ?y[%50]<0 mov ?on[%50],0
if ?y[%50]>479 mov ?on[%50],0
 *main_brid_move_next
next

 *main_enemy
; 敵の発生
for %50=52 to 101
if ?on[%50]=1 goto *main_enemy_next
rnd2 %0,1,100
if %0>1 goto *main_enemy_next
inc %enemy
mov ?on[%50],1
rnd2 %0,1,10
mov ?mv[%50],%0
mov ?dx[%50],0
mov ?dy[%50],0
mov ?rd[%50],0
mov ?sp[%50],2
if %0=1 rnd2 %1,0,319:mov ?x[%50],%1:mov ?y[%50],0:mov ?ct[%50],0
if %0=2 rnd2 %1,320,639:mov ?x[%50],%1:mov ?y[%50],0:mov ?ct[%50],0:mov ?sp[%50],6
if %0=3 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],0:rnd2 %1,1,10:mov ?dy[%50],%1:mov ?rd[%50],180
if %0=4 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],479:rnd2 %1,-10,-1:mov ?dy[%50],%1:mov ?rd[%50],0
if %0=5 rnd2 %1,0,479:mov ?x[%50],0:mov ?y[%50],%1:rnd2 %1,1,10:mov ?dx[%50],%1:mov ?rd[%50],270
if %0=6 rnd2 %1,0,479:mov ?x[%50],639:mov ?y[%50],%1:rnd2 %1,-10,-1:mov ?dx[%50],%1:mov ?rd[%50],90
if %0=7 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],0:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5
if %0=8 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],479:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5
if %0=9 rnd2 %1,0,479:mov ?x[%50],0:mov ?y[%50],%1:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5
if %0=10 rnd2 %1,0,479:mov ?x[%50],639:mov ?y[%50],%1:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5
 *main_enemy_next
next
; 敵の移動
 *main_enemy_move
for %50=52 to 101
if ?on[%50]=0 goto *main_enemy_move_next
if ?mv[%50]>2 goto *main_enemy_move_next2
mov ?rd[%50],180
if ?ct[%50]<50 mov ?dx[%50],0:mov ?dy[%50],4:goto *main_enemy_move2
if ?ct[%50]<130 mov ?dx[%50],4:mov ?dy[%50],0:mov ?rd[%50],270:goto *main_enemy_move2
if ?ct[%50]<180 mov ?dx[%50],0:mov ?dy[%50],4:goto *main_enemy_move2
mov ?dx[%50],0-4:mov ?dy[%50],0:mov ?rd[%50],90
 *main_enemy_move2
if ?mv[%50]=2 mov ?dx[%50],?dx[%50]*(0-1):mov ?rd[%50],?rd[%50]+180
mov ?ct[%50],?ct[%50]+1:if ?ct[%50]>259 mov ?ct[%50],0
 *main_enemy_move_next2
mov ?x[%50],?x[%50]+?dx[%50]:mov ?y[%50],?y[%50]+?dy[%50]
if ?x[%50]<0 mov?on[%50],0
if ?x[%50]>639 mov?on[%50],0
if ?y[%50]<0 mov?on[%50],0
if ?y[%50]>479 mov?on[%50],0
 *main_enemy_move_next
next
; 敵弾の発生
for %50 = 52 to 101
if ?on[%50]=0 goto *main_enemy_brid_next
rnd2 %0,0,1000
if %0>1 goto *main_enemy_brid_next
mov %51,101
 *main_enemy_brid_next2
inc %51
if %51>151 goto *main_enemy_brid_next
if ?on[%51]=1 goto *main_enemy_brid_next2
mov ?on[%51],1
mov ?sp[%51],4
mov ?x[%51],?x[%50]
mov ?y[%51],?y[%50]
rnd2 %0,40,60
mov ?dx[%51],(?x[0]-?x[%51])/%0
mov ?dy[%51],(?y[0]-?y[%51])/%0
 *main_enemy_brid_next
next
; 敵弾の移動
 *main_enemybrid_move
for %50=102 to 151
if ?on[%50]=0 goto *main_enemybrid_move_next
mov ?x[%50],?x[%50]+?dx[%50]:mov ?y[%50],?y[%50]+?dy[%50]
if ?x[%50]<0 mov?on[%50],0
if ?x[%50]>639 mov?on[%50],0
if ?y[%50]<0 mov?on[%50],0
if ?y[%50]>479 mov?on[%50],0
 *main_enemybrid_move_next
next

; 爆発の移動と消滅
for %50=152 to 201
	if ?on[%50]=0 goto *main_bomb
	if ?ct[%50]<0 mov ?on[%50],0
	mov ?x[%50],?x[%50]+?dx[%50]
	mov ?y[%50],?y[%50]+?dy[%50]
	mov ?ct[%50],?ct[%50]-1
 *main_bomb
next

; 自分の弾と敵の接触判定
 *main_brid_enemy
for %50=2 to 51
if ?on[%50]=0 goto *main_brid_enemy_1
	for %51 = 52 to 101
	if ?on[%51]=0 goto *main_brid_enemy_2
		abs %0,?x[%50]-?x[%51]
		if %0>32 goto *main_brid_enemy_2
		abs %0,?y[%50]-?y[%51]
		if %0>32 goto *main_brid_enemy_2
		mov ?on[%50],0
		mov ?on[%51],0
		mov ?on[%51+100],1
		mov ?x[%51+100],?x[%51]
		mov ?y[%51+100],?y[%51]
		mov ?dx[%51+100],?dx[%51]
		mov ?dy[%51+100],?dy[%51]
		mov ?sp[%51+100],3
		mov ?ct[%51+100],10
		inc %score
		break
 *main_brid_enemy_2
	next
 *main_brid_enemy_1
next
; 爆発と敵の接触判定
 *main_bomb_enemy
for %50=152 to 201
if ?on[%50]=0 goto *main_bomb_enemy_1
	for %51 = 52 to 101
	if ?on[%51]=0 goto *main_bomb_enemy_2
		abs %0,?x[%50]-?x[%51]
		if %0>32 goto *main_bomb_enemy_2
		abs %0,?y[%50]-?y[%51]
		if %0>32 goto *main_bomb_enemy_2
		mov ?on[%50],0
		mov ?on[%51],0
		mov ?on[%51+100],1
		mov ?x[%51+100],?x[%51]
		mov ?y[%51+100],?y[%51]
		mov ?dx[%51+100],?dx[%51]
		mov ?dy[%51+100],?dy[%51]
		mov ?sp[%51+100],3
		mov ?ct[%51+100],10
		inc %score2
		break
 *main_bomb_enemy_2
	next
 *main_bomb_enemy_1
next

; 敵と自分の接触判定
for %50=52 to 151
if ?on[%50]=0 goto *main_enemy_my
	mov %0,?x[0]-?x[%50]:mov %0,%0*%0
	mov %1,?y[0]-?y[%50]:mov %1,%1*%1
	mov %2,%0+%1
	if %2<145 mov ?sp[0],3:break
 *main_enemy_my
next
; 全体の表示
 *main_print
drawclear
for %50=0 to 201
if ?on[%50]>0 drawsp2 ?sp[%50],0,255,?x[%50],?y[%50],100,100,?rd[%50]
next
draw
if ?sp[0]=3 goto *bomb
if %enemy>1 mov %5,(%score+%score2)*100/%enemy
prnum 0,%score,10,10,26,26,#FFFFFF
prnum 1,%score2,10,36,26,26,#FFFFFF
prnum 2,%enemy,10,62,26,26,#FF0000
prnum 3,%5,10,88,26,26,#FF00FF
print 1
gettimer %0
mov %1,100-%0
if %1<1 mov %1,1
wait %1
goto *main

 *bomb
br
br
br
br
GAME OVER
selnum %0,"RESTART","END"
if %0=1 end
reset

 *abs
getparam i%150,%151
if %151<0 mul %151,(-1)
mov %%150,%151
return

まとめ

しかし、動きが悪くなったなー。
やっぱ無理があるのか。
まあ、STGは息抜きなのでこの辺で。