2017年 11月23日
途中だけど区切りが良いので。
ソースには魔法一揃い並べたけど、まだ機能は全部実装してない。
補助ステータスのソースをまとめたのとヒールを追加したくらい。
今回はソースはダイジェストで。
*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 rdpd,3 ; ランダムピックのun格納
; ピックアップ --------------------------------------------
#defcfunc fns int fnsf ; 先頭判定 -------------------------------
un2=0
repeat 3,1
if fnsf=1 : un2=fn1(cnt)
if fnsf=2 : un2=fn2(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
#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.照会
;dgs "ランダム選択 ",rdpd(r),10
return rdpn
#defcfunc ftp int ftpf,int ftpn ; 隊列番号ピック
repeat 3,1
if ftpf=1 : ftpn=fn1(cnt) : ftpn2=cnt : break
if ftpf=2 : ftpn=fn2(cnt) : ftpn2=cnt : break
loop
return ftpn2
#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 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(cnt)
if fs=2 : n=fn2(cnt)
bsg=bsp(n) : bs(bsg+sadc)+=sadn+mho
loop
swbreak
swend
return
#deffunc enc int encf,int encn ; エンチャント
un2=rdp(fs) : bsg=bsp(un2) ; unNo.決定
;dgs "enc bsg ",bsg,10
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 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
bpk
return
#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) ; ウォータースクリーン-
;dgs "n2 ",n2,8
;dgs "n3 ",n3,9
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
}
zputn(1)=n
n=0
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
}
zputn(2)=n
n=0
if zk2sf=0 or zk2sf=3 { ; 風
n2=zk2sn+ud(ug+33)
if zk2sf=0 {
bsg=bsp(un)
n2+=bs(bsg+9) ; エンチャント+
n2+=bs(bsg+10) ; エンチャント+
}
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
}
zputn(3)=n
n=0
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
}
zputn(4)=n
n=0
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
}
zputn(5)=nn
n=0
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
}
zputn(6)=nn
return zk2sg
#deffunc matk int matkf,int mzk,int matkn,int matkrg
; 魔法攻撃(フラグ、属性、攻撃値、射程) -------
n=matkf
dgs "matk ",n,2
n=matkn
dgs "威力 ",n,3
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(cnt+1) : break
if fs=2 : if un=fn2(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(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 ; 押し出し
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(cnt)=en : et=cnt : break
if fs=2 : if fn1(cnt)=en : et=cnt : break
loop
eg=en*udb : matk_syo
swbreak
case 8 ; 引き寄せ
rang matkrg : if rangf=0 : swbreak ; 射程判定
if et=1 : 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
ffn(et-1)=ffn(et) : ffn(et)=0
swbreak
swend
return
*atack ; 攻撃処理 ----------------------------------------------------
en=0 ; 敵ユニットNo.
;dgs "intvc",intvc,0
dgs "un ",un,0
dgs "fs ",fs,1
;dgs "ut ",ut,2
;dgs "16 ",ud(ug+16),4
;dgs "gsr ",gsr,3
; ユニット特殊、魔法
gsr=100 ; 攻撃減衰率
mho=ud(un*udb+22)/5 ; 魔力補整
dgs "mho ",mho,11
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 ; コールドストーム
redraw 0
color 0,0,0 : boxf : color 255,255,255
btl_put
dmp_put
dg_put
redraw 1
pkey
; アイテム魔法 ---------------------------------------
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 : ;sad 1,id(ig+9) ; ピュリファイ
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 : ;matk 1,3,id(ig+9),id(ig+17) ; セイレーンボイス
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 : ;matk 0,2,id(ig+9),id(ig+17) ; アースキュア
if itn=292 : sad 1,15,id(ig+9) ; ハードコーティング
if itn=293 : heal 1,id(ig+9) ; ネイチャーヒール
if itn=294 : matk 8,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 : ;matk 2,4,id(ig+9),id(ig+17) ; ゴーレムクリエイト
if itn=299 : matk 3,4,id(ig+9),id(ig+17) ; アースクエイク
if itn=301 : heal 1,id(ig+9) ; ヒール
if itn=302 : ;matk 9,5,id(ig+9),id(ig+17) ; ターンアンデッド
if itn=303 : sad 2,16,id(ig+9) ; フォースセンス
if itn=304 : ; enc 2,id(ig+9) ; ホーリーライトキュア
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 9,5,id(ig+9),id(ig+17) ; レイブレイド
if itn=312 : heal 3,id(ig+9) ; ホーリーライトヒール
if itn=313 : ;matk 4,5,id(ig+9),id(ig+17) ; ウィル・オ・ウィスプ
if itn=314 : ;matk 3,5,id(ig+9),id(ig+17) ; リザレクション
if itn=321 : matk 7,6,id(ig+9),id(ig+17) ; マインドブラスト
if itn=322 : ; sad 1,15,id(ig+9) ; ポイズン
if itn=323 : ;sad 1,id(ig+9) ; 邪眼
if itn=324 : ;matk 8,4,id(ig+9),5;id(ig+17) ; チャーム
if itn=325 : sdc 1,14,id(ig+9) ; ウィークネス
if itn=326 : ;sdc 17,1,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 : ;matk 3,4,id(ig+9),id(ig+17) ; デモンズゲート
redraw 0
color 0,0,0 : boxf : color 255,255,255
btl_put
dmp_put
dg_put
redraw 1
pkey
loop ; --------------------------------------------
repeat 6*bsb ; 魔法効果半減処理
if cnt\bsb=0 : continue ; un
if cnt\bsb=16 or cnt\bsb=17 : continue ; 加速減速は半減されない
if bs(cnt)>0 : bs(cnt)=bs(cnt)/2 ; 半減
loop
攻撃、防御、加速、減速のステータス魔法は sadにまとめた。
ヒールは healに作った。
簡単かと思ったけど、HPの低い順にかけるというのが手間だ。
それと表示も。
後は引き寄せの魔法を作ったんだったか?
グラビティマグネットって敵の先頭の1体を手前に引き寄せるだけの魔法。
matk 8でできる。
あれ?これ 6がそれようの空きだったっけかな?
まあ見てくれている人にはどうでもいいけどね。
それじゃあ今回は回復魔法だけテスト。
ヒール

HPの低い順にかけてくれる。

見え難いけど緑の 6。
ホーリーライトヒール

全体にかける光の強力な魔法。

と言うわけなんだけど、そういえば回復に装備属性値を足すの忘れてる。
さて、ちょっと隊列の処理(fn1、fn2)に間違いがあったので改修する。
そしたら今度は毒、麻痺、気絶などの状態異常を作る予定。