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