戦闘のプログラムを整理した


2018年 3月2日
 
 
 3月に、なってしまったなぁ。

 5月から始めてるから、もう 1年になってしまう。

 さて、整理には 1ヶ月程かかるかと思ったけど、ここの所別の事でゴタゴタして時間を取られた割には半分の時間で済んだ。

 何を変えたんだったか、え~と。

 一番変えたかったのは隊列の処理がスッキリしない事だったので、fn1fn2をそれぞれ敵と味方でその時に使う 3ユニットNo.で格納して使う事にした。

 これで敵 3ユニットNo.を ffnで使ってたのを、それぞれ fn1fn2で全部処理できるので普遍性が上がった。

 それと en(敵のユニットNo.)et(隊列)のピックアップと確認を etfという命令にまとめた。

 後はこまごまとした部分の整理だ、覚えてない。
 
 
 これで戦闘部分は一旦終わりにしたいと思う。

 もう疲れた、4ヶ月もかかってる、内半分は意外にもエフェクト表示だったけど、これは初めてだったし今後はもっと早くできるようになると思う。

 という訳で気分を変えたいし、まだ ITEMの部分を作って無いしバグもあるけど、次のマップの都市データのプログラム、資源とか資金とか人材とかのマップ戦略要素を作っていきたいと思う。
 
 
 後は、以下戦闘のソースを出すけど、2100行という膨大な量なので表示に注意。

 ソースの流れは main → (最後尾から順に)*battle(全体) → *fight(1隊) → *atack(個ユニット) → 細々とした戦闘処理、となってる。
 
 

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

*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 zenkou1,5	; 全体効果(1=自攻撃、2=自防御、3=敵攻撃、4=敵防御)

	dim ff1,4	; forceフラグ、攻撃側
	dim ff2,4	; forceフラグ、防衛側

	dim ft1,10	; 攻勢側隊列ユニットNo.
	dim ft2,10	; 防衛側隊列ユニットNo.

	dim fn1,10	; 攻勢側戦闘部隊
	dim fn2,10	; 防衛側戦闘部隊

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

	dim smnfn,6	; 召還したun格納

	dim sfn,7	; 初期隊列un格納

	dim rfn,4	; 蘇生候補と蘇生処理時の隊列

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


#deffunc bw int bwn ; バトルウエイト

	repeat bwn
	 redraw 0
	  color 0,0,0 : boxf : color 255,255,255
	  btl_put
	  efp
	  dmp_put
	  bp bpn
	  dg_put
	 redraw 1
	 await 1000/20
	loop

	return


#deffunc bpk ; ストップ表示

	redraw 0
	 color 0,0,0 : boxf : color 255,255,255
	 btl_put
	 efp
	 dmp_put
	 bp bpn
	 dg_put
	redraw 1

	pkey ; キーを押すまでストップ

	return


; ピックアップ --------------------------------------------

#defcfunc fns int fnsf ; 先頭判定 -------------------------------

	fnsn=0
	repeat 3,1
	 if fnsf=1 : fnsn=fn1(cnt)
	 if fnsf=2 : fnsn=fn2(cnt)
	  if fnsn=0 or ud(fnsn*udb+26)<=0 : continue
	 et=cnt : break
	loop

	return fnsn

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

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

	return bsp_bsg


#deffunc bsclr int bsclrn ; 戦闘ステータスクリア

	repeat 6
	 bsg=cnt*bsb : if bs(bsg)=bsclrn : break
	loop

	repeat bsb
	 bs(bsg+cnt)=0
	loop

	return


#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 0 ; 1人もいない場合

	r=rnd(rdpc) : rdpn=rdpd(r) ; unNo.照会

	repeat 3,1 ; et確定
	 if rdpf=1 : if rdpn=fn1(cnt) : et=cnt : break
	 if rdpf=2 : if rdpn=fn2(cnt) : et=cnt : break
	loop

	return rdpn


#deffunc etf int etfn ; 生存判定

	if fs=1 : en=fn2(etfn) : if en=0 : return	; 隊列にいない
	if fs=2 : en=fn1(etfn) : if en=0 : return	; 隊列にいない
	eg=en*udb : if ud(eg+26)<=0 : en=0 ; HPが0

	return


#defcfunc fsp int fspn ; fs判定

	fspg=0
	repeat 3,1
	 if fspn=fn1(cnt) : fspg=1 : break
	 if fspn=fn2(cnt) : fspg=2 : break
	loop

	return fspg


#defcfunc ftp int ftpf,int ftpn ; 隊列番号ピック

	ftpg=0
	repeat 3,1
	 if ftpf=1 : if ftpn=fn1(fs1) : ftpg=cnt : break
	 if ftpf=2 : if ftpn=fn2(fs2) : ftpg=cnt : break
	loop

	return ftpg


#deffunc utfss int utfssn ; unから隊列番号とfsをピック

	repeat 3,1
	 if utfssn=fn1(cnt) : fs=1 : ut=cnt : break
	 if utfssn=fn2(cnt) : fs=2 : ut=cnt : break
	loop

	return


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

	repeat 3,1 ; 射程
	 if rangn<(ut-1)+cnt : break ; 射程外

	 et=cnt
	  if rangf=1 : en=fn2(et) : if en=0 : continue ; 隊列にいない
	  if rangf=2 : en=fn1(et) : if en=0 : continue ; 隊列にいない

	 eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0

	 break ; 攻撃した
	loop

	return


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

	repeat 3 ; 射程
	 if brangn<(ut-1)+(3-cnt) : continue ; 射程外

	 et=3-cnt
	  if fs=1 : en=fn2(et) : if en=0 : continue ; 隊列にいない
	  if fs=2 : en=fn1(et) : if en=0 : continue ; 隊列にいない

	 eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0

	 break ; 攻撃した
	loop

	return



#deffunc fn_syo ; 隊列処理 -------------------------------------------

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

	repeat 3,1
	 if ud(fn1(cnt)*udb+26)<=0 : fn1(cnt)=0 ; HP0なら消去
	 if ud(fn2(cnt)*udb+26)<=0 : fn2(cnt)=0 ; HP0なら消去
	loop

	fn_syof=0 ; 全滅フラグ

	repeat 1 ; 味方
	 if fn1(1)>0 or fn1(2)>0 or fn1(3)>0 : break ; 全滅してない
	  fn_syof=1

	 ff1(fg1)=0 ; 部隊消去
	  if ff1(1)>0 or ff1(2)>0 or ff1(3)>0 : btvf- : break ; 全滅してない

	 ff1(0)=0 : btvf=-9 ; 全滅
	loop

	repeat 1 ; 敵
	 if fn2(1)>0 or fn2(2)>0 or fn2(3)>0 : break ; 全滅してない
	  fn_syof=1

	 ff2(fg2)=0 ; 部隊消去
	  if ff2(1)>0 or ff2(2)>0 or ff2(3)>0 : btvf+ : break ; 全滅してない

	 ff2(0)=0 : btvf=9 ; 全滅
	loop

	return


#deffunc d_syo int d_syon ; 死亡処理

	bsclr d_syon ; 戦闘ステータスクリア

	repeat 6 ; 召還削除
	 if smnfn(cnt)!d_syon : continue
	 smnfn(cnt)=0 ; 召還un削除

	 repeat ub-1,1 ; ユニットデータ削除
	  un2=cnt : ug2=un2*udb
	  if ud(ug2)!d_syon : continue
	  repeat udb
	   ud(ug2+cnt)=0 ; データクリア
	  loop
	 loop

	 break
	loop

	return


#deffunc scream int screamn1,int screamn2 ; 絶叫

	un4=screamn1 : ug4=un4*udb
	un5=screamn2 : ug5=un5*udb

	if ud(ug4+8)!34 : return ; 持って無い

	r1=rnd(ud(ug4+9)+ud(ug4+22)/3+1); 絶叫値
	r2=rnd(ud(ug5+22)/3+1)			; 抵抗値

	if r1<=r2 : return ; レジスト

	ud(ug5+26)=0
	d_syo un5 ; 死亡処理

	screamf=1

	return


