特殊攻撃を追加


2017年 11月1日
 
 
 たぶん今一番ややこしい箇所になってる。
 やっぱり戦闘部分が一番複雑かもしれない。

 今回は特殊攻撃を追加して、合わせてプログラムも改変している。
 改変自体はまだまだどんどん続くだろう。

 そういえば前にプログラムを適性化してはならないと言ったけど、それは完成して動いてるやつね。
 それもたぶん、なるべくしない方が良いくらいのニュアンスだと思う。

 
 ではソースを

#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 ; 光
	}

	return zksn


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

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

	if zk2sf=0 or zk2sf=1 : if ud(ug+31)>0 { ; 火
	 n=ud(ug+31)-ud(eg+32)+ud(eg+34)-ud(eg+36)+ud(eg+35) ; 火値-水+地-闇+光
	  if n>ud(ug+31) : n=ud(ug+31)	; 最大値
	  if n<0 and n<ud(ug+31) : n=-ud(ug+31)	; 最小値

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

	if zk2sf=0 or zk2sf=2 : if ud(ug+32)>0 { ; 水
	 n=ud(ug+32)-ud(eg+33)+ud(eg+31)-ud(eg+36)+ud(eg+35) ; 水値-風+火-闇+光
	  if n>ud(ug+32) : n=ud(ug+32)	; 最大値
	  if n<0 and n<ud(ug+32) : n=-ud(ug+32)	; 最小値

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

	if zk2sf=0 or zk2sf=3 : if ud(ug+33)>0 { ; 風
	 n=ud(ug+33)-ud(eg+34)+ud(eg+32)-ud(eg+36)+ud(eg+35) ; 風値-地+水-闇+光
	  if n>ud(ug+33) : n=ud(ug+33)	; 最大値
	  if n<0 and n<ud(ug+33) : n=-ud(ug+33)	; 最小値

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

	if zk2sf=0 or zk2sf=4 : if ud(ug+34)>0 { ; 地
	 n=ud(ug+34)-ud(eg+31)+ud(eg+33)-ud(eg+36)+ud(eg+35) ; 地値-火+風-闇+光
	  if n>ud(ug+34) : n=ud(ug+34)	; 最大値
	  if n<0 and n<ud(ug+34) : n=-ud(ug+34)	; 最小値

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

	if zk2sf=0 or zk2sf=5 : if ud(ug+35)>0 { ; 光
	 n=0
	 repeat 4
	  if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt)
	 loop
	 nn=ud(ug+35)-n+ud(eg+36)
	  if nn>ud(ug+35) : nn=ud(ug+35)	; 最大値
	  if nn<0 and nn<ud(ug+35) : nn=-ud(ug+35)	; 最小値

	 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
	 }
	 zk2sn+=nn
	}

	if zk2sf=0 or zk2sf=6 : if ud(ug+36)>0 { ; 闇
	 n=0
	 repeat 4
	  if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt)
	 loop
	 nn=ud(ug+36)+n-ud(eg+35)
	  if nn>ud(ug+36) : nn=ud(ug+36)	; 最大値
	  if nn<0 and nn<ud(ug+36) : nn=-ud(ug+36)	; 最小値

	 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
	 }
	 zk2sn+=nn
	}

	return zk2sn


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

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

	if zk3sf=0 or zk3sf=1 { ; 火
	 zk3sg2=zk3sg+ud(ug+31)
	 n=zk3sg2-ud(eg+32)+ud(eg+34)-ud(eg+36)+ud(eg+35) ; 火値-水+地-闇+光
	  if n>zk3sg2 : n=zk3sg2	; 最大値
	  if n<0 and n<zk3sg2 : n=-zk3sg2	; 最小値

	 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
	 }
	 zk3sn+=n
	}

	if zk3sf=0 or zk3sf=2 : if ud(ug+32)>0 { ; 水
	 zk3sg2=zk3sg+ud(ug+32)
	 n=zk3sg+ud(ug+32)-ud(eg+33)+ud(eg+31)-ud(eg+36)+ud(eg+35) ; 水値-風+火-闇+光
	  if n>zk3sg2 : n=zk3sg2	; 最大値
	  if n<0 and n<zk3sg2 : n=-zk3sg2	; 最小値

	 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
	 }
	 zk3sn+=n
	}

	if zk3sf=0 or zk3sf=3 : if ud(ug+33)>0 { ; 風
	 zk3sg2=zk3sg+ud(ug+33)
	 n=zk3sg+ud(ug+33)-ud(eg+34)+ud(eg+32)-ud(eg+36)+ud(eg+35) ; 風値-地+水-闇+光
	  if n>zk3sg2 : n=zk3sg2	; 最大値
	  if n<0 and n<zk3sg2 : n=-zk3sg2	; 最小値

	 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
	 }
	 zk3sn+=n
	}

	if zk3sf=0 or zk3sf=4 : if ud(ug+34)>0 { ; 地
	 zk3sg2=zk3sg+ud(ug+34)
	 n=zk3sg2-ud(eg+31)+ud(eg+33)-ud(eg+36)+ud(eg+35) ; 地値-火+風-闇+光
	  if n>zk3sg2 : n=zk3sg2	; 最大値
	  if n<0 and n<zk3sg2 : n=-zk3sg2	; 最小値

		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
		}
		zk3sn+=n
	}

	if zk3sf=0 or zk3sf=5 : if ud(ug+35)>0 { ; 光
	 n=0
	 repeat 4
	  if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt)
	 loop
	 zk3sg2=zk3sg+ud(ug+35)
	 nn=zk3sg2-n+ud(eg+36)
	  if nn>zk3sg2 : nn=zk3sg2	; 最大値
	  if nn<0 and nn<zk3sg2 : nn=-zk3sg2	; 最小値

	 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
	 }
	 zk3sn+=nn
	}

	if zk3sf=0 or zk3sf=6 : if ud(ug+36)>0 { ; 闇
	 n=0
	 repeat 4
	  if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt)
	 loop
	 zk3sg2=zk3sg+ud(ug+36)
	 nn=zk3sg2+n-ud(eg+35)
	  if nn>zk3sg2 : nn=zk3sg2	; 最大値
	  if nn<0 and nn<zk3sg2 : nn=-zk3sg2	; 最小値

	 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
	 }
	 zk3sn+=nn
	}

	return zk3sn



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

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

	atkg=dmgn*(gensui+zk1+zk3)/100 ; 攻撃力

	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

	dm=atn-dfn : if dm<0 : dm=0 ; 基礎ダメージ
	dm=dm+(zk2*gensui/100) ; ダメージ+属性ダメージ

	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 ; 攻撃したかフラグ

	if ud(ug+8)=24 { ; スナイピング
	 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
	}

	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 atk int atkn,int atkrg ; 攻撃(攻撃値、射程) -------

	rang atkrg ; 射程判定
	if rangf=0 : return ; 射程内に敵がいなかった

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

	dmg 1,atkn


	return


