状態異常を作った


2017年 12月2日
 
 
 あ~もう 12月になってしまった.

 計画では 12月末に、そう年末商戦に間に合うように作ろうと思ったんだけど、7ヶ月経って、これ半分くらいだろうか。

 これは来年の 3月ですら怪しい。

 今回のゲームはきちんとしたのを、という計画だったけど、流石に時間がかかる。

 やはり、もうちょっとミニゲームの発表からやるべきだったかな。

 ゲーム制作は、というか何でもそうなんだけど、思った以上に時間がかかる。
 マーフィーの法則だと、見積もりの 2倍は見ておけだったかな?
 
 
 さて、今回は状態異常を作った。

 麻痺、気絶、魅惑、毒といったものだ。

 
 ステータスは配列変数 bsの 1~6だ。

	bsb=21			; 最大数
	dim bs,6*bsb	; 戦闘ステータス
	bsg=0			; 現在のユニット

; 戦闘ステータス(0=un、1=火傷、2=氷、3=麻痺、4=気絶、5=魅惑、6=毒、
; 7=ファイヤーウエポン、8=アイスエンチャント、9=ウインドエンチャント、10=サンダーウエポン、
; 11=グラビティウエポン、12=ホーリーウエポン、13=ダークウエポン、
; 14=攻撃、15=防御、16=加速、17=減速、
; 18=ウォータースクリーン、19=ウインドウォール、20=ホーリーライトサークル、)

 
 
 状態異常のソース

#deffunc mahi int mahif,int mahin,int mahirg ; 麻痺

	f=0
	switch mahif
	 case 0 ; 対象
	  if en=0 : f=1 : swbreak
	 swbreak
	 case 1 ; 前列
	  rang mahirg : if rangf=0 : f=1 : swbreak
	 swbreak
	 case 2 ; ランダム
	  if fs=1 : en=rdp(2)
	  if fs=2 : en=rdp(1)
	   if en=0 : f=1
	 swbreak
	swend

	if f=1 : return ; 対象がいない

	r1=rnd(mho+mahin+1)
	r2=rnd(ud(en*udb+22)/5+1)
	 if r1<=r2 : return ; かからなかった

	bsg=bsp(en) : bs(bsg+3)+=r1 ; 麻痺

	return


#deffunc stun int stunn; 気絶

	r1=0 : r2=0 : bsg=bsp(en)
	repeat 2
	 r1+=rnd(ud(eg+21)/5+1)		; 筋力抵抗値
	 r2+=rnd(stunn+ud(ug+34)+1)	; 気絶値
	loop
	if r1<r2 : bs(bsg+4)+=n

	return


#deffunc poi int poif,int poin,int poirg ; 毒

	f=0
	switch poif
	 case 0 ; 対象
	  if en=0 : f=1 : swbreak
	 swbreak
	 case 1 ; 前列
	  rang poirg : if rangf=0 : f=1 : swbreak
	 swbreak
	 case 2 ; ランダム
	  if fs=1 : en=rdp(2)
	  if fs=2 : en=rdp(1)
	   if en=0 : f=1
	 swbreak
	swend

	if f=1 : return ; 対象がいない

	r1=rnd(mho+poin+ud(ug+36)+1)
	r2=rnd(ud(en*udb+22)/5+1)
	 if r1<=r2 : return ; かからなかった

	bsg=bsp(en) : bs(bsg+6)+=r1 ; 毒

	return


#deffunc temp int tempf,int tempn ; 魅惑

	f=0
	switch tempf
	 case 0 ; 対象
	  if en=0 : f=1 : swbreak
	 swbreak
	 case 1 ; 対面
	  if fs=1 { ; 攻撃側
		  	 if ut=2 : if fn1(1)>0 : f=1 : swbreak ; 前に味方がいる
		  	 if ut=3 : if fn1(1)>0 or fn1(2)>0 : f=1 : swbreak ; 〃
		  	 en=0
		  	 repeat 3,1
		  	  en=fn2(cnt) : if en>0 : break
		  	 loop
		  	 if en=0 : f=1 : swbreak
	  }
	  if fs=2 { ; 防御側
		  	 if ut=2 : if fn2(1)>0 : f=1 : swbreak ; 前に味方がいる
		  	 if ut=3 : if fn2(1)>0 or fn2(2)>0 : f=1 : swbreak ; 〃
		  	 en=0
		  	 repeat 3,1
		  	  en=fn1(cnt) : if en>0 : break
		  	 loop
		  	 if en=0 : f=1 : swbreak
	  }
	 swbreak
	 case 2 ; ランダム
	  if fs=1 : en=rdp(2)
	  if fs=2 : en=rdp(1)
	   if en=0 : f=1
	 swbreak
	 case 3 ; 3体
	  repeat 3,1
	   if fs=1 : en=fn2(fs2+cnt)
	   if fs=2 : en=fn1(fs1+cnt)
	    if en<=0 : continue
		eg=en*udb : if ud(eg+26)<=0 : continue
		 r1=rnd(mho+tempn+1)
		 r2=rnd(ud(eg+22)/1+1)
		  if r1<=r2 : continue ; かからなかった
		  bsg=bsp(en) : bs(bsg+5)+=r1 ; 魅惑
	  loop
	swend

	if f=1 : return ; 対象がいない

	r1=rnd(mho+tempn+1)
	r2=rnd(ud(en*udb+22)/5+1)
	 if r1<=r2 : return ; かからなかった

	bsg=bsp(en) : bs(bsg+5)+=r1 ; 魅惑

	return


