ステータス魔法を追加する


2017年 11月17日
 
 
 前回より 2週間の時間が経ちました。
 
 
 いやあ、今回も大変だった(こればっか)

 何が大変だったかと言うと、ステータスを変化した値をどこに格納して参照するか。

 ud、ユニットデータに格納すれば事は簡単なのだが、これだとステータスの変数が例えば 30種類だったとして、200ユニット作るとデータが 6000増える、6kバイト?いや、一つの変数はたぶん 4バイト、つまり 2バイトで最大値 65536だから、いくつかはめんどくさいので計算しないが、4バイトだとそれ以上の最大値で、それを確保してるはずだから・・・、まあいいや、とにかく 6000*4で 24Kバイト、1000ユニット作ったら、ええと・・・。

 まあとにかくユニットデータに余分なデータを格納すると、死にデータ領域が増えるし、オーバーフローで動かなくなる可能性が。

 と言っても最近のスマホなら気にしなくても大丈夫なんだろうか?

 

 と言う訳で戦闘中のステータス変動データはその場限りの 6人分で確保。

 bsb=21 ; データ数
 dim bs,6*bsb ; 6人分の 1次配列変数

 例によって 2次配列は使わない、そのためデータ参照もややこしくててこずった。
 先頭の 0、21,42・・・の場所に un(ユニットNo.)を格納して、調べて選択するようにした。

 言うのは簡単だが、その方法を思考錯誤して確定するまでが大変だ。
 
 
 それでは恐怖のソースを

/////// 戦闘 ////////////////////////////

*battle_syoki ; 戦闘初期 ////////////////////////////////

	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=ホーリーライトサークル、)

	dim rdpd,3 ; ランダムピックのun格納

dim zputn,7
zputs="zk1 ","火 ","水 ","風 ","地 ","光 ","闇 "
	return


#defcfunc bsp int bspn; 戦闘ステータスデータNo,ピック

	repeat 6
	 bsp_bsg=bsb*cnt
	  if bspn=bs(bsp_bsg) : break
	loop

	return bsp_bsg


#defcfunc rdp int rdpf ; ランダムピック

	rdpn=0 : rdpc=0
	repeat 3
	 rdpd(cnt)=0 ; リセット
	 if rdpf=1 : rdpun=fn1(cnt+1) ; 自軍の場合
	 if rdpf=2 : rdpun=fn2(cnt+1) ; 敵軍の場合
	 if rdpun=0 or ud(rdpun*udb+26)<=0 : continue ; いない
	 rdpd(rdpc)=rdpun : rdpc+ ; 候補格納
	loop
	if rdpc=0 : return -1 ; 1人もいない場合
	r=rnd(rdpc) ; 選択
	rdpn=bsp(rdpd(r)) ; bsNo.照会

dgs "r選択un ",rdpd(r),9

	return rdpn


#deffunc enc int encf,int encn ; エンチャント

	bsg=rdp(fs) ; unNo.決定
dgs "enc bsg ",bsg,10
	if bsg=-1 : return
	;repeat 7,7
	; bs(bsg+cnt)=0 ; リセット
	;loop
	bs(bsg+7+encf)+=encn ; 付与

	return


#deffunc sad int sadf,int sadn ; 攻撃効果

	if sadf=1 {
		bsg=rdp(fs) : if bsg=-1 : return
		bs(bsg+14)+=sadn
dgs "sad bsg ",bsg,11
 : return ; ランダム1体
}
	repeat 3,1
	 if fs=1 : n=fn1(cnt)
	 if fs=2 : n=fn2(cnt)
	  bsg=bsp(n) : bs(bsg+14)+=sadn ; 3体全員
	loop

	return