; ステータス効果 ------------------------------------------------

#deffunc sad int sadf,int sadc,int sadn,int sade ; ステータス効果+

	switch sadf
	 case 1 ; 先頭
	  un2=fns(fs) : if un2=0 : swbreak ; 先頭判定
	  bsg=bsp(un2) : bs(bsg+sadc)+=sadn+mho
	  bts sade : bw 20 ; エフェクト
	 swbreak
	 case 2 ; ランダム1体
	  un2=rdp(fs) : if un2=0 : swbreak ; ランダムピック
	  bsg=bsp(un2) : bs(bsg+sadc)+=sadn+mho
	  bts sade : bw 20 ; エフェクト
	 swbreak
	 case 3 ; 3体全員
	  ut2=ut
	  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) : bs(bsg+sadc)+=sadn+mho
	   ut=cnt : bts sade ; エフェクト
	  loop
	  bw 20
	  ut=ut2
	 swbreak
	swend

	return


#deffunc sdc int sdcf,int sdcc,int sdcn,int sdce ; ステータス効果-

	if sdcc=17 : sdcn2=sdcn+mho : else : sdcn2=-sdcn-mho; 減速以外は-

	switch sdcf
	 case 1 ; 先頭
	  un2=fns(fs) : if un2=0 : swbreak ; 先頭判定
	  bsg=bsp(un2) : bs(bsg+sdcc)+=sdcn2
	  bts sdce : bw 20 ; エフェクト
	 swbreak
	 case 2 ; ランダム1体
	  un2=rdp(fs) : if un2=0 : swbreak ; ランダムピック
	  bsg=bsp(un2) : bs(bsg+sdcc)+=sdcn2
	  bts sdce : bw 20 ; エフェクト
	 swbreak
	 case 3 ; 3体全員
	  repeat 3,1
	   if fs=2 : un2=fn1(cnt)
	   if fs=1 : un2=fn2(cnt)
	    if un2=0 or ud(un2*udb+26)<=0 : continue
	   bsg=bsp(un2) : bs(bsg+sdcc)+=sdcn2
	   et=cnt : bts sdce ; エフェクト
	  loop
	  bw 20
	 swbreak
	swend

	return


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

	un2=rdp(fs) : bsg=bsp(un2) ; unNo.決定

	f=0
	repeat 7 ; 別系統のエンチャントがかかっているか
	 if encf=cnt+1 : continue
	 if bs(bsg+7+cnt)>0 : f=1 : break
	loop

	repeat 7,7 ; リセット
	 if f=0 : break
	 bs(bsg+cnt)=0
	loop

	bs(bsg+6+encf)+=encn+mho ; 付与

	return


#deffunc scr int scrf,int scrn ; スクリーン

	if scrf=2 : n2=18 ; ウォータースクリーン
	if scrf=3 : n2=19 ; ウインドウォール
	if scrf=5 : n2=20 ; ホーリーライトサークル

	repeat 3,1
	 if fs=1 : n=fn1(cnt)
	 if fs=2 : n=fn2(cnt)
	  bsg=bsp(n)

	 bs(bsg+n2)+=scrn+mho
	loop

	return


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

	f=0
	switch mahif
	 case 0 ; 対象
	  if en=0 : f=1 : swbreak
	 swbreak
	 case 1 ; 前列
	  rang fs,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 ; 対象がいない

	if mahif>0 : bts mahie : bw 20 ; エフェクト

	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(stunn+ud(ug+34)+1)	; 気絶値
	 r2+=rnd(ud(eg+21)/5+1)		; 筋力抵抗値
	loop

	n=r1-r2
	 if n>0 : bs(bsg+4)+=n

	return


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

	f=0
	switch poif
	 case 0 ; 対象
	  if en=0 : f=1 : swbreak
	 swbreak
	 case 1 ; 前列
	  rang fs,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 ; 毒

	if poif>0 : bts poie : bw 20 ; エフェクト

	return


