戦闘



RPGといえば必ず戦闘はありますよね。
今回はこれを作ってみようと思います。
戦闘システムは最も簡単なドラクエ風がいいでしょう。ただ最も簡単な方法でもずいぶんスクリプトは長くなってしまっていますが…。
とりあえず今回作るのは1対1の戦闘です。複数人数はまためんどくさいので…。

;ドラクエ風戦闘

	oname="勇者"	;自分の名前
	ohpmax=100	;自分のHP最大値
	ohp=ohpmax	;自分のHP
	odef=0		;自分の防御状態

	ename="モンスター"	;敵の名前
	ehpmax=100	;敵のHP最大値
	ehp=ehpmax	;敵のHP
	edef=0		;敵の防御状態

	turn=0		;行動フラグ
	speak=0		;会話進行状態

	randomize	;乱数初期化

	screen 0,300,200

*mainloop
	redraw 0
	color 255,255,255 : boxf	;背景白
	gosub *drawstate
	if turn=0 : gosub *ocommand	;自分行動選択
	if turn=1 : gosub *oaction	;自分行動
	if turn=2 : gosub *ecommand	;敵行動選択
	if turn=3 : gosub *eaction	;敵行動
	redraw
	await 1
	goto *mainloop

*drawstate	;両者のステータス表示
	color
	boxf 10,10,100,50
	boxf 110,10,200,50
	color 255,255,255
	boxf 11,11,99,49
	boxf 111,11,199,49
	color
	pos 12,12 : mes oname+"\nHP:"+ohp+"/"+ohpmax
	pos 112,12 : mes ename+"\nHP:"+ehp+"/"+ehpmax
return

*ocommand	;自分行動選択
	color : boxf 10,110,90,190
	color 255,255,255 : boxf 11,111,89,189
	color : pos 40,115 : mes "攻撃\n防御\n回復\n逃走"
	stick key
	if key&2 : osel-- : if osel=-1 : osel=3
	if key&8 : osel++ : if osel=4 : osel=0
	if key&32 {	;Enterキーが押されたら行動へ
		turn=1
		speak=0
		odef=0	;防御解除
	}
	color 255 : pos 20,osel*18+115 : mes ">>"
return

*oaction	;自分行動
	color : boxf 10,120,290,190
	color 255,255,255 : boxf 11,121,289,189
	color : pos 20,130
	stick key
	if key&32 : speak++	;Enterキーで進行
	if osel=0 {	;攻撃
		if speak=0 : mes oname+"の攻撃"
		if speak=1 {
			rnd dmg,10 : dmg+6	;ダメージ計算
			if edef=1 : dmg=dmg/2	;防御状態なら半減
			ehp-dmg : if ehp<0 : ehp=0	;0以下なら0に
			speak++
		}
		if speak=2 : mes ename+"に"+dmg+"のダメージ"
		if speak=3 : if ehp=0 : speak++ : else : turn=2
		if speak=4 : mes ename+"をやっつけた"
		if speak=5 : end
	}
	if osel=1 {	;防御
		if speak=0 : mes oname+"は身を守っている"
		if speak=1 : odef=1 : turn=2	;防御フラグオン
	}
	if osel=2 {	;回復
		if speak=0 : mes oname+"は呪文を唱えた"
		if speak=1 {
			rnd car,10 : car+10	;回復量計算
			ohp+car : if ohp>ohpmax : ohp=ohpmax	;MAXを超えたらMAXに
			speak++
		}
		if speak=2 : mes oname+"は"+car+"回復した"
		if speak=3 : turn=2
	}
	if osel=3 {
		if speak=0 : rnd esc,2 : speak++
		if speak=1 : mes oname+"は逃げ出した"
		if speak=2 {
			if esc=0 : end
			if esc=1 : mes "しかし回り込まれてしまった"
		}
		if speak=3 : turn=2
	}
return

*ecommand	;敵行動選択
	rnd esel,3	;逃走は無し
	turn=3
	speak=0
	edef=0	;防御解除
return

*eaction	;敵行動
	color : boxf 10,120,290,190
	color 255,255,255 : boxf 11,121,289,189
	color : pos 20,130
	stick key
	if key&32 : speak++	;Enterキーで進行
	if esel=0 {	;攻撃
		if speak=0 : mes ename+"の攻撃"
		if speak=1 {
			rnd dmg,10 : dmg+16	;ダメージ計算
			if odef=1 : dmg=dmg/2	;防御状態なら半減
			ohp-dmg : if ohp<0 : ohp=0	;0以下なら0に
			speak++
		}
		if speak=2 : mes oname+"に"+dmg+"のダメージ"
		if speak=3 : if ohp=0 : speak++ : else : turn=0
		if speak=4 : mes oname+"はやられてしまった"
		if speak=5 : end
	}
	if esel=1 {	;防御
		if speak=0 : mes ename+"は身を守っている"
		if speak=1 : edef=1 : turn=0	;防御フラグオン
	}
	if esel=2 {	;回復
		if speak=0 : mes ename+"は呪文を唱えた"
		if speak=1 {
			rnd car,10 : car+6	;回復量計算
			ehp+car : if ehp>ehpmax : ehp=ehpmax	;MAXを超えたらMAXに
			speak++
		}
		if speak=2 : mes ename+"は"+car+"回復した"
		if speak=3 : turn=0
	}
return

結構長くなってしまいました。
コメントをあまりつけられなかったのですが、まず全体的な説明をしますと、 変数turnが戦闘の流れを操作しています。一つ一つをフェイズと呼ぶと、

turn=0 自分のコマンド選択フェイズ
turn=1 自分の行動フェイズ
turn=2 敵のコマンド選択フェイズ(自動)
turn=3 敵の行動フェイズ

っていう感じです。
この変数turnを0,1,2,3,0,1,2,3…とつなげる事により、お互いのターンが順にまわってくるようになっています。
行動フェイズ内の変数speakは会話の流れを操作しています。
stick命令でEnterキーを取得したら変数speakを+1し、次の会話へ進むようになっています。 また、変数speakは会話と会話の間の処理をするためのフラグとしても使われています。

さて、この戦闘、やってみると敵の攻撃力が異常に高いです。攻撃連発では勝てないのではないでしょうか?
まず防御って意味ないですし…。でもその分自分は回復量が敵より多いです。まあ二人とも同じじゃつまらなかったので…。


前へ 戻る 次へ