#deffunc fn_syo ; 隊列処理

	n1=(fg1-1)*3
	n2=(fg2-1)*3

	if ud(fn1(n1+1)*udb+26)=0 : fn1(n1+1)=fn1(n1+2) : fn1(n1+2)=fn1(n1+3) : fn1(n1+3)=0 ; 先頭がいなければ一つ詰める
	if ud(fn2(n2+1)*udb+26)=0 : fn2(n2+1)=fn2(n2+2) : fn2(n2+2)=fn2(n2+3) : fn2(n2+3)=0


	anif1=1

	repeat 3,1 ; 全滅確認
	 if fn1(n1+cnt)>0 : anif1=0 : break
	loop
	if anif1=1 {
		ff1(fg1)=0 ; 部隊消去
		fff=1
		repeat 3,1 ; 全部隊全滅確認
		 if ff1(cnt)>0 : fff=0 : break
		loop
		if fff=1 : ff1(0)=0 : btvf=-9; 全滅
		btvf- : return
	}

	anif2=1
	repeat 3,1 ; 全滅確認
	 if fn2(n2+cnt)>0 : anif2=0 : break
	loop
	if anif2=1 {
		ff2(fg2)=0 ; 部隊消去
		fff=1
		repeat 3,1 ; 全部隊全滅確認
		 if ff2(cnt)>0 : fff=0 : break
		loop
		if fff=1 : ff2(0)=0 : btvf=9 ; 全滅
		btvf+
	}

	return


#deffunc d_syo ; 死亡処理

	fn2(et)=0

	return


#defcfunc zk_syo int zksf ; 属性補整 --------------------------------

	zksn=0 ; 種族補整 -------
	if zksf=1 { ; 火
		if ud(eg+7)=4 or ud(eg+7)=5 : zksn=20	; +20%
		if ud(eg+7)=2 or ud(eg+7)=6 : zksn=-20	; -20%
	}
	if zksf=2 { ; 水
		if ud(eg+7)=1 or ud(eg+7)=5 : zksn=20	; +20%
		if ud(eg+7)=3 or ud(eg+7)=6 : zksn=-20	; -20%
	}
	if zksf=3 { ; 風
		if ud(eg+7)=2 or ud(eg+7)=5 : zksn=20	; +20%
		if ud(eg+7)=4 or ud(eg+7)=6 : zksn=-20	; -20%
	}
	if zksf=4 { ; 地
		if ud(eg+7)=3 or ud(eg+7)=5 : zksn=20	; +20%
		if ud(eg+7)=1 or ud(eg+7)=6 : zksn=-20	; -20%
	}
	if zksf=5 { ; 光
		if 1<=ud(eg+7) and ud(eg+7)<=4 : zksn=-20 ; 4属
		if ud(eg+7)=6 : zksn=20 ; 闇
	}
	if zksf=6 { ; 闇
		if 1<=ud(eg+7) and ud(eg+7)<=4 : zksn=20 ; 4属
		if ud(eg+7)=5 : zksn=-20 ; 光
	}

zputn(0)=zksn

	return zksn


#defcfunc zk2_syo int zk2sf,int zk2sn
; 特殊のアイテム属性補整(zk2sf=0 全属性、1~6 各属性) -------

	zk2sg=0 : k1=120 : k2=80 ; アイテム補整 -------

	if zk2sf=0 or zk2sf=1 {	; 火 ------------------------
	 n2=zk2sn+ud(ug+31)
	  if zk2sf=0 : bsg=bsp(un) : n2+=bs(bsg+7) ; エンチャント+
	 n=n2-ud(eg+32)+ud(eg+34)-ud(eg+36)+ud(eg+35) ; 火値-水+地-闇+光
	  if n>n2 : n=n2			; 最大値
	  if n<0 and n<n2 : n=-n2	; 最小値

	 if ud(eg+7)=4 or ud(eg+7)=5 { ; 地、光。+%
		if n>0 : n=n*k1/100 : else : n=n*k2/100
	 }
	 if ud(eg+7)=2 or ud(eg+7)=6 { ; 水、闇。-%
		if n>0 : n=n*k2/100 : else : n=n*k1/100
	 }
	 zk2sg+=n
	}

zputn(1)=n


	if zk2sf=0 or zk2sf=2 {	; 水 -----------------------
	 n2=zk2sn+ud(ug+32)
	  if zk2sf=0 : bsg=bsp(un) : n2+=bs(bsg+8) ; エンチャント+
	 n=zk2sn+ud(ug+32)-ud(eg+33)+ud(eg+31)-ud(eg+36)+ud(eg+35) ; 水値-風+火-闇+光
	  if n>n2 : n=n2			; 最大値
	  if n<0 and n<n2 : n=-n2	; 最小値

	 if ud(eg+7)=1 or ud(eg+7)=5 { ; 火、光。+%
		if n>0 : n=n*k1/100 : else : n=n*k2/100
	 }
	 if ud(eg+7)=3 or ud(eg+7)=6 { ; 風、闇。-%
		if n>0 : n=n*k2/100 : else : n=n*k1/100
	 }
	 zk2sg+=n
	}