#deffunc curse int cursen ; 呪い

	if fs=1 : en=rdp(2) ; 対象
	if fs=2 : en=rdp(1)
	 if en=0 : return

	cursen2=cursen+mho

	
	r1=0 : r2=0 : bsg=bsp(en) ;火
	repeat 2
	 r1+=rnd(ud(eg+22)/5+1)			; 魔力抵抗値
	 r2+=rnd(cursen2+ud(ug+31)+1)	; 火傷値
	loop
	if r1<r2 : bs(bsg+1)+=r2-r1

	r1=0 : r2=0 : bsg=bsp(en) ;水
	repeat 2
	 r1+=rnd(ud(eg+22)/5+1)			; 魔力抵抗値
	 r2+=rnd(cursen2+ud(ug+32)+1)	; 氷値
	loop
	if r1<r2 : bs(bsg+2)+=r2-r1

	mahi 0,cursen2,0	; 麻痺
	stun cursen2		; 気絶
	temp 0,cursen2		; 魅惑
	 poi 0,cursen2,0	; 毒

	return

 
 
 麻痺と気絶は行動できなくなる。

*atack ; 攻撃処理 ----------------------------------------------------

	bsg=bsp(un)
	 if bs(bsg+3)>0 : return	; 麻痺により行動不能
	 if bs(bsg+4)>0 : return	; 気絶により行動不能

 ユニットの攻撃の始めに判定処理があり、素直にそこから戻る。
 
 
 魅惑は少し苦労した。

 何がって、魅了状態のユニットが味方を攻撃する、というのが結構むずかしい。

 何せ下手すると全攻撃プログラムを味方攻撃用に作らないといけない。

 今のこのグチャグチャソースではとても無理だと思ったので、とりあえず隣接する味方を素アタックするだけのものにした。

 そのソースはこれ

