2017年 11月4日
魔法攻壁処理の基本的な部分が出来たので報告。
ソース
#defcfunc zk2_syo int zk2sf,int zk2sn ; 特殊のアイテム属性補整(zk2sf=0 全属性、1~6 各属性) ------- zk2sg=0 : k1=120 : k2=80 ; アイテム補整 ------- if zk2sf=0 or zk2sf=1 { ; 火 zk2sn2=zk2sn+ud(ug+31) n=zk2sn2-ud(eg+32)+ud(eg+34)-ud(eg+36)+ud(eg+35) ; 火値-水+地-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 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 zk2sf=0 or zk2sf=2 { ; 水 zk2sn2=zk2sn+ud(ug+32) n=zk2sn+ud(ug+32)-ud(eg+33)+ud(eg+31)-ud(eg+36)+ud(eg+35) ; 水値-風+火-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 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 zk2sf=0 or zk2sf=3 { ; 風 zk2sn2=zk2sn+ud(ug+33) n=zk2sn+ud(ug+33)-ud(eg+34)+ud(eg+32)-ud(eg+36)+ud(eg+35) ; 風値-地+水-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 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 zk2sf=0 or zk2sf=4 { ; 地 zk2sn2=zk2sn+ud(ug+34) n=zk2sn2-ud(eg+31)+ud(eg+33)-ud(eg+36)+ud(eg+35) ; 地値-火+風-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 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 } if zk2sf=0 or zk2sf=5 { ; 光 n=0 repeat 4 if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt) loop zk2sn2=zk2sn+ud(ug+35) nn=zk2sn2-n+ud(eg+36) if nn>zk2sn2 : nn=zk2sn2 ; 最大値 if nn<0 and nn<zk2sn2 : nn=-zk2sn2 ; 最小値 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 repeat 4 if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt) loop zk2sn2=zk2sn+ud(ug+36) nn=zk2sn2+n-ud(eg+35) if nn>zk2sn2 : nn=zk2sn2 ; 最大値 if nn<0 and nn<zk2sn2 : nn=-zk2sn2 ; 最小値 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 ; ダメージ処理(攻撃種類、値); ------------------- ; ダメージ計算 --------------------------------- atkg=dmgn*(gsr+zk1)/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*gsr/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 ; 攻撃したかフラグ 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 ; 攻撃(攻撃値、射程) ------- 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 ; 魔法攻撃(属性、攻撃値、射程) ------- 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 ; 特殊攻撃(属性、攻撃値、射程) ------- 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. ; ユニット特殊、魔法 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 ; コールドストーム ; 物理アタック gsr=100 ; 攻撃減衰率 if ud(ug+16)=0 and ut=1 : gsr=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 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 : 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 } ; -------------------------------------- ; アイテム魔法 --------------------------------------- repeat 7 ; 装備欄 in=ud(ug+40+cnt) : if in<=0 : continue ig=in*idb : itn=id(ig) gsr=100 ; 減衰率リセット if itn=231 : matk 0,1,id(ig+9),id(ig+17) ; ファイヤー if itn=232 : matk 1,1,id(ig+9),id(ig+17) ; ファイヤーピレイム if itn=233 : matk 2,1,id(ig+9),id(ig+17) ; フレイムアロー if itn=234 : matk 4,1,id(ig+9),id(ig+17) ; ファイアーボール if itn=235 : matk 3,1,id(ig+9),id(ig+17) ; ファイヤーウォール if itn=236 : matk 3,1,id(ig+9),id(ig+17) ; エクスプロージョン loop ; -------------------------------------------- redraw 0 color 0,0,0 : boxf : color 255,255,255 btl_put dmp_put dg_put redraw 1 return
zk1_syoは同じなので割愛。
たぶん zk2_syoが全部共通で処理できるようになった、覚えてない。
そこで zk3は必要無い事が判明したので無くなった。
switch分で攻撃タイプの処理を分岐して分かりやすくなった。
だいぶまとまってきたと思う。
今回、魔法の部分は、最後のアイテム魔法の部分で分岐する。
ではテスト。
ファイヤーからエクスプロージョンまで火の魔法アイテムがある。
順番に行く。
知力が低いのでアイテム欄が 2つしかない,
ファイヤー
字が小さいが、青い数字で 2、今の所魔法ダメージは青表示。
ファイヤーピレイム
ピレイム(柱)は後列から優先して攻撃する魔法。
魔力ダメージが 11出たので、合わせて 19ダメージ。
魔法の基本ダメージは威力と書いてある所、見えるかな?
フレイムアローは貫通型で、25%ずつ減衰する。
この場合、真ん中だけ魔力ダメージが出ている。
ファイアーボール
着弾範囲型で、着弾点(この場合中央)が 100%で左右が 75%。
この場合も、たぶん真ん中だけ魔力ダメージが出てる。
ファイヤーウォール
全範囲型。
エクスプロージョン
全範囲型。
今回は以上。