zputn(2)=n


	if zk2sf=0 or zk2sf=3 {		; 風
	 n2=zk2sn+ud(ug+33)
	  if zk2sf=0 {
			bsg=bsp(un)
			 n2+=bs(bsg+9)	; エンチャント+
			 n2+=bs(bsg+10) ; エンチャント+
	  }
	 n=zk2sn+ud(ug+33)-ud(eg+34)+ud(eg+32)-ud(eg+36)+ud(eg+35) ; 風値-地+水-闇+光
	  if n>n2 : n=n2			; 最大値
	  if n<0 and n<n2 : n=-n2	; 最小値

	 if ud(eg+7)=2 or ud(eg+7)=5 { ; 水、光。+%
		if n>0 : n=n*k1/100 : else : n=n*k2/100
	 }
	 if ud(eg+7)=4 or ud(eg+7)=6 { ; 地、闇。-%
		if n>0 : n=n*k2/100 : else : n=n*k1/100
	 }
	 zk2sg+=n
	}

zputn(3)=n


	if zk2sf=0 or zk2sf=4 { ; 地
	 n2=zk2sn+ud(ug+34)
	  if zk2sf=0 : bsg=bsp(un) : n2+=bs(bsg+11) ; エンチャント+
	 n=n2-ud(eg+31)+ud(eg+33)-ud(eg+36)+ud(eg+35) ; 地値-火+風-闇+光
	  if n>n2 : n=n2	; 最大値
	  if n<0 and n<n2 : n=-n2	; 最小値

		if ud(eg+7)=3 or ud(eg+7)=5 { ; 風、光。+%
			if n>0 : n=n*k1/100 : else : n=n*k2/100
		}
		if ud(eg+7)=1 or ud(eg+7)=6 { ; 火、闇。-%
			if n>0 : n=n*k2/100 : else : n=n*k1/100
		}
		zk2sg+=n
	}

zputn(4)=n

	if zk2sf=0 or zk2sf=5 { ; 光
	 n=0
	 repeat 4
	  if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt)
	 loop
	 n2=zk2sn+ud(ug+35)
	  if zk2sf=0 : bsg=bsp(un) : n2+=bs(bsg+12) ; エンチャント+
	 nn=n2-n+ud(eg+36)
	  if nn>n2 : nn=n2	; 最大値
	  if nn<0 and nn<n2 : nn=-n2	; 最小値

	 if 1<=ud(eg+7) and ud(eg+7)<=4 { ; 4属、+%
		if nn>0 : nn=nn*k2/100 : else : nn=nn*k1/100
	 }
	 if ud(eg+7)=6 { ; 闇、-%
		if nn>0 : nn=nn*k1/100 : else : nn=nn*k2/100
	 }
	 zk2sg+=nn
	}

zputn(5)=nn


	if zk2sf=0 or zk2sf=6 { ; 闇
	 n=0
	 repeat 4
	  if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt)
	 loop
	 n2=zk2sn+ud(ug+36)
	  if zk2sf=0 : bsg=bsp(un) : n2+=bs(bsg+13) ; エンチャント+
	 nn=n2+n-ud(eg+35)
	  if nn>n2 : nn=n2	; 最大値
	  if nn<0 and nn<n2 : nn=-n2	; 最小値

	 if 1<=ud(eg+7) and ud(eg+7)<=4 { ; 4属、+%
		if nn>0 : nn=nn*k1/100 : else : nn=nn*k2/100
	 }
	 if ud(eg+7)=5 { ; 光、-%
		if nn>0 : nn=nn*k2/100 : else : nn=nn*k1/100
	 }
	 zk2sg+=nn
	}

zputn(6)=nn


	return zk2sg



#deffunc dmg int dmgf,int dmgn ; ダメージ処理(攻撃種類、値); -------------------

; ダメージ計算 ---------------------------------

	bsg=bsp(un) : n=bs(bsg+14) ; 攻撃効果
dgs "攻撃効果 ",n,5
	atkg=(dmgn+n)*(gsr+zk1)/100 ; 攻撃力
dgs "gsr ",gsr,3
n=dmgn : dgs "dmgn ",n,4
dgs "zk1 ",zk1,6
dgs "atkg ",atkg,7