#deffunc matk int mzk,int matkn,int matkrg ; 魔法攻撃(攻撃値、射程) -------

	rang matkrg ; 射程判定
	if rangf=0 : return ; 射程内に敵がいなかった

	zk1=zk_syo(ud(ug+7)); 種族属性補整
	zk2=zk2_syo(mzk)	; アイテム属性補整
	zk3=zk_syo(mzk)		; 魔法の種族属性補整

	dmg 2,matkn

	return


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

	rang tatkrg ; 射程判定
	if rangf=0 : return ; 射程内に敵がいなかった

	zk1=0 ; zk_syo(ud(ug+7)); 種族属性補整
	zk2=zk3_syo(tzk,tatkn)	; 特殊のアイテム属性補整
	zk3=0;zk_syo(tzk)		; 特殊属性補整

	dmg 3,tatkn

	return



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

	en=0 ; 敵ユニットNo.

; ユニット魔法

	gensui=100 ; 攻撃減衰率

	if ud(ug+8)=60 : tatk 1,ud(ug+9),1 ; 火の息


; 物理アタック

	gensui=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 : gensui=75 : break ; 右素手攻撃
	   }
	  }
	  if ud(ug+40)>0 { ; 右手武器
	   in=ud(ug+40) : ig=in*idb
	   atk ud(ug+11)+id(ig+11),id(ig+17) ; 右手武器攻撃
	   gensui=75
	  }
	 loop

	 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

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

	if ud(ug+16)>2 { ; 複数手 ---------------
	 repeat ud(ug+16) ; 手数
	  if ud(ug+40+cnt)=0 : atk ud(ug+11),1 : gensui-=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) : gensui-=25 ; 盾で無ければ攻撃
	  }
	 loop
	} ; --------------------------------------


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


	return

 
 
 前回からどう変わったかあまり覚えてないが、とにかく使いまわす部分はなるべくブロック化して分解していると思う。

 攻撃 atk、魔法 matk、特殊 tatkと 3つに処理を分けた。

 属性計算も魔法 zk2_syoと特殊 zk3_syoで分ける事になった。

 ダメージ処理 dmgは使いまわしだが、switch分で処理の違いを分けている。
 
 
 ユニット固有の特殊攻撃は物理アタックの前に入れる事にした。

 if ud(ug+8)=60 : tatk 1,ud(ug+9),1 ; 火の息、の部分ね。
 データ 8に能力の種類、9が値になってる。

 これ、複数能力はどうするかなあ、と思案中。
 
 
 では火の息をテスト。

 特殊のダメージは今の所、黄色で表示。

 火の息は 5ダメージだけど、種族補整で +20%されてる。
 
 
 敵のアイテム補整が弱点だと、


 
 
 吸収されてしまう。


 
 
 という訳で、今度は魔法を作っていく。

 どの魔法や特殊能力は魔力を足すか、思案中。
 魔力を足すとかなり強くなるし、ゲームバランスを考えないといけない。
 
 

コメントを残す

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