#deffunc temp int tempf,int tempn,int tempe ; 魅惑

	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 : et=cnt : 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 : et=cnt : 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
	   et=cnt
	   if fs=1 : en=fn2(cnt)
	   if fs=2 : en=fn1(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 ; 対象がいない

	repeat 1 ; エフェクト
	 if tempf=0 : break
	 if tempf=1 : bts 101 : bw 20 : break ; 特殊
	 bts tempe : bw 20
	loop

	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	; 毒

	bts 75 : bw 20 ; エフェクト

	return


#deffunc heal int healf,int healn ; 回復

	switch healf
	 case 1 ; 1体
	  n=0 : ft=0
	  repeat 3,1 ; 回復するunを特定(HPの低い順)
	   if fs=1 : un2=fn1(cnt)
	   if fs=2 : un2=fn2(cnt)
	   	n1=ud(un2*udb+26) : n2=ud(un2*udb+25)
	   	 if n1>=n2 : continue ; HPが減ってないので対象外
	   	  if n=0 or n>n1 : n=n1 : ft=cnt : un3=un2
	  loop
	  if n=0 : swbreak ; 対象がいなかった

	  n1=ud(un3*udb+26)
	   ud(un3*udb+26)+=healn+mho ; 回復
	    if ud(un3*udb+26)>ud(un3*udb+25) : ud(un3*udb+26)=ud(un3*udb+25)
	  n2=ud(un3*udb+26) : n=n2-n1
	   if fs=1 : dmp_set n,ft,3	 ; 回復表示
	   if fs=2 : dmp_set n,3+ft,3
	 swbreak
	 case 3 ; 全員
	  repeat 3,1
	   if fs=1 : un2=fn1(cnt)
	   if fs=2 : un2=fn2(cnt)
	    n1=ud(un2*udb+26)
	     ud(un2*udb+26)+=healn+mho
	      if ud(un2*udb+26)>ud(un2*udb+25) : ud(un2*udb+26)=ud(un2*udb+25)
	    n2=ud(un2*udb+26) : n=n2-n1
	     if n<=0 : continue
		  if fs=1 : dmp_set n,cnt,3		; 回復表示
	      if fs=2 : dmp_set n,3+cnt,3
	  loop
	 swbreak
	swend

	return


#deffunc cure int curef ; 治療

	c=0
	repeat 3,1 ; 状態異常者をピックアップ
	 if fs=1 : un2=ft1(fs1+cnt)
	 if fs=2 : un2=ft2(fs2+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


#defcfunc smf int smfn ; 召還か

	smff=0
	repeat 6 ; その場所は召還か
	 en=smnfn(cnt)
	  if smfn=en : smff=en : break
	loop

	return smff


#deffunc rsr_syo int rsr_syon ; 蘇生処理

	un2=rsr_syon : ug2=un2*udb

	ud(ug2+26)=ud(ug2+25)*50/100 ; HP

	repeat 3 ; 空き戦闘ステータスにセット
	 if fs=1 : bsg=cnt*bsb
	 if fs=2 : bsg=(cnt+3)*bsb
	 if bs(bsg)=0 : bs(bsg)=un2 : break
	loop

	return


#deffunc resur ; リザレクション


	repeat 3 : rfn(cnt)=0 : loop ; クリア

	if fs=1 : sfg=0
	if fs=2 : sfg=3

	c=0
	repeat 3,1 ; 死亡者ピック
	 rn=sfn(sfg+cnt) : if rn=0 : continue
	  if ud(rn*udb+26)<=0 : rfn(c)=rn : c+
	loop
	if c=0 : return ; 死亡者がいない

	r=rnd(c) : rn=rfn(r) ; 蘇生者選択

	repeat 3,1 ; 元の隊列場所
	 if rn=sfn(sfg+cnt) : rt=cnt : break
	loop

	repeat 4 : rfn(cnt)=0 : loop ; rfnリセット
	repeat 3,1 ; 処理用隊列変数に格納
	 if fs=1 : un2=fn1(cnt)
	 if fs=2 : un2=fn2(cnt)
	  ug2=un2*udb
	   if ud(ug2+26)>0 : rfn(cnt)=un2
	loop

	taif=0
	repeat 3,1 ; 隊列いくつ埋まっているか
	 n=rfn(cnt)
	 if n>0 and ud(n*udb+26)>0 : taif+
	loop

	repeat 1 ; 隊列が3つ埋まってる場合 ----------------------------
	 if taif!3 : break ; 3つじゃない

	 en1=smf(rfn(1)) : en2=smf(rfn(2)) : en3=smf(rfn(3)) ; 召還か

	 switch rt
	  case 1 ; 蘇生される者が1列目 -------------------------
	   if en1>0 : d_syo en1 : rfn(1)=rn : rsr_syo rn : swbreak ; 隊列1が召還の場合
	   if en2>0 and en3=0 { ; 隊列2だけ召還の場合
		d_syo en2 ; 隊列2の召還を消す
		 rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn ; 入れ替え
		swbreak
	   }
	   if en3>0 { ; 隊列3が召還の場合
		d_syo en3 ; 隊列3の召還を消す
		 rfn(3)=rfn(2) : rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn ; 入れ替え
		swbreak
	   }
	  swbreak
	  case 2 ; 蘇生される者が2列目 -------------------------
; 例外1
	   if rfn(3)=sfn(sfg+1) { ; 隊列3に1が入ってる
		en1=smf(rfn(1)) : if en1>0 : d_syo en1 ; 1の召還を削除
		rfn(1)=rfn(2) : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn ; 入れ替え
		swbreak
	   }
	   if rfn(1)=sfn(sfg+3) { ; 隊列1に3が入ってる
		en3=smf(rfn(3)) : if en3>0 : d_syo en3 ; 3の召還を削除
		rfn(3)=rfn(2) : rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn ; 入れ替え
		swbreak
	   }
; 例外2
	   if rfn(2)=sfn(sfg+1) { ; 隊列2に1が入ってる
		en1=smf(rfn(1)) : if en1>0 : d_syo en1 ; 1の召還を削除
		rfn(1)=rfn(2) : rfn(2)=rn : rsr_syo rn ; 入れ替え
		swbreak
	   }
	   if rfn(2)=sfn(sfg+3) { ; 隊列2に3が入ってる
		en3=smf(rfn(3)) : if en3>0 : d_syo en3 ; 3の召還を削除
		rfn(3)=rfn(2) : rfn(2)=rn : rsr_syo rn ; 入れ替え
		swbreak
	   }
; その他
	   if en2>0 : d_syo en2 : rfn(2)=rn : rsr_syo rn ; 隊列2は召還
	  swbreak
	  case 3 ; 蘇生される者が3列目 -------------------------
	   if en2>0 and en1=0 { ; 隊列2だけ召還の場合
		d_syo en2 : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn ; 入れ替え
	   swbreak
	   }
; その他
	   if en1>0 { ; 隊列1、2が召還の場合
	    d_syo en1 ; 隊列1の召還は消す
	     rfn(1)=rfn(2) : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn ; 入れ替え
	   }
	  swbreak
	 swend
	loop

	repeat 1 ; 隊列が2つ埋まってる場合 ----------------------------
	 if taif!2 : break ; 2つじゃない

	 if rt=1 { ; 蘇生される者が1列目 -------------------------
	  if rfn(1)=0 : rfn(1)=rn : rsr_syo rn : break ; 隊列1が空
	  if rfn(2)=0 : rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn : break ; 隊列2が空
	   rfn(3)=rfn(2) : rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn : break ; 隊列3が空
	 }

	 if rt=2 { ; 蘇生される者が2列目 -------------------------
; 例外1
	  if rfn(3)>0 and rfn(3)=sfn(sfg+1) { ; 隊列3に1が入ってる
	   if rfn(2)=0 : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn : break ; 隊列2が空
	    rfn(1)=rfn(2) : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn : break ; その他
	  }
	  if rfn(1)>0 and rfn(1)=sfn(sfg+3) { ; 隊列1に3が入ってる
	   if rfn(2)=0 : rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn : break ; 隊列2が空
	    rfn(3)=rfn(2) : rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn : break ; その他
	  }
; 例外2
	  if rfn(2)>0 and rfn(2)=sfn(sfg+1) { ; 隊列2に1が入ってる
	   if rfn(3)=0 : rfn(3)=rn : rsr_syo rn : break ; 隊列3が空いてる
		rfn(1)=rfn(2) : rfn(2)=rn : rsr_syo rn ; 入れ替え
		break
	  }
	  if rfn(2)>0 and rfn(2)=sfn(sfg+3) { ; 隊列2に3が入ってる
	   if rfn(1)=0 : rfn(1)=rn : rsr_syo rn : break ; 隊列1が空いてる
		rfn(3)=rfn(2) : rfn(2)=rn : rsr_syo rn ; 入れ替え
		break
	  }
; その他
	  if rfn(1)=0 : rfn(1)=rfn(2) : rfn(2)=rn : rsr_syo rn : break ; 隊列1が空いてる
	  if rfn(3)=0 : rfn(3)=rfn(2) : rfn(2)=rn : rsr_syo rn : break ; 隊列3が空いてる
	 }

	 if rt=3 { ; 蘇生される者が3列目 -------------------------
	  if rfn(3)=0 : rfn(3)=rn : rsr_syo rn : break ; 隊列1が空
	  if rfn(2)=0 : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn : break ; 隊列2が空
	    rfn(1)=rfn(2) : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn : break ; 隊列3が空
	 }
	loop


	repeat 1 ; 隊列が1つ埋まってる場合 ----------------------------
	 if taif!1 : break ; 1つじゃない

	 if rt=1 { ; 蘇生される者が1列目 -------------------------
	  if rfn(1)=0 : rfn(1)=rn : rsr_syo rn : break ; 隊列1が空
	  if rfn(2)=0 : rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn : break ; 隊列2が空
	 }

	 if rt=2 { ; 蘇生される者が2列目 -------------------------
; 例外1
	  if rfn(3)>0 and rfn(3)=sfn(sfg+1) { ; 隊列3に1が入ってる
	   rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn : break ; 隊列2が空
	  }
	  if rfn(1)>0 and rfn(1)=sfn(sfg+3) { ; 隊列1に3が入ってる
	   rfn(2)=rfn(1) : rfn(1)=rn : rsr_syo rn : break ; 隊列2が空
	  }
; 例外2
	  if rfn(2)>0 and rfn(2)=sfn(sfg+1) { ; 隊列2に1が入ってる
		rfn(1)=rfn(2) : rfn(2)=rn : rsr_syo rn : break ; 入れ替え
		
	  }
	  if rfn(2)>0 and rfn(2)=sfn(sfg+3) { ; 隊列2に3が入ってる
		if rfn(1)=0 : rfn(1)=rn : rsr_syo rn : break ; 入れ替え
	  }
; その他
	  if rfn(2)=0 : rfn(2)=rn : rsr_syo rn : break ; 隊列2が空

	  if rfn(2)>0 : rfn(1)=rfn(2) ; 隊列2に召還がいる
	  rfn(2)=rn : rsr_syo rn : break ; 入れ替え
	 }

	 if rt=3 { ; 蘇生される者が3列目 -------------------------
	  if rfn(3)=0 : rfn(3)=rn : rsr_syo rn : break ; 隊列3が空
	  if rfn(2)=0 : rfn(2)=rfn(3) : rfn(3)=rn : rsr_syo rn : break ; 隊列2が空
	 }
	loop

	bts 63 : bw 10
	repeat 3,1 ; 隊列格納
	 if fs=1 : fn1(cnt)=rfn(cnt)
	 if fs=2 : fn2(cnt)=rfn(cnt)
	loop
	bw 10
;bpk
	return


#deffunc tad int tadf,int tadn ; ターンアンデッド

	f=0
	switch tadf
	 case 0 ; 指定
	  cn=ud(eg)
	   if cn=184 or cn=185 or cn=186 or cn=197 or cn=202 : f=1 ; アンデッドである
	 swbreak
	 case 1 ; 前列
	  repeat 3,1
	   et=cnt : etf et
	    if en<=0 or ud(eg+26)<=0 : continue ; いない
	   cn=ud(eg)
	    if cn=184 or cn=185 or cn=186 or cn=197 or cn=202 : f=1 : break ; アンデッドである
	  loop
	 swbreak
	swend

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

	bts 51 : bw 20 ; エフェクト

	r1=rnd(ud(eg+26))
	r2=rnd(tadn+mho+ud(ug+35))

	 if r1>=r2 : return ; 抵抗した

	ud(eg+26)=0 : d_syo en ; 死亡処理


;bpk
	return


#deffunc smon int smonf,int smone ; 召還

	c=0
	repeat 3,1
	 if fs=1 : un2=fn1(cnt)
	 if fs=2 : un2=fn2(cnt)
	  if un2!0 and ud(un2*udb+26)>0 : c+
	loop
	if c=3 : return ; 隊列がいっぱい

	f=0
	repeat ub-1,1 ; 空きユニットNo.ピック
	 un2=cnt : ug2=un2*udb ; ユニットNo.
	  if ud(ug2)=0 : f=1 : break
	loop
	if f=0 : return ; ユニットいっぱい


	if smonf=1 : cn=136 ; ゴーレム
	if smonf=2 : cn=169 ; ウィスプ
	if smonf=3 or smonf=5 {
		r=rnd(3)
		 if r=0 : cn=184 ; ゾンビ
		 if r=1 : cn=185 ; グール
		 if r=2 : cn=186 ; スケルトン
	}
	if smonf=4{
		r=rnd(3)
		 if r=0 : cn=187 ; インプ
		 if r=1 : cn=196 ; デビル
		 if r=2 : cn=200 ; デーモン
	}

	repeat udb
	 ud(ug2+cnt)=0 ; データクリア
	loop

	ud(ug2)=cn	; cnキャラ種類
	repeat 9,1
	 ud(ug2+cnt)=cd(cnt,cn) ; データ
	loop
	repeat 5
	 ud(ug2+21+cnt)=ud(ug2+1+cnt) ; ステータスデータ
	loop
	ud(ug2+26)=ud(ug2+25) ; HP

	repeat 2 : ud(ug2+11+cnt)=ud(ug2+21) : loop ; 攻防値


	repeat 3 ; 空き戦闘ステータスにセット
	 if fs=1 : bsg=cnt*bsb
	 if fs=2 : bsg=(cnt+3)*bsb
	 if bs(bsg)=0 : bs(bsg)=un2 : break
	loop


	if fs=1 { ; 隊列にセット
	 n=ftp(fs,un) ; 召還者の隊列
	 switch n
	  case 1
	   smn=1
	   if ft1(fs1+2)>0 and ud(ft1(fs1+2)*udb+26)>0 : ft1(fs1+3)=ft1(fs1+2) ; 真ん中に誰かいる
	   ft1(fs1+2)=ft1(fs1+1) ; 一つ後ろへ詰める
	  swbreak
	  case 2
	   if ft1(fs1+1)=0 or ud(ft1(fs1+1)*udb+26)<=0 : smn=1 : swbreak ; 先頭が開いてる
	   ft1(fs1+3)=ft1(fs1+2) : smn=2 ; 一つ後ろへ詰める
	  swbreak
	  case 3
	   smn=2
	   if ft1(fs1+2)=0 or ud(ft1(fs1+2)*udb+26)<=0 : swbreak ; 真ん中が開いてる場合
	   ft1(fs1+1)=ft1(fs1+2) : ft1(fs1+2)=0 ; 一つ前へ詰める
	  swbreak
	 swend
	 ft1(fs1+smn)=0
	  if smonf=5 : bts 102 : else : bts smone
	   bw 17
	 ft1(fs1+smn)=un2 : bw 3 ; 召還
	}

	if fs=2 {
	 n=ftp(fs,un) ; 召還者の隊列
	 switch n
	  case 1
	   smn=1
	   if ft2(fs2+2)>0 and ud(ft2(fs2+2)*udb+26)>0 : ft2(fs2+3)=ft2(fs2+2) ; 真ん中に誰かいる
	   ft2(fs2+2)=ft2(fs2+1) ; 一つ後ろへ詰める
	  swbreak
	  case 2
	   if ft2(fs2+1)=0 or ud(ft2(fs2+1)*udb+26)<=0 : smn=1 : swbreak ; 先頭が開いてる
	   ft2(fs2+3)=ft2(fs2+2) : smn=2 ; 一つ後ろへ詰める
	  swbreak
	  case 3
	   smn=2
	   if ft2(fs2+2)=0 or ud(ft2(fs2+2)*udb+26)<=0 : swbreak ; 真ん中が開いてる場合
	   ft2(fs2+1)=ft2(fs2+2) : ft2(fs2+2)=0 ; 一つ前へ詰める
	  swbreak
	 swend
	 if smonf=5 : bts 102 : else : bts smone
	  bw 15
	 ft2(fs2+smn)=un2 ; 召還
	  bw 5
	}

	repeat 6
	 if smnfn(cnt)=0 : smnfn(cnt)=un2 : break; 召還un格納
	loop

	return


#deffunc suck ; 吸血

	rang fs,1 : if rangf=0 : return ; 射程外

	r1=rnd(ud(ug+22)/3+1) ; 魔力補整、自

	n=ud(eg+22)/3+ud(eg+35)+1
	 if ud(eg+7)=5 : n=n*120/100 ; 光種族なら抵抗20%up
	  r2=rnd(n) ; 魔力補整、敵

	suckn=ud(ug+9)+r1-r2 : if suckn<=0 : suckn=0 ; 吸血値

	n1=ud(ug+25)-ud(ug+26)
	if n1<=ud(eg+26) : n2=n1 : else : n2=ud(eg+26) ; 上限
	if suckn>n2 : suckn=n2 ; 吸血値を上限にセット

	ud(ug+26)+=suckn ; 自HP+
	ud(eg+26)-=suckn ; 敵HP-

	if fs=1 : dmp_set suckn,ut,3 : dmp_set suckn,3+et,1 ; ダメージ表示
	if fs=2 : dmp_set suckn,3+ut,3 : dmp_set suckn,et,1

	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 ; アイテム補整 -------
	n=0 : nn=0

	bsg=bsp(un) ; 戦闘ステータスNo.

	if zk2sf=0 or zk2sf=1 {	; 火 ----------------------------------------
	 n2=zk2sn+ud(ug+31)
	  if zk2sf=0 : bsg=bsp(un) : n2+=bs(bsg+7) ; エンチャント+

	 n3=0
	  bsg=bsp(en) : n3-=bs(bsg+18) ; ウォータースクリーン-

	 n=n2+n3-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

	 if n>0 : bsg=bsp(en) : bs(bsg+1)+=n/3  ; 火傷
	}

	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

	 if n>0 : bsg=bsp(en) : bs(bsg+2)+=n/2  ; コールド
	}

	if zk2sf=0 or zk2sf=3 {	; 風 -----------------------------------
	 n2=zk2sn+ud(ug+33) : mahif=0
	  if zk2sf=0 {
			bsg=bsp(un)
			 n2+=bs(bsg+9)	; エンチャント+
			 n2+=bs(bsg+10) : mahif=1 ; エンチャント+
	  }

	 n3=0
	  bsg=bsp(en) : n3+=bs(bsg+18) ; ウォータースクリーン+

	 n=zk2sn+n3+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

	 if mahif=1 or itn=283 or itn=288 { ; 麻痺
		r1=0 : r2=0
		repeat 2
		 r1+=rnd(ud(eg+22)+1)	; 魔力抵抗値
		 r2+=rnd(n+1)			; 麻痺値
		loop
		if r1<r2 : bs(bsg+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

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

	if zk2sf=0 or zk2sf=5 { ; 光
	 n=0 : nn=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) ; エンチャント+

	 n3=0
	  bsg=bsp(en) : n3-=bs(bsg+18) ; ウォータースクリーン-

	 nn=n2-n+n3+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

	}

	if zk2sf=0 or zk2sf=6 { ; 闇
	 n=0 : nn=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) ; エンチャント+

	 n3=0
	  bsg=bsp(en) : n3+=bs(bsg+18) ; ウォータースクリーン-

	 nn=n2+n+n3-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
	}

	return zk2sg



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

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

	bsg=bsp(un) ; 戦闘ステータスNo.


	n=0
	if fs=1 : n+=zenkou(1) ; 自攻勢率
	if fs=2 : n+=zenkou(3) ; 敵攻勢率

	atkg=(dmgn)*(gsr+zk1+n)/100 ; 攻撃力

	n1=0
	if fs=1 : n1+=zenkou(2) ; 自防衛率
	if fs=2 : n1+=zenkou(4) ; 敵防衛率


	switch dmgf
	 case 1 ; 物理
	  atn=0 : repeat 2 : atn+=rnd(atkg+1) : loop	; 攻撃値

	  n2=0
	   if ud(eg+8)=21 : n2+=ud(eg+9)	; ディフェンス
	   bsg=bsp(en) : n2+=bs(bsg+15)		; 戦闘ステータス、防御
	  r=(ud(eg+12)+n2)*(100+n1)/100+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)*(100+n1)/100+1	; 敵の魔力
	   dfn=0 : repeat 2 : dfn+=rnd(r) : loop ; 防御値
	 swbreak
	 case 3 ; 特殊
	  atn=0	; 特殊の攻撃値
	  dfn=0	; 特殊の場合防御無し
	 swbreak
	swend

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

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

	if dm=0 { ; miss
		n=dm  : cn=0

		return
	}

	if dm>0 and ud(ug)=154 : temp 0,ud(ug+9) ; キューピッドのチャーム

	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

	if ud(ug+8)=42 and dmgf=1 { ; 兜割
	 if id(ig+19)=1 or id(ig+19)=2 or id(ig+19)=4 {; 剣、大剣、斧
	  if id(ig+16)=2 { ; 右両手持ち
	   r1=rnd(dm+1)
	   r2=rnd(ud(eg+26)+1)

	   if r1>r2 : ud(eg+26)=0 : d_syo en : return ; 成功
	  }
	 }
	}

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

	if ud(eg+26)=0 : d_syo en : return ; 死亡処理


	if ud(ug+8)=10 : bs(bsg+1)+=ud(ug+9) ; 火傷


	cn=ud(ug) ; ユニット種類

	if cn=181 or cn=182 : bsg=bsp(en) : bs(bsg+6)+=ud(ug+9) ; 毒ヘビ、サソリの毒

	if cn=34 : bs(bsg+3)+=ud(ug+9)		; ローパー麻痺、必ずかかる
	if cn=184 or cn=185 : mahi 0,3,0	; ゾンビ、グール麻痺

	if ud(ug+8)=13 : stun ud(ug+9)+dm/8 ; ベアー、イエティ、サイクロプス、のスタン;ミノタウロスcn=118 or cn=127 or cn=133cn=203

	return


#deffunc atk_syo ;int atk_syon,int atk_syoc ; 攻撃処理

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

	n=0
	 if ud(ug+8)=20 : n+=ud(ug+9)	; バーサーク
	 bsg=bsp(un) : n+=bs(bsg+14)	; 戦闘ステータス、攻撃

	dmg 1,atkn2+n					; ダメージ処理
	 if ud(eg+26)=0 : scream en,un	; 絶叫処理

	if ud(ug+8)=14 and ud(eg+26)>0 and dm>0 : tad 0,ud(ug+9) ; ターンアンデッド


	if atkf2!1 : return ; 武器以外は戻る
	 if id(ig+8)=36 and dm>0 : temp 0,id(ig+9) ; 魅惑

	return


#deffunc atk int atkf,int atkn,int atkrg
; 攻撃(フラグ(0=素手、1=武器、2=魅惑)、攻撃値、射程) -------

	atkn2=atkn : atkf2=atkf ; 攻撃処理用フラグ

	switch atkf
	 case 0 ; 素手
	  if  us=129  or us=94 : swbreak	; 物理アタックしない
	  rang fs,atkrg : if en=0 : swbreak	; 射程外
	   bts 1 : atk_syo : bw 20			; 表示、攻撃処理
	 swbreak
	 case 1 ; 武器
	  if id(ig+19)=7 or id(ig+19)=8 or id(ig+19)=9 or id(ig+19)=10 { ; 弓、ボウガン、銃、手裏剣
	   if ud(ug+8)=24 : brang atkrg : if en>0 : bts 3 : atk_syo : bw 20 : swbreak	; スナイピング
	   if ud(ug+8)=25 : rang fs,atkrg+1 : if en>0 : bts 3 : atk_syo : bw 20 : swbreak	; 強弓
	   if ud(ug+8)=26 { ; 貫通
		repeat 3,1 : et=cnt
		 if atkrg<(ut-1)+et : break				; 射程外
		  etf et : if en=0 : continue			; 隊列にいない
		 atk_syo : gsr-=25		; 攻撃処理
		loop
		bts 3 : bw 20
		swbreak
	   }
	   rang fs,atkrg : if en=0 : swbreak ; 射程外
	    bts 3 : atk_syo : bw 20 ; 投射武器、表示、攻撃処理
	  }

	  rang fs,atkrg : if en=0 : swbreak
	   bts 2 : atk_syo : bw 20 ; 近接武器、表示、攻撃処理
	 swbreak
	 case 2 ; 魅惑
	  bts 1 : atk_syo : bw 20 ; 攻撃処理
	 swbreak
	swend

	return


#deffunc matk_syo ; 魔法攻撃処理

	zk1=zk_syo(ud(ug+7))		; 種族属性補整
	zk2=zk2_syo(mzk2,matkn2)	; アイテム属性補整
	 dmg 2,ud(ug+22)

	return


#deffunc matk int matkf,int mzk,int matkn,int matkrg,int matke
; 魔法攻撃(フラグ、属性、攻撃値、射程、エフェクト) -------

	mzk2=mzk : matkn2=matkn

	switch matkf
	 case 0 ; 手前の一体 --------------
	  rang fs,matkrg : if en=0 : swbreak ; 射程判定
	   bts matke : matk_syo : bw 20
	 swbreak
	 case 1 ; 後列の一体 --------------
	  brang matkrg : if en=0 : swbreak ; 射程判定
	   bts matke : matk_syo : bw 20
	 swbreak
	 case 2 ; 貫通 --------------
	  n1=ut+2 : if n1>matkrg : n2=matkrg : else : n2=n1 ; 距離
	  rang fs,n2 : if en=0 : swbreak ; 射程判定
	  et=n2-ut+1 ; 最後尾
	  bts matke : matk_efg=efg : bwc=0 ; エフェクト表示

	  repeat 3,1 : et=cnt
	   repeat ; 移動ウエイト
	    bwc+ : bw 1 : if bwc>20 : break
		if itn=268 or itn=288 : break ; 津波
	    if fs=1 : if ef(matk_efg+6)>=btlx2+btlxk*(et-1)+0 : break ; 対象の座標xに来た
	    if fs=2 : if ef(matk_efg+6)<=btlx1+btlxk*(3-ut)+0 : break
	   loop

	   if matkrg<(ut-1)+et : break	; 射程外
	    etf et : if en=0 : continue	; いない
		 matk_syo : gsr-=25			; 威力減衰
	  loop

	  repeat ; 残りのエフェクトウエイト
	   if bwc>20 : break
	   bwc+ : bw 1
	  loop
	 swbreak
	 case 3 ; 全列 --------------
	 rang fs,matkrg : if en=0 : swbreak ; 射程判定
	  if itn!328 : et=2 : bts matke : et=2 ; エフェクト表示

	  repeat matkrg-ut+1,1
	   if cnt=4 : break ; 射程外
	   et=cnt : etf et : if en=0 : continue ; 隊列にいない
		matk_syo
		if itn=328 : bts matke ; エフェクト表示
	  loop
	  bw 20 ; 表示ウエイト
	 swbreak
	 case 4 ; 着弾範囲型 --------------
	  f=0
	  repeat 3,1 ; 3体いるか
	   etf cnt : if en=0 : f=1 : break
	  loop
	  if matkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか
	  if f=0 { ; 3体の場合
	   et=2 : bts matke : bw 10 ; 弾道エフェクト
	   gsr=100	; 中央
	    et=2 : etf et : matk_syo : bts 90
	   gsr=75	; 左右
	    et=1 : etf et : matk_syo : bts 90
	    et=3 : etf et : matk_syo : bts 90
	     bw 10	; 爆発ウエイト
	   swbreak
	  }
	  rang fs,matkrg : if en=0 : swbreak		; 射程内に敵がいなかった
	   bts matke : bw 10					; 弾道エフェクト
	    gsr=100 : matk_syo : bts 90			; 1体目
	  et+ : if et>3 : swbreak				; 範囲外
	   etf et : if en=0 : bw 10 : swbreak	; 2体目にいない
	    gsr=75 : matk_syo : bts 90 : bw 10	; 2体目
	 swbreak
	 case 5 ; 押し出し
	  rang fs,matkrg : if en=0 : swbreak ; 射程判定
	   matk_syo : bts matke : if itn=308 : bw 10 : else : bw 15
	  if et=3 : swbreak ; 最後列
	  if fs=1 : if fn2(et+1)=0 or ud(fn2(et+1)*udb+26)<=0 : fn2(et+1)=fn2(et) : fn2(et)=0 ; 押し出し
	  if fs=2 : if fn1(et+1)=0 or ud(fn1(et+1)*udb+26)<=0 : fn1(et+1)=fn1(et) : fn1(et)=0 ; 押し出し
	   if itn=308 : bw 10 : else : bw 5
	 swbreak
	 case 6 ; 引き寄せ
	  rang fs,matkrg : if en=0 : swbreak ; 射程判定
	  if et=1 : swbreak ; 最前列
	   bts matke : bw 10
	  if fs=1 : if fn2(et-1)=0 or ud(fn2(et-1)*udb+26)<=0 : fn2(et-1)=fn2(et) : fn2(et)=0
	  if fs=2 : if fn1(et-1)=0 or ud(fn1(et-1)*udb+26)<=0 : fn1(et-1)=fn1(et) : fn1(et)=0
	   bw 10
	 swbreak
	 case 7 ; ランダム1体
	  if fs=1 : n=2 : else : n=1
	   en=rdp(n) : if en=0 : swbreak ; unNo.決定
	    eg=en*udb : matk_syo : bts matke : bw 20
	 swbreak
	swend

	return


#deffunc tatk_syo ; 魔法攻撃処理

	zk1=0 ; 種族属性補整
	zk2=zk2_syo(tzk2,tatkn2)	; 特殊のアイテム属性補整
	 dmg 3,tatkn2

	return


#deffunc tatk int tatkf,int tzk,int tatkn,int tatkrg,int tatke ; 特殊攻撃(属性、攻撃値、射程) -------

	tzk2=tzk : tatkn2=tatkn

	zk1=0 ; 種族属性補整

	switch tatkf
	 case 0 ; 手前の一体 --------------
	  rang fs,tatkrg : if en=0 : swbreak ; 射程内に敵がいなかった
	   tatk_syo : bts tatke : bw 20
	 swbreak
	 case 1 ; 後列の一体 --------------
	 swbreak
	 case 2 ; 貫通
	  bpf=0
	  repeat 3,1 : et=cnt
	   if tatkrg<(ut-1)+et : break		; 射程外
	   etf et : if en=0 : continue	; 隊列にいない
	   eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0
	   tatk_syo
	   if ud(ug+8)=52 and dm>0 : mahi 0,ud(ug+9)/4,0
	   gsr-=25							; 威力減衰
	   bpf=1
	  loop
	  if bpf=0 : swbreak				; 標的が無かったのでエフェクト無し
	  bts tatke : bw 20
	 swbreak
	 case 3 ; 全列 --------------
	  rang fs,tatkrg : if en=0 : swbreak ; 射程判定

	  repeat n,1
	   et=cnt : etf et : if en=0 : continue ; 隊列にいない
	   eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0
	   tatk_syo
	  loop

	  et=2
	  repeat 1 ; エフェクト表示
	   if ud(ug+8)!64 : bts tatke : break
	   repeat 3,1
	    et=cnt : bts tatke ; ダークスファイア
	   loop
	  loop
	  bw 20 ; 表示ウエイト
	 swbreak
	 case 4 ; 着弾範囲型 --------------
	  f=0
	  repeat 3,1 ; 3体いるか
	   etf cnt : if en=0 : f=1 : break
	  loop
	  if tatkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか
	  if f=0 { ; 3体の場合
	   et=2 : bts 114 : bw 10 ; 弾道エフェクト
	   gsr=100	; 中央
	    et=2 : etf et : tatk_syo : bts 113
	   gsr=75	; 左右
	    et=1 : etf et : tatk_syo : bts 113
	    et=3 : etf et : tatk_syo : bts 113
	     bw 10	; 爆発ウエイト
	   swbreak
	  }
	  rang fs,tatkrg : if en=0 : swbreak ; 射程内に敵がいなかった
	   bts 114 : bw 10 ; 弾道エフェクト

	   tatk_syo : bts 113; 1体目
	   et+ : etf et : if en=0 : bw 10 : swbreak ; 2体目にいない
	   gsr=75 : tatk_syo : bts 113 ; 2体目
	   bw 10 ; 爆発ウエイト
	 swbreak
	 case 5 ; 咆哮
	  repeat 3,1
	   et=cnt : etf et : if en=0 : continue ; 隊列にいない
	   stun ud(ug+21)/5;+ud(ug+9)
	  loop
	  bts 108 : bw 20
	 swbreak
	 case 6 ; ホーリーブレス
	  repeat 3,1 : et=cnt
	   if tatkrg<(ut-1)+et : break	; 射程外
	   etf et : if en=0 or ud(eg+7)!6 : continue ; 隊列にいない、闇では無い
	   tatk_syo
	    tad 0,ud(eg+9)				; ターンアンデッド
	     gsr-=25					; 威力減衰
	  loop
	  bts tatke : bw 20
	 swbreak
	 case 7 ; ランダム1体
	  if fs=1 : n=2 : else : n=1
	   en=rdp(n) : if en=0 : swbreak ; unNo.決定
	    eg=en*udb : tatk_syo
	     bts tatke : bw 20
	 swbreak
	 case 8 ; ポイズンブレス
	  repeat 3,1 : et=cnt
	   if tatkrg<(ut-1)+et : break	; 射程外
	    etf et : if en=0 : continue	; 隊列にいない
	     poi 0,tatkn,0
	  loop
	  bts tatke : bw 20
	 swbreak
	swend

	return


#deffunc temp_atk ; 魅惑状態の行動

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

	if fs=1 { ; 味方への攻撃
		fs=2
		if ut=1 or ut=3 : if ft1(fs1+2)>0 : et=2 : en=ft1(fs1+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目
		if ut=2 {
			if ft1(fs1+1)>0 and ft1(fs1+3)>0 {
				r=rnd(2) : if r=0 : en=ft1(fs1+1) : et=1 : else : en=ft1(fs1+3) : et=3
				eg=en*udb : atk 2,ud(ug+11),0 : return
			}
			if ft1(fs1+1)>0 : en=ft1(fs1+1) : eg=en*udb : et=1 : atk 2,ud(ug+11),0 : return
			if ft1(fs1+3)>0 : en=ft1(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 ft2(fs2+2)>0 : et=2 : en=ft2(fs2+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目
		if ut=2 {
			if ft2(fs2+1)>0 and ft2(fs2+3)>0 {
				r=rnd(2) : if r=0 : et=1 : en=ft2(fs2+1) : else : et=3 : en=ft2(fs2+3)
				eg=en*udb : atk 2,ud(ug+11),0 : return
			}
			if ft2(fs2+1)>0 : en=ft2(fs2+1) : et=1 : eg=en*udb : atk 2,ud(ug+11),0 : return
			if ft2(fs2+3)>0 : en=ft2(fs2+3) : et=3 : eg=en*udb : atk 2,ud(ug+11),0 : return
		}
	}

	return


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

	en=0	; 敵ユニットNo.
	itn=0	; アイテムNo.

	mho=ud(un*udb+22)/5 ; 魔力補整


; ユニット特殊、魔法

	bsg=bsp(un)
	 if bs(bsg+3)>0 : bts 91 : bw 20 : dgs "麻痺 ",a,12 : /*bpk*/ : return	; 麻痺により行動不能
	 if bs(bsg+4)>0 : bts 92 : bw 20 : dgs "スタン ",a,12 : /*bpk*/ : return	; 気絶により行動不能

	gsr=100 ; 攻撃減衰率

	 if bs(bsg+5)>0 : bts 93 : dgs "魅惑 ",a,12 : /*bpk*/ : temp_atk : /*bpk*/ : return ; 魅惑時の行動


	if ud(ug+8)=16 : if ud(ug)=195 or ud(ug)=201 : bpn=30 : temp 1,ud(ug+9) ; 魅惑の瞳
	if ud(ug+8)=31 : bpn=31 : smon 5				; ネクロマンサー
	if ud(ug+8)=32 : bpn=32 : suck : bts 103 : bw 20	; 吸血
	if ud(ug+8)=35 {								; ナイトメア
		bpn=35
		tatk 7,6,ud(ug+9),5,104
		mahi 0,ud(ug+9),5
	}
	if ud(ug+8)=50 : bpn=50 : tatk 2,1,ud(ug+9),3,105	; ファイヤーブレス
	if ud(ug+8)=51 : bpn=51 : tatk 2,2,ud(ug+9),3,106	; コールドブレス
	if ud(ug+8)=52 : bpn=52 : tatk 2,3,ud(ug+9),3,107	; サンダーブレス
	if ud(ug+8)=53 : bpn=53 : tatk 5,0,0,0,108			; 咆哮
	if ud(ug+8)=54 : bpn=54 : tatk 6,5,ud(ug+9),5,109	; ホーリーブレス
	if ud(ug+8)=55 : bpn=55 : tatk 8,6,ud(ug+9),4,110	; ポイズンブレス
	if ud(ug+8)=56 : bpn=56 : tatk 2,2,ud(ug+9),4,111	; 津波

	if ud(ug+8)=60 : bpn=60 : tatk 0,1,ud(ug+9),1,112	; 火の息
	if ud(ug+8)=61 : bpn=61 : tatk 4,1,ud(ug+9),3,0		; ファイヤーボール
	if ud(ug+8)=62 : bpn=62 : tatk 3,1,ud(ug+9),4,115	; ファイヤーストーム
	if ud(ug+8)=63 : bpn=63 : tatk 3,2,ud(ug+9),5,116	; コールドストーム
	if ud(ug+8)=64 : bpn=64 : tatk 3,6,ud(ug+9),5,117	; ダークフレイム
	if ud(ug+8)=65 : bpn=65 : tatk 3,3,ud(ug+9),5,118	; ウインドストーム


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


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

	 gsr=100 ; 減衰率リセット

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

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

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

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

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

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

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


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

	screamf=0	; 絶叫フラグ

	gsr=100		; 攻撃減衰率

	n=1
	if ud(ug+8)=40 : n=2 ; 2回攻撃
	if ud(ug+8)=41 : n=3 ; 3回攻撃
	repeat n ;-------------------------------------------------------------

	 if ud(ug+16)=0 and ut=1 : gensui=120 : atk 0,ud(ug+11),1 : bpn=5 : ;bpk; 素アタック
	  if screamf=1 : break ; 絶叫により死亡

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

	  repeat 1 ; 右手
	   if ud(ug+40)=0 { ; 素手
	    in=ud(ug+41) : ig=in*idb
	    if ud(ug+41)=0 or id(ig+16)=5 { ; 左手が素手か盾

		 atk 0,ud(ug+11),1 : gsr=75 : break ; 右素手攻撃
	    }
	   }
	   if ud(ug+40)>0 { ; 右手武器
	    in=ud(ug+40) : ig=in*idb
	    atk 1,ud(ug+11)+id(ig+11),id(ig+17) ; 右手武器攻撃
	    gsr=75
	   }
	  loop
	  if screamf=1 : break ; 絶叫により死亡

	  repeat 1 ; 左手
	   if ud(ug+40)=0 and ud(ug+41)=0 : atk 0,ud(ug+11),1 : bpn=3 : /*bpk*/ : break ; 素手なら左素手攻撃
	   if ud(ug+41)>0 { ; 左手武器
	    in=ud(ug+41) : ig=in*idb
	    atk 1,ud(ug+11)+id(ig+11),id(ig+17) ; 左手武器攻撃
	   }
	  loop
	  if screamf=1 : break ; 絶叫により死亡

	 } ; -------------------------------------------

	 if ud(ug+16)>2 { ; 複数手 ---------------
	  repeat ud(ug+16) ; 手数
	   if screamf=1 : break ; 絶叫により死亡

	   if ud(ug+40+cnt)=0 : atk 0,ud(ug+11),1 : gsr-=25 : bp 1 : /*bpk*/ : continue ; 素手

	   if ud(ug+40+cnt)>0 { ; 武器
	    in=ud(ug+40+cnt) : ig=in*idb
	    if id(ig+16)!5 : atk 1,ud(ug+11)+id(ig+11),id(ig+17) : gsr-=25 : bp 2 :; bpk; 盾で無ければ攻撃
	   }
	    if screamf=1 : break ; 絶叫により死亡
	  loop
	 } ; --------------------------------------
	 if screamf=1 : break ; 絶叫により死亡
	loop ; ----------------------------------------------------------------


	repeat 1 ; 再生
	 if ud(ug+8)!33 : break ; 再生持って無い
	 n2=ud(ug+25)-ud(ug+26)	; HP減った値
	  if n2=0 : break		; 減ってない

	 n1=ud(ug+9)			; 再生値
	  if n1>n2 : n1=n2		; 上限セット

	 ud(ug+26)+=n1			; HP+
	  if fs=1 : n=0 : else : n=3
	  dmp_set n1,n+ut,3		; 表示
	   bts 96 : bw 20		; エフェクト
	loop


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

	return


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

	btn=0 ; ターン

	fg1=fc1\3+1 : fs1=(fg1-1)*3 ; 戦闘する部隊
	fg2=fc2\3+1 : fs2=(fg2-1)*3

	repeat 3,1 ; 敵ユニットNo.格納
	 fn1(cnt)=ft1(fs1+cnt)
	 fn2(cnt)=ft2(fs2+cnt)
	loop

	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 4,1 : zenkou(cnt)=0 : loop ; リセット
	repeat 3,1 ; 攻勢、防衛
	 un=fn1(cnt) : ug=un*udb
	  if un>0 and ud(ug+26)>0 {
		if ud(ug+8)=1 : zenkou(1)+=ud(ug+9) ; 攻勢値
		if ud(ug+8)=2 : zenkou(2)+=ud(ug+9) ; 防衛値
	 }
	 un=fn2(cnt) : ug=un*udb
	  if un>0 and ud(ug+26)>0 {
		if ud(ug+8)=1 : zenkou(3)+=ud(ug+9) ; 攻勢値
		if ud(ug+8)=2 : zenkou(4)+=ud(ug+9) ; 防衛値
	 }
	loop

	repeat 3,1 ; 初期隊列un格納
	 sfn(cnt)=fn1(cnt)
	 sfn(3+cnt)=fn2(cnt)
	loop


repeat 3 ; 3回戦闘

	btn+

; イニシアティブ --------------

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

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

	repeat 3 : cnt2=cnt ; 値計算
	 cn1=cnt+1
	 cn2=cnt+1

	 if fn1(cn1)>0 { ; 攻勢側
		un=fn1(cn1) : ug=un*udb
	 	 intv(cnt)=un

		n=0 : bsg=bsp(un)	; 補整
		 if ud(ug+8)=22 : n+=ud(ug+9)	; 速攻
		 n+=bs(bsg+16)-bs(bsg+17)		; 戦闘ステータス
		 n-=bs(bsg+2) : if n<0 : n=0	; コールド

		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) ; 速攻

		bsg=bsp(fn2(cn2)) : n+=bs(bsg+16)-bs(bsg+17) ; 戦闘ステータス

		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 : us=ud(ug) ; ユニットNo.
	 if un=0 : continue ; ユニットが無い
	 if ud(ug+26)<=0 : continue ; HPが0

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

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

	 gosub *atack ; 攻撃処理

	loop

	yhf=0 : cslf=1 ; 表示フラグ
	repeat 6 ; 火傷
	 n7=bs(cnt*bsb+1)			; 火傷値
	 if n7<=0 : continue		; 火傷無い
	 un=bs(cnt*bsb) : ug=un*udb : utfss un : bts 94 : yhf=1
	  n1=ud(ug+26)
	   ud(ug+26)-=n7 : if ud(ug+26)<0 : ud(ug+26)=0 ; ダメージ
	    n2=ud(ug+26) : n3=n1-n2 : n4=fsp(un) : n5=ftp(n4,un)
	 if n4=1 : dmp_set n3,n5,1	; ダメージ表示
	 if n4=2 : dmp_set n3,3+n5,1
	 if ud(ug+26)=0 : d_syo un : continue	; 死亡処理
	 n7=n7/2 : bs(cnt*bsb+1)=n7	; 半減
	loop
	if yhf=1 : bw 20
	cslf=0

	phf=0 : cslf=1 ; 表示フラグ
	repeat 6 ; 毒
	 n7=bs(cnt*bsb+6)			; 毒値
	  if n7<=0 : continue		; 毒無い
	 un=bs(cnt*bsb) : ug=un*udb : utfss un : bts 95 : yhf=1
	  n1=ud(ug+26)
	   ud(ug+26)-=n7 : if ud(ug+26)<0 : ud(ug+26)=0 ; ダメージ
	    n2=ud(ug+26) : n3=n1-n2 : n4=fsp(un) : n5=ftp(n4,un)
	 if n4=1 : dmp_set n3,n5,6		; ダメージ表示
	 if n4=2 : dmp_set n3,3+n5,6
	 if ud(ug+26)=0 : d_syo un : continue ; 死亡処理
	 n7=n7/2 : bs(cnt*bsb+6)=n7	; 半減
	loop
	if phf=1 : bw 20
	cslf=0

	repeat 6*bsb ; 魔法効果半減処理
	 if cnt\bsb=0 : continue ; un
	 if cnt\bsb=16 or cnt\bsb=17 : continue ; 加速減速は半減されない
	 if cnt\bsb=1 or cnt\bsb=6 : continue ; 火傷、毒はここでは半減されない	 
	 if bs(cnt)>0 : bs(cnt)=bs(cnt)/2 ; 半減
	loop

	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


	redraw 0 ; 表示
	  color 0,0,0 : boxf : color 255,255,255
	 btl_put
	 dmp_put
	 dg_put
	redraw 1

	fn_syo : if fn_syof=1 : break ; 隊列処理、全滅した

loop

	repeat 6 ; 召還削除
	 if smnfn(cnt)>0 : d_syo smnfn(cnt) ; 死亡処理
	 smnfn(cnt)=0
	loop

	repeat 3,1 ; ユニットNo.格納
	 ft1(fs1+cnt)=fn1(cnt)
	 ft2(fs2+cnt)=fn2(cnt)
	loop

	return


 
*battle ; 戦闘メイン ////////////////////////////////

	btvf=0	; 勝利フラグ

	repeat 1 ; -------------------------------------------------

	 repeat 4 : ff1(cnt)=0 : ff2(cnt)=0 : loop ; リセット

	 repeat 3 : cnt2=cnt ; 部隊が存在するか
	  repeat 3
	   un=mu(kn1*10+cnt2*3+cnt+1)
	   if un=0 or ud(un*udb+26)<=0 : continue
	   ff1(cnt2+1)=1 : ff1(0)=1 : break
	  loop
	  repeat 3
	   un=mu(kn2*10+cnt2*3+cnt+1)
	   if un=0 or ud(un*udb+26)<=0 : continue
	   ff2(cnt2+1)=1 : ff2(0)=1 : break
	  loop
	 loop

	 if ff2(0)=0 : btvf=1 : break; 防衛部隊が無いので勝利


; ユニットNo.ひかえ ---------

	 repeat 3 : cnt2=cnt
	  repeat 3,1
	   un=mu(kn1*10+cnt2*3+cnt)
	    if ud(un*udb+26)>0 : ft1(cnt2*3+cnt)=un : else : ft1(cnt2*3+cnt)=0
	   un=mu(kn2*10+cnt2*3+cnt)
	    if ud(un*udb+26)>0 : ft2(cnt2*3+cnt)=un : else : ft2(cnt2*3+cnt)=0
	  loop
	 loop


; 戦闘部隊差配 -------------

	 fc1=0 : fc2=0 ; 部隊No.

	 repeat 3	; 攻撃側
	  if ff1(fc1\3+1)=0 : fc1+ : continue

	  bf=0 ; 不戦勝フラグ
	  repeat 3	; 防衛側
	   if ff2(fc2\3+1)=1 : gosub *fight : fc2+ : bf=1 : break
	   fc2+
	  loop
	  if bf=0 : btvf+ ; 不戦勝

	  if ff1(0)=0 or ff2(0)=0 : break ; どちらかが全滅した

	  fc1+
	 loop

	 if ff1(0)=0 or ff2(0)=0 : break ; どちらかが全滅した

	 repeat 3	; 防衛側
	  if fc2>=3 : break ; 全部隊戦闘したので終わり
	  if ff2(fc2\3+1)=0 : fc2+ : continue

	  bf=0 ; 不戦負フラグ
	  repeat 3	; 攻撃側
	   if ff1(fc1\3+1)=1 : gosub *fight : fc1+ : bf=1 : break
	   fc1+
	  loop
	  if bf=0 : btvf- ; 不戦負

	  if ff1(0)=0 or ff2(0)=0 : break ; 全滅した

	  fc2+
	 loop

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

	hextf=0

; 勝敗処理 ----------------

	if btvf>0 { ; 勝利

		mpl(kn)=1

		clrf=1
		repeat 25,1
		 if map(cnt)=0 : continue
		 if mpl(cnt)!1 : clrf=0 : break
		loop
		if clrf=1 : mainf=7 : kc=10 ; GAME CLEAR
	}

	return

コメントを残す

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