/*
n=atkn
dgs "atkn ",n,10
dgs "gsr ",gsr,11
dgs "atkg ",atkg,12
*/

	switch dmgf
	 case 1 ; 物理
	  atn=0 : repeat 2 : atn+=rnd(atkg+1) : loop ; 攻撃値
	  r=ud(eg+12)+1	; 敵の防御力
	   dfn=0 : repeat 2 : dfn+=rnd(r) : loop ; 防御値
	 swbreak
	 case 2 ; 魔法
	  atn=0 : repeat 2 : atn+=rnd(atkg+1) : loop ; 攻撃値
	  r=ud(eg+22)+1	; 敵の魔力
	   dfn=0 : repeat 2 : dfn+=rnd(r) : loop ; 防御値
	 swbreak
	 case 3 ; 特殊
	  atn=0	; 特殊の攻撃値
	  dfn=0	; 特殊の場合防御無し
	 swbreak
	swend


dgs "atn 攻撃 ",atn,14
dgs "dfn 防御 ",dfn,15

	dm=atn-dfn : if dm<0 : dm=0 ; 基礎ダメージ
dgs "dm ダメージ ",dm,16

	dm=dm+(zk2*gsr/100) ; ダメージ+属性ダメージ
dgs "dm+zk2 ",dm,17

	if dm=0 : n=dm  : cn=0 ; miss
	if dm>0 : n=dm  : if dmgf=3 : cn=4 : else : cn=dmgf ; カラー
	if dm<0 : n=-dm : cn=3 ; 回復カラー、緑
	if fs=1 : dmp_set n,3+et,cn ; ダメージ表示
	if fs=2 : dmp_set n,et,cn

	ud(eg+26)-=dm : if ud(eg+26)<0 : ud(eg+26)=0 ; HP処理


	return


#deffunc rang int rangn ; 射程判定 -------------------------------

	rangf=0 ; 攻撃したかフラグ

	repeat 3,1 ; 射程
	 if rangn<(ut-1)+cnt : break ; 射程外
	 et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない
	 eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0
	 rangf+ : break ; 攻撃した
	loop

	return


#deffunc brang int brangn ; 後方から射程判定 -------------------------------

	rangf=0 ; 攻撃したかフラグ

	repeat 3 ; 射程
	 if brangn<(ut-1)+(3-cnt) : continue ; 射程外
	 et=3-cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない
	 eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0
	 rangf+ : break ; 攻撃した
	loop

	return

#deffunc atk int atkn,int atkrg ; 攻撃(攻撃値、射程) -------
dgs "atk ",a,2
	rang atkrg ; 射程判定
	if rangf=0 : return ; 射程内に敵がいなかった

	zk1=zk_syo(ud(ug+7)); 種族属性補整
	zk2=zk2_syo(0,0)	; アイテム属性補整

	dmg 1,atkn

	return


#deffunc matk int matkf,int mzk,int matkn,int matkrg ; 魔法攻撃(属性、攻撃値、射程) -------
n=matkf
dgs "matk ",n,2
n=matkn
dgs "威力 ",n,3
	switch matkf
	 case 0 ; 手前の一体 --------------
	  rang matkrg				; 射程判定
	  if rangf=0 : swbreak 		; 射程内に敵がいなかった

	  zk1=zk_syo(ud(ug+7))		; 種族属性補整
	  zk2=zk2_syo(mzk,matkn)	; アイテム属性補整
	   dmg 2,ud(ug+22)
	 swbreak
	 case 1 ; 後列の一体 --------------
	  brang matkrg				; 射程判定
	  if rangf=0 : swbreak 		; 射程内に敵がいなかった

	  zk1=zk_syo(ud(ug+7))		; 種族属性補整
	  zk2=zk2_syo(mzk,matkn)	; アイテム属性補整
	   dmg 2,ud(ug+22)
	 swbreak
	 case 2 ; 貫通 --------------
	  repeat 3,1 : et=cnt
	   if matkrg<(ut-1)+et : break		; 射程外
	   en=ffn(et) : if en=0 : continue	; 隊列にいない
	   eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0

	   zk1=zk_syo(ud(ug+7))		; 種族属性補整
	   zk2=zk2_syo(mzk,matkn)	; アイテム属性補整
	    dmg 2,ud(ug+22)			; 攻撃
	   gsr-=25					; 威力減衰
	  loop
	 swbreak
	 case 3 ; 全列 --------------
	  repeat 3,1
	   et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない
	   eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0

	   zk2=zk2_syo(mzk,matkn)	; 特殊のアイテム属性補整
	    dmg 2,ud(ug+22)
	  loop
	 swbreak
	 case 4 ; 着弾範囲型 --------------
	  f=0
	  repeat 3,1 ; 3体いるか
	   if ffn(cnt)=0 or ud(ffn(cnt)*udb+26)<=0 : f=1 : break
	  loop
	  if matkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか
	  if f=0 { ; 3体の場合
	   gsr=100	; 中央
	    et=2 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22)
	   gsr=75	; 左右
	    et=1 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22)
	    et=3 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22)
	   swbreak
	  }
	  rang matkrg : if rangf=0 : swbreak		; 射程内に敵がいなかった
	   zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22)	; 1体目
	   et+ : if et>3 : swbreak					; 範囲外
	   en=ffn(et) : if en=0 : swbreak			; 2体目にいない
	   eg=en*udb : if ud(eg+26)<=0 : swbreak	; HPが0
	   gsr=75 : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) ; 2体目
	 swbreak
	swend

	return


