(ソースコードが長いので表示までしばらくお待ち下さい)
2017年 12月16日
ついに戦闘プログラムが一応一通り完成した。
始めが 10月の 5日くらいだから、やっぱり 2ヶ月くらいはかかってる。
しかもこれで終わりでは無く、この後エフェクト表示、つまり戦闘表示を作らないといけない。
今回はユニットの特殊能力の残りを埋めた。
ではまずはスナイピング

山エルフの特技で、弓や銃などの時、後列から狙う

剛弓
ダークエルフの特技で、弓や銃の射程+1

ショートボウの射程は 3

射程 4で届いてる

貫通
山の民の特技

弓や銃の時、射程まで貫通してダメージを与える

吸血
ヴァンパイアクイーンの特技

ダメージを与えてその分回復する
回復の上限を決めるのが割と手間
画像では物理アタックとダメージ表示がかぶってる

以下もうめんどくさいのでザッと手抜き説明、画像も割愛する。
再生はターンの終わりに何割か回復する。
フェニックス、トロール、ドライアドが使う。
絶叫はアルウラネの特技で、物理ダメージで死んだ時に、魔力耐性ロールで攻撃者が即死。
ナイトメアはナイトメアが使う特技で、ダメージとマヒ。
2回攻撃、3回攻撃、兜割り。
ケルベルス、クラブ(蟹)が複数回攻撃、でも弱いので役に立つか今の所微妙。
兜割りはミノタウロスの特技で、一定の武器で物理アタックの時に確率で即死。
ファイアーブレス、コールドブレス、サンダーブレス、咆哮、ホーリーブレス、ポイズンブレス。
ドラゴンが使うブレスで射程は短め。
咆哮はスタンする。
津波、リヴァイアサンの使う貫通攻撃。
とまあそんな感じです。
今回もものによっては思考錯誤してますけど、基本部分ができてるので応用で終わりのものが多くて数が多めになってます。
それでは一応一通り完成した戦闘のソースを公開します。
ただし、これはまだバグも残ってるだろうし、大幅に改造する予定もあるし、調整でいくらでも変更されていくし、参考程度です。
自分としては、戦闘のプログラムでここまで長いのを組んだのは初めてだと一応言っておきます。
これくらいの動作を実装するのには、これくらいのコードくらいには参考になるかな。
まあ 2ヶ月という時間がかかっていると思って下さい。
/////// 戦闘 ////////////////////////////
*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 fn1,10 ; 攻勢側ユニットNo.
dim fn2,10 ; 防衛側ユニットNo.
dim ffn,4 ; 敵戦闘部隊
dim rdpd,3 ; ランダムピックのun格納
dim smnfn,6 ; 召還したun格納
dim sfn,7 ; 初期隊列un格納
dim rfn,4 ; 蘇生候補と蘇生処理時の隊列
dim zputn,7
zputs="zk1 ","火 ","水 ","風 ","地 ","光 ","闇 "
return
#deffunc bpk ; ストップ表示
redraw 0
color 0,0,0 : boxf : color 255,255,255
btl_put
dmp_put
dg_put
redraw 1
pkey
return
; ピックアップ --------------------------------------------
#defcfunc fns int fnsf ; 先頭判定 -------------------------------
un2=0
repeat 3,1
if fnsf=1 : un2=fn1(fs1+cnt)
if fnsf=2 : un2=fn2(fs2+cnt)
if un2=0 or ud(un2*udb+26)<=0 : continue
break
loop
return un2
#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(fs1+cnt+1) ; 自軍の場合
if rdpf=2 : rdpun=fn2(fs2+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.照会
return rdpn
#defcfunc fsp int fspn ; fs判定
fspg=0
repeat 3,1
if fspn=fn1(fs1+cnt) : fspg=1 : break
if fspn=fn2(fs2+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+cnt) : ftpg=cnt : break
if ftpf=2 : if ftpn=fn2(fs2+cnt) : ftpg=cnt : break
loop
return ftpg
#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 fn_syo ; 隊列処理 -------------------------------------------
if ud(fn1(fs1+1)*udb+26)=0 : fn1(fs1+1)=fn1(fs1+2) : fn1(fs1+2)=fn1(fs1+3) : fn1(fs1+3)=0 ; 先頭がいなければ一つ詰める
if ud(fn2(fs2+1)*udb+26)=0 : fn2(fs2+1)=fn2(fs2+2) : fn2(fs2+2)=fn2(fs2+3) : fn2(fs1+3)=0
repeat 3,1
if ud(fn1(fs1+cnt)*udb+26)<=0 : fn1(fs1+cnt)=0 ; HP0なら消去
if ud(fn2(fs2+cnt)*udb+26)<=0 : fn2(fs2+cnt)=0 ; HP0なら消去
loop
anif1=1
repeat 3,1 ; 全滅確認
if fn1(fs1+cnt)>0 : anif1=0 : break
loop
if anif1=1 {
ff1(fg1)=0 ; 部隊消去
fff=1
repeat 3,1 ; 全部隊全滅確認
if ff1(cnt)>0 : fff=0 : break
loop
if fff=1 : ff1(0)=0 : btvf=-9; 全滅
btvf- : return
}
anif2=1
repeat 3,1 ; 全滅確認
if fn2(fs2+cnt)>0 : anif2=0 : break
loop
if anif2=1 {
ff2(fg2)=0 ; 部隊消去
fff=1
repeat 3,1 ; 全部隊全滅確認
if ff2(cnt)>0 : fff=0 : break
loop
if fff=1 : ff2(0)=0 : btvf=9 ; 全滅
btvf+
}
return
#deffunc d_syo 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 ; ステータス効果+
switch sadf
case 1 ; 先頭
un2=fns(fs) : if un2=0 : swbreak ; 先頭判定
bsg=bsp(un2) : bs(bsg+sadc)+=sadn+mho
swbreak
case 2 ; ランダム1体
un2=rdp(fs) : if un2=0 : swbreak ; ランダムピック
bsg=bsp(un2) : bs(bsg+sadc)+=sadn+mho
swbreak
case 3 ; 3体全員
repeat 3,1
if fs=1 : n=fn1(fs1+cnt)
if fs=2 : n=fn2(fs2+cnt)
bsg=bsp(n) : bs(bsg+sadc)+=sadn+mho
loop
swbreak
swend
return
#deffunc sdc int sdcf,int sdcc,int sdcn ; ステータス効果-
if fs=1 : sdcfs=2
if fs=2 : sdcfs=1
if sdcc=1 { ; ランダム1体
un2=rdp(sdcfs) : if un2=0 : return
bsg=bsp(un2) : bs(bsg+sdcf)+=sdcn+mho
if bs(bsg+sdcf)<0 : bs(bsg+sdcf)=0
return
}
repeat 3,1 ; 3体全員
bsg=bsp(sdcfs) : bs(bsg+sdcf)+=sdcn+mho
if bs(bsg+sdcf)<0 : bs(bsg+sdcf)=0
loop
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(fs1+cnt)
if fs=2 : n=fn2(fs2+cnt)
bsg=bsp(n)
bs(bsg+n2)+=scrn+mho
loop
return
#deffunc mahi int mahif,int mahin,int mahirg ; 麻痺
f=0
switch mahif
case 0 ; 対象
if en=0 : f=1 : swbreak
swbreak
case 1 ; 前列
rang 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 ; 対象がいない
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 ; 毒
f=0
switch poif
case 0 ; 対象
if en=0 : f=1 : swbreak
swbreak
case 1 ; 前列
rang 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 ; 毒
return
#deffunc temp int tempf,int tempn ; 魅惑
f=0
switch tempf
case 0 ; 対象
if en=0 : f=1 : swbreak
swbreak
case 1 ; 対面
if fs=1 { ; 攻撃側
if ut=2 : if fn1(fs1+1)>0 : f=1 : swbreak ; 前に味方がいる
if ut=3 : if fn1(fs1+1)>0 or fn1(fs1+2)>0 : f=1 : swbreak ; 〃
en=0
repeat 3,1
en=fn2(fs2+cnt) : if en>0 : break
loop
if en=0 : f=1 : swbreak
}
if fs=2 { ; 防御側
if ut=2 : if fn2(fs2+1)>0 : f=1 : swbreak ; 前に味方がいる
if ut=3 : if fn2(fs2+1)>0 or fn2(fs2+2)>0 : f=1 : swbreak ; 〃
en=0
repeat 3,1
en=fn1(fs1+cnt) : if en>0 : 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
if fs=1 : en=fn2(fs2+cnt)
if fs=2 : en=fn1(fs1+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 ; 対象がいない
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 ; 毒
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(fs1+cnt)
if fs=2 : un2=fn2(fs2+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(fs1+cnt)
if fs=2 : un2=fn2(fs2+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=fn1(fs1+cnt)
if fs=2 : un2=fn2(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(fs1+cnt)
if fs=2 : un2=fn2(fs2+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
repeat 3,1 ; 隊列格納
if fs=1 : fn1(fs1+cnt)=rfn(cnt)
if fs=2 : fn2(fs2+cnt)=rfn(cnt)
loop
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
en=ffn(cnt) : eg=en*udb
if en<=0 or ud(ug+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 ; 対象がいない
r1=rnd(ud(eg+26))
r2=rnd(tadn+mho+ud(ug+35))
if r1>=r2 : return ; 抵抗した
ud(eg+26)=0 : d_syo en ; 死亡処理
return
#deffunc smon int smonf ; 召還
c=0
repeat 3,1
if fs=1 : un2=fn1(fs1+cnt)
if fs=2 : un2=fn2(fs2+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 {
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 fn1(fs1+2)>0 and ud(fn1(fs1+2)*udb+26)>0 : fn1(fs1+3)=fn1(fs1+2) ; 真ん中に誰かいる
fn1(fs1+2)=fn1(fs1+1) ; 一つ後ろへ詰める
swbreak
case 2
if fn1(fs1+1)=0 or ud(fn1(fs1+1)*udb+26)<=0 : smn=1 : swbreak ; 先頭が開いてる
fn1(fs1+3)=fn1(fs1+2) : smn=2 ; 一つ後ろへ詰める
swbreak
case 3
smn=2
if fn1(fs1+2)=0 or ud(fn1(fs1+2)*udb+26)<=0 : swbreak ; 真ん中が開いてる場合
fn1(fs1+1)=fn1(fs1+2) : fn1(fs1+2)=0 ; 一つ前へ詰める
swbreak
swend
fn1(fs1+smn)=un2 ; 召還
}
if fs=2 {
n=ftp(fs,un) ; 召還者の隊列
switch n
case 1
smn=1
if fn2(fs2+2)>0 and ud(fn2(fs2+2)*udb+26)>0 : fn2(fs2+3)=fn2(fs2+2) ; 真ん中に誰かいる
fn2(fs2+2)=fn2(fs2+1) ; 一つ後ろへ詰める
swbreak
case 2
if fn2(fs2+1)=0 or ud(fn2(fs2+1)*udb+26)<=0 : smn=1 : swbreak ; 先頭が開いてる
fn2(fs2+3)=fn2(fs2+2) : smn=2 ; 一つ後ろへ詰める
swbreak
case 3
smn=2
if fn2(fs2+2)=0 or ud(fn2(fs2+2)*udb+26)<=0 : swbreak ; 真ん中が開いてる場合
fn2(fs2+1)=fn2(fs2+2) : fn2(fs2+2)=0 ; 一つ前へ詰める
swbreak
swend
fn2(fs2+smn)=un2 ; 召還
}
repeat 6
if smnfn(cnt)=0 : smnfn(cnt)=un2 : break; 召還un格納
loop
return
#deffunc suck ; 吸血
rang 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 ; 攻撃処理
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 ; 素手
rang atkrg : if rangf>0 : atk_syo ; 攻撃処理
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 rangf>0 : atk_syo : swbreak ; スナイピング
if ud(ug+8)=25 : rang atkrg+1 : if rangf>0 : atk_syo : swbreak ; 強弓
if ud(ug+8)=26 { ; 貫通
repeat 3,1 : et=cnt
if atkrg<(ut-1)+et : break ; 射程外
en=ffn(et) : if en=0 : continue ; 隊列にいない
eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0
atk_syo : gsr-=25 ; 攻撃処理
loop
swbreak
}
}
rang atkrg : if rangf>0 : atk_syo ; 攻撃処理
swbreak
case 2 ; 魅惑
atk_syo ; 攻撃処理
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
; 魔法攻撃(フラグ、属性、攻撃値、射程) -------
mzk2=mzk : matkn2=matkn
switch matkf
case 0 ; 手前の一体 --------------
rang matkrg : if rangf=0 : swbreak ; 射程判定
matk_syo
swbreak
case 1 ; 後列の一体 --------------
brang matkrg : if rangf=0 : swbreak ; 射程判定
matk_syo
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
matk_syo
gsr-=25 ; 威力減衰
loop
swbreak
case 3 ; 全列 --------------
repeat 3 : cnt2=cnt ; 隊列場所
if fs=1 : if un=fn1(fs1+cnt+1) : break
if fs=2 : if un=fn2(fs2+cnt+1) : break
loop
n=matkrg-cnt2 : if n>3 : n=3 ; 回数
repeat n,1
et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない
eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0
matk_syo
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 : matk_syo
gsr=75 ; 左右
et=1 : en=ffn(et) : eg=en*udb : matk_syo
et=3 : en=ffn(et) : eg=en*udb : matk_syo
swbreak
}
rang matkrg : if rangf=0 : swbreak ; 射程内に敵がいなかった
matk_syo ; 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 : matk_syo ; 2体目
swbreak
case 5 ; 押し出し
rang matkrg : if rangf=0 : swbreak ; 射程判定
matk_syo
if et=3 : swbreak ; 最後列
if fs=1 : if fn2(fs2+et+1)=0 or ud(fn2(fs2+et+1)*udb+26)<=0 : fn2(fs2+et+1)=fn2(fs2+et) : fn2(fs2+et)=0 ; 押し出し
if fs=2 : if fn1(fs1+et+1)=0 or ud(fn1(fs1+et+1)*udb+26)<=0 : fn1(fs1+et+1)=fn1(fs2+et) : fn1(fs1+et)=0 ; 押し出し
ffn(et+1)=ffn(et) : ffn(et)=0
swbreak
case 6 ; 引き寄せ
rang matkrg : if rangf=0 : swbreak ; 射程判定
if et=1 : swbreak ; 最前列
if fs=1 : if fn2(fs2+et-1)=0 or ud(fn2(fs2+et-1)*udb+26)<=0 : fn2(fs2+et-1)=fn2(fs2+et) : fn2(fs2+et)=0
if fs=2 : if fn1(fs1+et-1)=0 or ud(fn1(fs1+et-1)*udb+26)<=0 : fn1(fs1+et-1)=fn1(fs1+et) : fn1(fs1+et)=0
ffn(et-1)=ffn(et) : ffn(et)=0
swbreak
case 7 ; ランダム1体
if fs=1 : n=2 : else : n=1
en=rdp(n) : if en=0 : swbreak ; unNo.決定
repeat 3,1
if fs=1 : if fn2(fs2+cnt)=en : et=cnt : break
if fs=2 : if fn1(fs1+cnt)=en : et=cnt : break
loop
eg=en*udb : matk_syo
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 ; 貫通
repeat 3,1 : et=cnt
if tatkrg<(ut-1)+et : break ; 射程外
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
if ud(ug+8)=52 and dm>0 : mahi 0,ud(ug+9)/4,0
gsr-=25 ; 威力減衰
loop
swbreak
case 3 ; 全列 --------------
repeat 3 : cnt2=cnt ; 隊列場所
if fs=1 : if un=fn1(fs1+cnt+1) : break
if fs=2 : if un=fn2(fs2+cnt+1) : break
loop
n=tatkrg-cnt2 : if n>3 : n=3 ; 回数
repeat n,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
case 5 ; 咆哮
repeat 3,1
et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない
eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0
stun ud(ug+21)/5;+ud(ug+9)
loop
swbreak
case 6 ; ホーリーブレス
repeat 3,1 : et=cnt
if tatkrg<(ut-1)+et : break ; 射程外
en=ffn(et) : if en=0 : continue ; 隊列にいない
eg=en*udb : if ud(eg+26)<=0 or ud(eg+7)!6 : continue ; HPが0、闇では無い
zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn
if ud(eg+8)=30 : tad 0,ud(eg+9) ; ターンアンデッド
gsr-=25 ; 威力減衰
loop
swbreak
case 7 ; ランダム1体
if fs=1 : n=2 : else : n=1
en=rdp(n) : if en=0 : swbreak ; unNo.決定
repeat 3,1
if fs=1 : if fn2(fs2+cnt)=en : et=cnt : break
if fs=2 : if fn1(fs1+cnt)=en : et=cnt : break
loop
eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn
swbreak
case 8 ; ポイズンブレス
repeat 3,1 : et=cnt
if tatkrg<(ut-1)+et : break ; 射程外
en=ffn(et) : if en=0 : continue ; 隊列にいない
poi 0,tatkn,0
loop
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 fn1(fs1+2)>0 : et=2 : en=fn1(fs1+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目
if ut=2 {
if fn1(fs1+1)>0 and fn1(fs1+3)>0 {
r=rnd(2) : if r=0 : en=fn1(fs1+1) : et=1 : else : en=fn1(fs1+3) : et=3
eg=en*udb : atk 2,ud(ug+11),0 : return
}
if fn1(fs1+1)>0 : en=fn1(fs1+1) : eg=en*udb : et=1 : atk 2,ud(ug+11),0 : return
if fn1(fs1+3)>0 : en=fn1(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 fn2(fs2+2)>0 : et=2 : en=fn2(fs2+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目
if ut=2 {
if fn2(fs2+1)>0 and fn2(fs2+3)>0 {
r=rnd(2) : if r=0 : et=1 : en=fn2(fs2+1) : else : et=3 : en=fn2(fs2+3)
eg=en*udb : atk 2,ud(ug+11),0 : return
}
if fn2(fs2+1)>0 : en=fn2(fs2+1) : et=1 : eg=en*udb : atk 2,ud(ug+11),0 : return
if fn2(fs2+3)>0 : en=fn2(fs2+3) : et=3 : eg=en*udb : atk 2,ud(ug+11),0 : return
}
}
return
*atack ; 攻撃処理 ----------------------------------------------------
en=0 ; 敵ユニットNo.
itn=0 ; アイテムNo.
; ユニット特殊、魔法
bsg=bsp(un)
if bs(bsg+3)>0 : dgs "麻痺 ",a,12 : bpk : return ; 麻痺により行動不能
if bs(bsg+4)>0 : dgs "スタン ",a,12 : bpk : return ; 気絶により行動不能
gsr=100 ; 攻撃減衰率
if bs(bsg+5)>0 : dgs "魅惑 ",a,12 : bpk : temp_atk : bpk : return ; 魅惑時の行動
mho=ud(un*udb+22)/5 ; 魔力補整
if ud(ug+8)=16 : if ud(ug)=195 or ud(ug)=201 : temp 1,ud(ug+9) ; 魅惑の瞳
if ud(ug+8)=31 : smon 3 ; ネクロマンサー
if ud(ug+8)=32 : suck ; 吸血
if ud(ug+8)=35 { ; ナイトメア
tatk 7,6,ud(ug+9),5
mahi 0,ud(ug+9),5
}
if ud(ug+8)=50 : tatk 2,1,ud(ug+9),3 ; ファイヤーブレス
if ud(ug+8)=51 : tatk 2,2,ud(ug+9),3 ; コールドブレス
if ud(ug+8)=52 : tatk 2,3,ud(ug+9),3 ; サンダーブレス
if ud(ug+8)=53 : tatk 5,0,0,0 ; 咆哮
if ud(ug+8)=54 : tatk 6,5,ud(ug+9),5 ; ホーリーブレス
if ud(ug+8)=55 : tatk 8,6,ud(ug+9),4 ; ポイズンブレス
if ud(ug+8)=56 : tatk 2,2,ud(ug+9),4 ; 津波
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),4 ; ファイヤーストーム
if ud(ug+8)=63 : tatk 3,2,ud(ug+9),5 ; コールドストーム
if ud(ug+8)=64 : tatk 3,6,ud(ug+9),5 ; ダークフレイム
if ud(ug+8)=65 : tatk 3,3,ud(ug+9),5 ; ウインドストーム
; アイテム魔法 ---------------------------------------
repeat 7 ; 装備欄
in=ud(ug+40+cnt) : if in<=0 : continue
ig=in*idb : itn=id(ig)
gsr=100 ; 減衰率リセット
if itn=251 : matk 0,1,id(ig+9),id(ig+17) ; ファイヤー
if itn=252 : enc 1,id(ig+9) ; ファイヤーウェポン
if itn=253 : sad 2,14,id(ig+9) ; バーサーク
if itn=254 : matk 1,1,id(ig+9),id(ig+17) ; ファイヤーピレイム
if itn=255 : matk 2,1,id(ig+9),id(ig+17) ; フレイムアロー
if itn=256 : sad 3,14,id(ig+9) ; バトルソング
if itn=257 : matk 4,1,id(ig+9),id(ig+17) ; ファイアーボール
if itn=258 : matk 3,1,id(ig+9),id(ig+17) ; ファイヤーウォール
if itn=259 : matk 3,1,id(ig+9),id(ig+17) ; エクスプロージョン
if itn=261 : matk 0,2,id(ig+9),id(ig+17) ; アイスニードル
if itn=262 : matk 5,2,id(ig+9),id(ig+17) ; ウォーターストリーム
if itn=263 : cure 2 ; ピュリファイ
if itn=264 : enc 2,id(ig+9) ; アイスエンチャント
if itn=265 : matk 2,2,id(ig+9),id(ig+17) ; アイスジャベリン
if itn=266 : matk 1,2,id(ig+9),id(ig+17) ; アイスピラー
if itn=267 : scr 2,id(ig+9) ; ウォータースクリーン
if itn=268 : matk 2,2,id(ig+9),id(ig+17) ; 津波
if itn=269 : matk 4,2,id(ig+9),id(ig+17) ; メイルシュトローム
if itn=270 : matk 3,2,id(ig+9),id(ig+17) ; ブリザード
if itn=281 : matk 0,3,id(ig+9),id(ig+17) ; ウインドカッター
if itn=282 : sad 2,16,id(ig+9) ; ウインドムーブ
if itn=283 : matk 7,3,id(ig+9),id(ig+17) ; サンダー
if itn=284 : enc 3,id(ig+9) ; ウィンドエンチャント
if itn=285 : enc 4,id(ig+9) ; サンダーウエポン
if itn=286 : temp 3,id(ig+9) ; セイレーンボイス
if itn=287 : scr 3,id(ig+9) ; ウィンドウォール
if itn=288 : matk 2,3,id(ig+9),id(ig+17) ; ライトニングボルト
if itn=289 : matk 3,3,id(ig+9),id(ig+17) ; ウィンドストーム
if itn=291 : cure 4 ; アースキュア
if itn=292 : sad 1,15,id(ig+9) ; ハードコーティング
if itn=293 : heal 1,id(ig+9) ; ネイチャーヒール
if itn=294 : matk 6,4,id(ig+9),5;id(ig+17) ; グラヴィティマグネット
if itn=295 : enc 5,id(ig+9) ; グラビティウエポン
if itn=296 : sdc 17,1,id(ig+9) ; バインディングブランチ
if itn=297 : matk 0,4,id(ig+9),id(ig+17) ; ストーンブラスト
if itn=298 : smon 1 ; ゴーレムクリエイト
if itn=299 : matk 3,4,id(ig+9),id(ig+17) ; アースクエイク
if itn=301 : heal 1,id(ig+9) ; ヒール
if itn=302 : tad 1,id(ig+9) ; ターンアンデッド
if itn=303 : sad 2,16,id(ig+9) ; フォースセンス
if itn=304 : cure 5 ; ホーリーライトキュア
if itn=305 : enc 6,id(ig+9) ; ホーリーウエポン
if itn=306 : sad 1,15,id(ig+9) ; プロテクト
if itn=307 : matk 0,5,id(ig+9),id(ig+17) ; レイアロー
if itn=308 : matk 5,5,id(ig+9),id(ig+17) ; サイキックフォース
if itn=309 : sad 3,14,id(ig+9) ; ブレス
if itn=310 : scr 5,id(ig+9) ; ホーリーライトサークル
if itn=311 : matk 0,5,id(ig+9),id(ig+17) ; レイブレイド
if itn=312 : heal 3,id(ig+9) ; ホーリーライトヒール
if itn=313 : smon 2 ; ウィル・オ・ウィスプ
if itn=314 : resur ; リザレクション
if itn=321 : matk 7,6,id(ig+9),id(ig+17) ; マインドブラスト
if itn=322 : poi 2,id(ig+9),id(ig+17) ; ポイズン
if itn=323 : mahi 1,id(ig+9),id(ig+17) ; 邪眼
if itn=324 : temp 2,id(ig+9) ; チャーム
if itn=325 : sdc 1,14,id(ig+9) ; ウィークネス
if itn=326 : curse id(ig+9) ; カース
if itn=327 : sdc 3,16,id(ig+9) ; ダークネス
if itn=328 : matk 3,6,id(ig+9),id(ig+17) ; フレイムカース
if itn=329 : smon 4 ; デモンズゲート
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 ; 素アタック
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 : 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 : 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 ; 盾で無ければ攻撃
}
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 ; 表示
loop
redraw 0
color 0,0,0 : boxf : color 255,255,255
btl_put
dmp_put
dg_put
redraw 1
return
*fight ; 戦闘 ///////////////////////////////////////
btn=0 ; ターン
fg1=fc1\3+1 : fs1=(fg1-1)*3 ; 戦闘する部隊
fg2=fc2\3+1 : fs2=(fg2-1)*3
repeat 6*bsb : bs(cnt)=0 : loop ; 戦闘ステータスリセット
repeat 3 ; unNo.セット
bs(cnt*bsb)=fn1(fs1+cnt+1)
bs((3+cnt)*bsb)=fn2(fs2+cnt+1)
loop
repeat 4,1 : zenkou(cnt)=0 : loop ; リセット
repeat 3,1 ; 攻勢、防衛
un=fn1(fs1+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(fs2+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(fs1+cnt)
sfn(3+cnt)=fn2(fs2+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=fs1+cnt+1
cn2=fs2+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 ; ユニットNo.
if un=0 : continue ; ユニットが無い
if ud(ug+26)<=0 : continue ; HPが0
repeat 3,1 ; 敵味方識別
if fn1(fs1+cnt)=un : fs=1 : break
if fn2(fs2+cnt)=un : fs=2 : break
loop
repeat 3,1 ; 隊列何番目か
if fs=1 : if fn1(fs1+cnt)=un : ut=cnt : break
if fs=2 : if fn2(fs2+cnt)=un : ut=cnt : break
loop
repeat 3,1 ; 敵ユニットNo.格納
if fs=1 : ffn(cnt)=fn2(fs1+cnt)
if fs=2 : ffn(cnt)=fn1(fs2+cnt)
loop
gosub *atack ; 攻撃処理
loop
repeat 6 ; 火傷
n7=bs(cnt*bsb+1) ; 火傷値
if n7<=0 : continue ; 火傷無い
un=bs(cnt*bsb) : ug=un*udb
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
repeat 6 ; 毒
n7=bs(cnt*bsb+6) ; 毒値
if n7<=0 : continue ; 毒無い
un=bs(cnt*bsb) : ug=un*udb
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
fn_syo ; 隊列処理
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
if anif1=1 or anif2=1 : break ; 全滅した
loop
repeat 6 ; 召還削除
if smnfn(cnt)>0 : d_syo smnfn(cnt) ; 死亡処理
smnfn(cnt)=0
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 : fn1(cnt2*3+cnt)=un : else : fn1(cnt2*3+cnt)=0
un=mu(kn2*10+cnt2*3+cnt)
if ud(un*udb+26)>0 : fn2(cnt2*3+cnt)=un : else : fn2(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
}
return