#deffunc temp_atk ; 魅惑状態の行動

	r=rnd(2) : if r=0 : return ; 何もしない

	if fs=1 { ; 味方への攻撃
		fs=2
		if ut=1 or ut=3 : if fn1(fs1+2)>0 : et=2 : en=fn1(fs1+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目
		if ut=2 {
			if fn1(fs1+1)>0 and fn1(fs1+3)>0 {
				r=rnd(2) : if r=0 : en=fn1(fs1+1) : et=1 : else : en=fn1(fs1+3) : et=3
				eg=en*udb : atk 2,ud(ug+11),0 : return
			}
			if fn1(fs1+1)>0 : en=fn1(fs1+1) : eg=en*udb : et=1 : atk 2,ud(ug+11),0 : return
			if fn1(fs1+3)>0 : en=fn1(fs1+3) : eg=en*udb : et=3 : atk 2,ud(ug+11),0 : return
		}
	}

	if fs=2 { ; 味方への攻撃
		fs=1
		if ut=1 or ut=3 : if fn2(fs2+2)>0 : et=2 : en=fn2(fs2+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目
		if ut=2 {
			if fn2(fs2+1)>0 and fn2(fs2+3)>0 {
				r=rnd(2) : if r=0 : et=1 : en=fn2(fs2+1) : else : et=3 : en=fn2(fs2+3)
				eg=en*udb : atk 2,ud(ug+11),0 : return
			}
			if fn2(1)>0 : en=fn2(fs2+1) : et=1 : eg=en*udb : atk 2,ud(ug+11),0 : return
			if fn2(3)>0 : en=fn2(fs2+3) : et=3 : eg=en*udb : atk 2,ud(ug+11),0 : return
		}
	}

	return

 fs=1はこちら側が攻撃している、fs=2は敵側が攻撃している状態を表す。
 
 

 83はユニットNo.、敵が敵を攻撃している。
 
 
 毒は素直にターンの終わりにダメージが入る。

 ちょっと見にくいけど 2ダメージ、bsのステータスは半減している。
 
 
 カース(呪い)は、火傷、コールド、麻痺、気絶、魅惑、毒が全部かかる凶悪な魔法だ。

 これだとちょっとかかりすぎだと思うので、後でバランス調整しないと。
 
 
 最後に状態回復魔法を作った。

#deffunc cure int curef ; 治療

	c=0
	repeat 3,1 ; 状態異常者をピックアップ
	 if fs=1 : un2=fn1(cnt)
	 if fs=2 : un2=fn2(cnt)
	  if un2=0 or ud(un2*udb+26)<=0 : continue ; いない
	 bsg=bsp(un2)
	  if curef=2 : if bs(bsg+1)=0 and bs(bsg+4)=0 and bs(bsg+5)=0 and bs(bsg+6)=0 : continue ; 正常、水
	  if curef=4 : if bs(bsg+1)=0 and bs(bsg+3)=0 and bs(bsg+4)=0 and bs(bsg+6)=0 : continue ; 正常、地
	  if curef=5 : if bs(bsg+1)=0 and bs(bsg+2)=0 and bs(bsg+3)=0 and bs(bsg+4)=0 and bs(bsg+5)=0 and bs(bsg+6)=0 : continue ; 正常、光
	   rdpd(c)=bsg : c+ ; 状態異常者を格納
	loop
	 if c=0 : return ; 状態異常者がいない

	r=rnd(c) : bsg=rdpd(r) ; 治療者を選択
	 if curef=2 : bs(bsg+1)=0 : bs(bsg+4)=0 : bs(bsg+5)=0 : bs(bsg+6)=0 ; 治療、水
	 if curef=4 : bs(bsg+1)=0 : bs(bsg+3)=0 : bs(bsg+4)=0 : bs(bsg+6)=0 ; 治療、地
	 if curef=5 : bs(bsg+1)=0 : bs(bsg+2)=0 : bs(bsg+3)=0 : bs(bsg+4)=0 : bs(bsg+5)=0 : bs(bsg+6)=0 ; 治療、光
	
	return

 
 
 水のピュリファイは、火傷、気絶、魅惑、毒を。
 地のアースキュアは、火傷、麻痺、気絶、毒を。

 ホーリーライトヒールなら全部回復してくれる。


 
 
 麻痺、気絶、魅惑にはターンの終わりに自然治癒のチャンスがある。

	repeat 6 ; 麻痺処理
	 bsg=cnt*bsb
	  if bs(bsg)=0 : continue
	  if bs(bsg+3)=0 : continue
	 un=bs(bsg) : ug=un*udb : r1=0 : r2=0
	 repeat 2
	  r1+=rnd(ud(ug+22)+1)
	  r2+=rnd(bs(bsg+3)+1)
	 loop
	 if r1<r2 : continue
	 bs(bsg+3)=0 ; 解麻痺
	loop

	repeat 6 ; 気絶処理
	 bsg=cnt*bsb
	  if bs(bsg)=0 : continue
	  if bs(bsg+4)=0 : continue
	 un=bs(bsg) : ug=un*udb : r1=0 : r2=0
	 repeat 2
	  r1+=rnd(ud(ug+21)+1)
	  r2+=rnd(bs(bsg+4)+1)
	 loop
	 if r1<r2 : continue
	 bs(bsg+4)=0 ; 解気絶
	loop

	repeat 6 ; 魅惑処理
	 bsg=cnt*bsb
	  if bs(bsg)=0 : continue
	  if bs(bsg+5)=0 : continue
	 un=bs(bsg) : ug=un*udb : r1=0 : r2=0
	 repeat 2
	  r1+=rnd(ud(ug+22)/5+1)
	  r2+=rnd(bs(bsg+5)+1)
	 loop
	 if r1<r2 : continue
	 bs(bsg+5)=0 ; 解魅惑
	loop

 
 
 火傷、氷、毒は半減していくだけ。
 
 
 今回は大体そんな所だ。
 
 
 これで魔法は後召還系とリザレクション(蘇生)を残すのみとなった。

 この 2つについては、増えたり減ったりする隊列処理がややこしいので、これからそれをやる予定。

	 if itn=251 : matk 0,1,id(ig+9),id(ig+17)	; ファイヤー
	 if itn=252 :  enc 1,id(ig+9)				; ファイヤーウェポン
	 if itn=253 :  sad 2,14,id(ig+9)			; バーサーク
	 if itn=254 : matk 1,1,id(ig+9),id(ig+17)	; ファイヤーピレイム
	 if itn=255 : matk 2,1,id(ig+9),id(ig+17)	; フレイムアロー
	 if itn=256 :  sad 3,14,id(ig+9)			; バトルソング
	 if itn=257 : matk 4,1,id(ig+9),id(ig+17)	; ファイアーボール
	 if itn=258 : matk 3,1,id(ig+9),id(ig+17)	; ファイヤーウォール
	 if itn=259 : matk 3,1,id(ig+9),id(ig+17)	; エクスプロージョン

	 if itn=261 : matk 0,2,id(ig+9),id(ig+17)	; アイスニードル
	 if itn=262 : matk 5,2,id(ig+9),id(ig+17)	; ウォーターストリーム
	 if itn=263 : cure 2						; ピュリファイ
	 if itn=264 :  enc 2,id(ig+9)				; アイスエンチャント
	 if itn=265 : matk 2,2,id(ig+9),id(ig+17)	; アイスジャベリン
	 if itn=266 : matk 1,2,id(ig+9),id(ig+17)	; アイスピラー
	 if itn=267 :  scr 2,id(ig+9)				; ウォータースクリーン
	 if itn=268 : matk 2,2,id(ig+9),id(ig+17)	; 津波
	 if itn=269 : matk 4,2,id(ig+9),id(ig+17)	; メイルシュトローム
	 if itn=270 : matk 3,2,id(ig+9),id(ig+17)	; ブリザード

	 if itn=281 : matk 0,3,id(ig+9),id(ig+17)	; ウインドカッター
	 if itn=282 :  sad 2,16,id(ig+9)			; ウインドムーブ
	 if itn=283 : matk 7,3,id(ig+9),id(ig+17)	; サンダー
	 if itn=284 :  enc 3,id(ig+9)				; ウィンドエンチャント
	 if itn=285 :  enc 4,id(ig+9)				; サンダーウエポン
	 if itn=286 : temp 3,id(ig+9)				; セイレーンボイス
	 if itn=287 :  scr 3,id(ig+9)				; ウィンドウォール
	 if itn=288 : matk 2,3,id(ig+9),id(ig+17)	; ライトニングボルト
	 if itn=289 : matk 3,3,id(ig+9),id(ig+17)	; ウィンドストーム

	 if itn=291 : cure 4						; アースキュア
	 if itn=292 :  sad 1,15,id(ig+9)			; ハードコーティング
	 if itn=293 : heal 1,id(ig+9)				; ネイチャーヒール
	 if itn=294 : matk 8,4,id(ig+9),5;id(ig+17)	; グラヴィティマグネット
	 if itn=295 :  enc 5,id(ig+9)				; グラビティウエポン
	 if itn=296 :  sdc 17,1,id(ig+9)			; バインディングブランチ
	 if itn=297 : matk 0,4,id(ig+9),id(ig+17)	; ストーンブラスト
	 if itn=298 : ;matk 2,4,id(ig+9),id(ig+17)	; ゴーレムクリエイト
	 if itn=299 : matk 3,4,id(ig+9),id(ig+17)	; アースクエイク

	 if itn=301 : heal 1,id(ig+9)				; ヒール
	 if itn=302 :  tad 1,id(ig+9)				; ターンアンデッド
	 if itn=303 :  sad 2,16,id(ig+9)			; フォースセンス
	 if itn=304 : cure 5						; ホーリーライトキュア
	 if itn=305 :  enc 6,id(ig+9)				; ホーリーウエポン
	 if itn=306 :  sad 1,15,id(ig+9)			; プロテクト
	 if itn=307 : matk 0,5,id(ig+9),id(ig+17)	; レイアロー
	 if itn=308 : matk 5,5,id(ig+9),id(ig+17)	; サイキックフォース
	 if itn=309 :  sad 3,14,id(ig+9)			; ブレス
	 if itn=310 :  scr 5,id(ig+9)				; ホーリーライトサークル
	 if itn=311 : matk 9,5,id(ig+9),id(ig+17)	; レイブレイド
	 if itn=312 : heal 3,id(ig+9)				; ホーリーライトヒール
	 if itn=313 : ;matk 4,5,id(ig+9),id(ig+17)	; ウィル・オ・ウィスプ
	 if itn=314 : ;matk 3,5,id(ig+9),id(ig+17)	; リザレクション

	 if itn=321 : matk 7,6,id(ig+9),id(ig+17)	; マインドブラスト
	 if itn=322 :  poi 2,id(ig+9),id(ig+17)		; ポイズン
	 if itn=323 : mahi 1,id(ig+9),id(ig+17)		; 邪眼
	 if itn=324 : temp 2,id(ig+9)				; チャーム
	 if itn=325 :  sdc 1,14,id(ig+9)			; ウィークネス
	 if itn=326 : curse id(ig+9)				; カース
	 if itn=327 :  sdc 3,16,id(ig+9)			; ダークネス
	 if itn=328 : matk 3,6,id(ig+9),id(ig+17)	; フレイムカース
	 if itn=329 : ;matk 3,4,id(ig+9),id(ig+17)	; デモンズゲート

 
 
 それじゃまた。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です