#deffunc tatk int tatkf,int tzk,int tatkn,int tatkrg ; 特殊攻撃(属性、攻撃値、射程) -------
n=tatkf
dgs "tatk ",n,2

	zk1=0 ; 種族属性補整


	switch tatkf
	 case 0 ; 手前の一体 --------------
	  rang tatkrg : if rangf=0 : return ; 射程内に敵がいなかった

	  zk2=zk2_syo(tzk,tatkn)	; 特殊のアイテム属性補整
	   dmg 3,tatkn
	 swbreak
	 case 1 ; 後列の一体 --------------
	 swbreak
	 case 2 ; 貫通
	 swbreak
	 case 3 ; 全列 --------------
	  repeat 3,1
	   et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない
	   eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0

	   zk2=zk2_syo(tzk,tatkn)	; 特殊のアイテム属性補整
	    dmg 3,tatkn
	  loop
	 swbreak
	 case 4 ; 着弾範囲型 --------------
	  f=0
	  repeat 3,1 ; 3体いるか
	   if ffn(cnt)=0 or ud(ffn(cnt)*udb+26)<=0 : f=1 : break
	  loop
	  if tatkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか
	  if f=0 { ; 3体の場合
	   gsr=100	; 中央
	    et=2 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn
	   gsr=75	; 左右
	    et=1 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn
	    et=3 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn
	   swbreak
	  }
	  rang tatkrg : if rangf=0 : swbreak ; 射程内に敵がいなかった
	   zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn ; 1体目
	   et+ : en=ffn(et) : if en=0 : swbreak ; 2体目にいない
	   eg=en*udb : if ud(eg+26)<=0 : swbreak ; HPが0
	   gsr=75 : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn ; 2体目
	 swbreak
	swend

	return



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

	en=0 ; 敵ユニットNo.

;dgs "intvc",intvc,0
dgs "un ",un,0
dgs "fs ",fs,1
;dgs "ut ",ut,2
;dgs "16 ",ud(ug+16),4

;dgs "gsr ",gsr,3
; ユニット特殊、魔法

	gsr=100 ; 攻撃減衰率

	if ud(ug+8)=60 : tatk 0,1,ud(ug+9),1	; 火の息
	if ud(ug+8)=61 : tatk 4,1,ud(ug+9),3	; ファイヤーボール
	if ud(ug+8)=62 : tatk 3,1,ud(ug+9),0	; ファイヤーストーム
	if ud(ug+8)=63 : tatk 3,2,ud(ug+9),0	; コールドストーム

redraw 0
  color 0,0,0 : boxf : color 255,255,255
 btl_put
 dmp_put
 dg_put
redraw 1
pkey

; アイテム魔法 ---------------------------------------


	repeat 7 ; 装備欄
	 in=ud(ug+40+cnt) : if in<=0 : continue
	  ig=in*idb : itn=id(ig)

	 gsr=100 ; 減衰率リセット

	 if itn=251 : matk 0,1,id(ig+9),id(ig+17)	; ファイヤー
	 if itn=252 : enc 0,id(ig+9)				; ファイヤーウェポン
	 if itn=253 : sad 1,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 2,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)	; エクスプロージョン


	redraw 0
	  color 0,0,0 : boxf : color 255,255,255
	 btl_put
	 dmp_put
	 dg_put
	redraw 1
pkey

	loop ; --------------------------------------------




; 物理攻撃 --------------------------------------------

	gsr=100 ; 攻撃減衰率

	if ud(ug+16)=0 and ut=1 : gensui=120 : atk ud(ug+11),1 ; 素アタック

	if ud(ug+16)=2 { ; 2手 ------------------------

	 repeat 1 ; 右手
	  if ud(ug+40)=0 { ; 素手
	   if ud(ug+41)=0 or id(ud(ug+41)*idb+16)=5 { ; 左手が素手か盾
		atk ud(ug+11),1 : gsr=75 : break ; 右素手攻撃
	   }
	  }
	  if ud(ug+40)>0 { ; 右手武器
	   in=ud(ug+40) : ig=in*idb
	   atk ud(ug+11)+id(ig+11),id(ig+17) ; 右手武器攻撃
	   gsr=75
	  }
	 loop
redraw 0
  color 0,0,0 : boxf : color 255,255,255
 btl_put
 dmp_put
 dg_put
redraw 1
pkey
	 repeat 1 ; 左手
	  if ud(ug+40)=0 and ud(ug+41)=0 : atk ud(ug+11),1 : break ; 素手なら左素手攻撃
	  if ud(ug+41)>0 { ; 左手武器
	   in=ud(ug+41) : ig=in*idb
	   atk ud(ug+11)+id(ig+11),id(ig+17) ; 左手武器攻撃
	  }
	 loop
redraw 0
  color 0,0,0 : boxf : color 255,255,255
 btl_put
 dmp_put
 dg_put
redraw 1
pkey
	} ; -------------------------------------------

	if ud(ug+16)>2 { ; 複数手 ---------------
	 repeat ud(ug+16) ; 手数
redraw 0
  color 0,0,0 : boxf : color 255,255,255
 btl_put
 dmp_put
 dg_put
redraw 1
pkey
	  if ud(ug+40+cnt)=0 : atk ud(ug+11),1 : gsr-=25 : continue ; 素手
	  if ud(ug+40+cnt)>0 { ; 武器
	   in=ud(ug+40+cnt) : ig=in*idb
	   if id(ig+16)!5 : atk ud(ug+11)+id(ig+11),id(ig+17) : gsr-=25 ; 盾で無ければ攻撃
	  }
	 loop
	} ; --------------------------------------





	redraw 0
	  color 0,0,0 : boxf : color 255,255,255
	 btl_put
	 dmp_put
	 dg_put
	redraw 1

	return





*fight ; 戦闘 ///////////////////////////////////////

	btn=0 ; ターン

	fg1=fc1\3+1 ; 戦闘する部隊
	fg2=fc2\3+1

	repeat 6*bsb : bs(cnt)=0 : loop ; 戦闘ステータスリセット
	repeat 3 ; unNo.セット
	 bs(cnt*bsb)=fn1(cnt+1)
	 bs((3+cnt)*bsb)=fn2(cnt+1)
	loop


repeat 3 ; 3回戦闘

	btn+
;dgs "btn ",btn,9
; イニシアティブ --------------

	dim intv,6	; イニシアティブ、順番
	dim intvn,6	; 値

	repeat 6 ; リセット
	 intv(cnt)=0
	 intvn(cnt)=0
	loop

	repeat 3 : cnt2=cnt ; 値計算
	 cn1=(fg1-1)*3+cnt+1
	 cn2=(fg2-1)*3+cnt+1
	 if fn1(cn1)>0 { ; 攻勢側
	 	intv(cnt)=fn1(cn1)
		ug=fn1(cn1)*udb
		n=0 : if ud(ug+8)=22 : n=ud(ug+9) ; 速攻
		repeat 2 : intvn(cnt2)+=rnd(ud(ug+23)+n+1)+1 : loop ; 値
	 }
	 if fn2(cn2)>0 { ; 防衛側
	 	intv(3+cnt)=fn2(cn2)
		ug=fn2(cn2)*udb
		n=0 : if ud(ug+8)=22 : n=ud(ug+9) ; 速攻
		repeat 2 : intvn(3+cnt2)+=rnd(ud(ug+23)+n+1)+1 : loop ; 値
	 }
	loop

	repeat 5 : cnt2=5-cnt ; バブルソート
	 repeat cnt2

	  n1=intv(5-cnt)	: nd1=intvn(5-cnt)
	  n2=intv(5-cnt-1)	: nd2=intvn(5-cnt-1)

	  if nd1<=nd2 : continue
	  intv(5-cnt)=n2   : intv(5-cnt-1)=n1 ; 入れ替え
	  intvn(5-cnt)=nd2 : intvn(5-cnt-1)=nd1
	 loop
	loop


; 攻撃 --------------

	repeat 6 : intvc=cnt
	 un=intv(intvc) : ug=un*udb ; ユニットNo.
	 if un=0 : continue ; ユニットが無い
	 if ud(ug+26)<=0 : continue ; HPが0

	 repeat 3,1 ; 敵味方識別
	  if fn1((fg1-1)*3+cnt)=un : fs=1 : break
	  if fn2((fg2-1)*3+cnt)=un : fs=2 : break
	 loop

	 repeat 3,1 ; 隊列何番目か
	  if fs=1 : if fn1((fg1-1)*3+cnt)=un : ut=cnt : break
	  if fs=2 : if fn2((fg2-1)*3+cnt)=un : ut=cnt : break
	 loop

	 repeat 3,1 ; 敵ユニットNo.格納
	  if fs=1 : ffn(cnt)=fn2((fg2-1)*3+cnt)
	  if fs=2 : ffn(cnt)=fn1((fg1-1)*3+cnt)
	 loop
/*
	 repeat 6 ; 戦闘ステータスNp.
	  bsg=bs(cnt*bsb)
	  if bsg=cn : break
	 loop
*/
	 gosub *atack ; 攻撃処理

	loop

	fn_syo ; 隊列処理





	redraw 0
	  color 0,0,0 : boxf : color 255,255,255
	 btl_put
	 dmp_put
	 dg_put
	redraw 1

	if anif1=1 or anif2=1 : break ; 全滅した


	repeat 6*bsb ; 魔法効果半減処理
	 if cnt\bsb=0 : continue ; un
	 if bs(cnt)>0 : bs(cnt)=bs(cnt)/2 ; 半減
	loop

loop


	return

 
 
 ぎぃやぁぁあああってくらい増えてる感じはするが、まだ途中だ。

 ちなみに左端にピッタリよせてあるコードは、デバッグモニター用の余計なコードだ。
 pkeyというのはスペースキーを押すまで停止する自作命令で、確認しやすいようにしている。

 最初の部分で bs(ステータス変数)を定義している。

 初期化は戦闘の始め *fightの始めの方でオール 0リセットとunNO.の格納をしている。

 最後に「魔法効果半減処理」というのがあって、1ターン終わると 2分の1になるようにした。

 つまり今の所、効果は累積する。
 
 
 
 それではテストを
 
 
 火の魔女はバーサーク(味方 1体の攻撃力を強化)を


 
 
 火の民はバトルソング(味方全員の攻撃力を強化)を


 
 
 戦闘開始、上の白い数字がステータス変数。


 
 
 ユニット1、火の魔女がバーサークを使った所。
 上の白い部分、ユニット7、つまりファイヤードラゴンの攻撃力補整が 10になってる。
 バーサークのかける相手はランダム。


 
 
 つづいて火の民のバトルソング。
 こちらは味方全員にかかる。
 効果が累積しているのが分かると思う。


 
 
 1ターンの終わりに半減する。


 
 
 ファイヤードラゴンの攻撃。
 左の緑のデバッグ表示を見て欲しい。

 dmgn(元の攻撃力)に攻撃効果(ステータス補整)が足されたものが、atkg(最終攻撃力)になってる。

 さらに zk1は種族補整で +20%している。
 今回は防御されている。


 
 
 再び火の魔女のバーサーク。
 今度は自分にかけている。


 
 
 再びバトルソング。


 
 
 そして半減。


 
 
 そんな感じだ。
 
 
 
 今回はエンチャントウエポンも作ったが、記事が長くなるので割愛する。
 こちらは zk2の処理の時足される。
 前回から zk2_syoの内容が少し足されていると思う。
 
 
 という訳で、今の所火の魔法は終わった。
 ソースの中に火の魔法の分岐場所があると思うので、一応それで一揃い。

 今回は割愛したが、アイテムエディッターで全魔法アイテムを一揃い作ったし、その関連でアイテムデータ(id)に 2データ要素付け足しもしている。
 
 
 と言う訳で、流石にこれで戦闘の基礎部分はできたと思うし、作業は加速されると思いますが、どうでしょうね。
 
 

コメントを残す

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