2017年 11月17日
前回より 2週間の時間が経ちました。
いやあ、今回も大変だった(こればっか)
何が大変だったかと言うと、ステータスを変化した値をどこに格納して参照するか。
ud、ユニットデータに格納すれば事は簡単なのだが、これだとステータスの変数が例えば 30種類だったとして、200ユニット作るとデータが 6000増える、6kバイト?いや、一つの変数はたぶん 4バイト、つまり 2バイトで最大値 65536だから、いくつかはめんどくさいので計算しないが、4バイトだとそれ以上の最大値で、それを確保してるはずだから・・・、まあいいや、とにかく 6000*4で 24Kバイト、1000ユニット作ったら、ええと・・・。
まあとにかくユニットデータに余分なデータを格納すると、死にデータ領域が増えるし、オーバーフローで動かなくなる可能性が。
と言っても最近のスマホなら気にしなくても大丈夫なんだろうか?
と言う訳で戦闘中のステータス変動データはその場限りの 6人分で確保。
bsb=21 ; データ数
dim bs,6*bsb ; 6人分の 1次配列変数
例によって 2次配列は使わない、そのためデータ参照もややこしくててこずった。
先頭の 0、21,42・・・の場所に un(ユニットNo.)を格納して、調べて選択するようにした。
言うのは簡単だが、その方法を思考錯誤して確定するまでが大変だ。
それでは恐怖のソースを
/////// 戦闘 //////////////////////////// *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格納 dim zputn,7 zputs="zk1 ","火 ","水 ","風 ","地 ","光 ","闇 " return #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 -1 ; 1人もいない場合 r=rnd(rdpc) ; 選択 rdpn=bsp(rdpd(r)) ; bsNo.照会 dgs "r選択un ",rdpd(r),9 return rdpn #deffunc enc int encf,int encn ; エンチャント bsg=rdp(fs) ; unNo.決定 dgs "enc bsg ",bsg,10 if bsg=-1 : return ;repeat 7,7 ; bs(bsg+cnt)=0 ; リセット ;loop bs(bsg+7+encf)+=encn ; 付与 return #deffunc sad int sadf,int sadn ; 攻撃効果 if sadf=1 { bsg=rdp(fs) : if bsg=-1 : return bs(bsg+14)+=sadn dgs "sad bsg ",bsg,11 : return ; ランダム1体 } repeat 3,1 if fs=1 : n=fn1(cnt) if fs=2 : n=fn2(cnt) bsg=bsp(n) : bs(bsg+14)+=sadn ; 3体全員 loop return #deffunc fn_syo ; 隊列処理 n1=(fg1-1)*3 n2=(fg2-1)*3 if ud(fn1(n1+1)*udb+26)=0 : fn1(n1+1)=fn1(n1+2) : fn1(n1+2)=fn1(n1+3) : fn1(n1+3)=0 ; 先頭がいなければ一つ詰める if ud(fn2(n2+1)*udb+26)=0 : fn2(n2+1)=fn2(n2+2) : fn2(n2+2)=fn2(n2+3) : fn2(n2+3)=0 anif1=1 repeat 3,1 ; 全滅確認 if fn1(n1+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(n2+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 ; 死亡処理 fn2(et)=0 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 ; アイテム補整 ------- if zk2sf=0 or zk2sf=1 { ; 火 ------------------------ n2=zk2sn+ud(ug+31) if zk2sf=0 : bsg=bsp(un) : n2+=bs(bsg+7) ; エンチャント+ n=n2-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 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 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) ; エンチャント+ } n=zk2sn+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 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 if zk2sf=0 or zk2sf=5 { ; 光 n=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) ; エンチャント+ nn=n2-n+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 if zk2sf=0 or zk2sf=6 { ; 闇 n=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) ; エンチャント+ nn=n2+n-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 dmg int dmgf,int dmgn ; ダメージ処理(攻撃種類、値); ------------------- ; ダメージ計算 --------------------------------- bsg=bsp(un) : n=bs(bsg+14) ; 攻撃効果 dgs "攻撃効果 ",n,5 atkg=(dmgn+n)*(gsr+zk1)/100 ; 攻撃力 dgs "gsr ",gsr,3 n=dmgn : dgs "dmgn ",n,4 dgs "zk1 ",zk1,6 dgs "atkg ",atkg,7 /* n=atkn dgs "atkn ",n,10 dgs "gsr ",gsr,11 dgs "atkg ",atkg,12 */ switch dmgf case 1 ; 物理 atn=0 : repeat 2 : atn+=rnd(atkg+1) : loop ; 攻撃値 r=ud(eg+12)+1 ; 敵の防御力 dfn=0 : repeat 2 : dfn+=rnd(r) : loop ; 防御値 swbreak case 2 ; 魔法 atn=0 : repeat 2 : atn+=rnd(atkg+1) : loop ; 攻撃値 r=ud(eg+22)+1 ; 敵の魔力 dfn=0 : repeat 2 : dfn+=rnd(r) : loop ; 防御値 swbreak case 3 ; 特殊 atn=0 ; 特殊の攻撃値 dfn=0 ; 特殊の場合防御無し swbreak swend dgs "atn 攻撃 ",atn,14 dgs "dfn 防御 ",dfn,15 dm=atn-dfn : if dm<0 : dm=0 ; 基礎ダメージ dgs "dm ダメージ ",dm,16 dm=dm+(zk2*gsr/100) ; ダメージ+属性ダメージ dgs "dm+zk2 ",dm,17 if dm=0 : n=dm : cn=0 ; miss if dm>0 : n=dm : if dmgf=3 : cn=4 : else : cn=dmgf ; カラー if dm<0 : n=-dm : cn=3 ; 回復カラー、緑 if fs=1 : dmp_set n,3+et,cn ; ダメージ表示 if fs=2 : dmp_set n,et,cn ud(eg+26)-=dm : if ud(eg+26)<0 : ud(eg+26)=0 ; HP処理 return #deffunc rang int rangn ; 射程判定 ------------------------------- rangf=0 ; 攻撃したかフラグ repeat 3,1 ; 射程 if rangn<(ut-1)+cnt : break ; 射程外 et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 rangf+ : break ; 攻撃した loop return #deffunc brang int brangn ; 後方から射程判定 ------------------------------- rangf=0 ; 攻撃したかフラグ repeat 3 ; 射程 if brangn<(ut-1)+(3-cnt) : continue ; 射程外 et=3-cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 rangf+ : break ; 攻撃した loop return #deffunc atk int atkn,int atkrg ; 攻撃(攻撃値、射程) ------- dgs "atk ",a,2 rang atkrg ; 射程判定 if rangf=0 : return ; 射程内に敵がいなかった zk1=zk_syo(ud(ug+7)); 種族属性補整 zk2=zk2_syo(0,0) ; アイテム属性補整 dmg 1,atkn return #deffunc matk int matkf,int mzk,int matkn,int matkrg ; 魔法攻撃(属性、攻撃値、射程) ------- n=matkf dgs "matk ",n,2 n=matkn dgs "威力 ",n,3 switch matkf case 0 ; 手前の一体 -------------- rang matkrg ; 射程判定 if rangf=0 : swbreak ; 射程内に敵がいなかった zk1=zk_syo(ud(ug+7)) ; 種族属性補整 zk2=zk2_syo(mzk,matkn) ; アイテム属性補整 dmg 2,ud(ug+22) swbreak case 1 ; 後列の一体 -------------- brang matkrg ; 射程判定 if rangf=0 : swbreak ; 射程内に敵がいなかった zk1=zk_syo(ud(ug+7)) ; 種族属性補整 zk2=zk2_syo(mzk,matkn) ; アイテム属性補整 dmg 2,ud(ug+22) swbreak case 2 ; 貫通 -------------- repeat 3,1 : et=cnt if matkrg<(ut-1)+et : break ; 射程外 en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 zk1=zk_syo(ud(ug+7)) ; 種族属性補整 zk2=zk2_syo(mzk,matkn) ; アイテム属性補整 dmg 2,ud(ug+22) ; 攻撃 gsr-=25 ; 威力減衰 loop swbreak case 3 ; 全列 -------------- repeat 3,1 et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 zk2=zk2_syo(mzk,matkn) ; 特殊のアイテム属性補整 dmg 2,ud(ug+22) loop swbreak case 4 ; 着弾範囲型 -------------- f=0 repeat 3,1 ; 3体いるか if ffn(cnt)=0 or ud(ffn(cnt)*udb+26)<=0 : f=1 : break loop if matkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか if f=0 { ; 3体の場合 gsr=100 ; 中央 et=2 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) gsr=75 ; 左右 et=1 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) et=3 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) swbreak } rang matkrg : if rangf=0 : swbreak ; 射程内に敵がいなかった zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) ; 1体目 et+ : if et>3 : swbreak ; 範囲外 en=ffn(et) : if en=0 : swbreak ; 2体目にいない eg=en*udb : if ud(eg+26)<=0 : swbreak ; HPが0 gsr=75 : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) ; 2体目 swbreak swend return #deffunc tatk int tatkf,int tzk,int tatkn,int tatkrg ; 特殊攻撃(属性、攻撃値、射程) ------- n=tatkf dgs "tatk ",n,2 zk1=0 ; 種族属性補整 switch tatkf case 0 ; 手前の一体 -------------- rang tatkrg : if rangf=0 : return ; 射程内に敵がいなかった zk2=zk2_syo(tzk,tatkn) ; 特殊のアイテム属性補整 dmg 3,tatkn swbreak case 1 ; 後列の一体 -------------- swbreak case 2 ; 貫通 swbreak case 3 ; 全列 -------------- repeat 3,1 et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 zk2=zk2_syo(tzk,tatkn) ; 特殊のアイテム属性補整 dmg 3,tatkn loop swbreak case 4 ; 着弾範囲型 -------------- f=0 repeat 3,1 ; 3体いるか if ffn(cnt)=0 or ud(ffn(cnt)*udb+26)<=0 : f=1 : break loop if tatkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか if f=0 { ; 3体の場合 gsr=100 ; 中央 et=2 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn gsr=75 ; 左右 et=1 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn et=3 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn swbreak } rang tatkrg : if rangf=0 : swbreak ; 射程内に敵がいなかった zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn ; 1体目 et+ : en=ffn(et) : if en=0 : swbreak ; 2体目にいない eg=en*udb : if ud(eg+26)<=0 : swbreak ; HPが0 gsr=75 : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn ; 2体目 swbreak swend return *atack ; 攻撃処理 ---------------------------------------------------- en=0 ; 敵ユニットNo. ;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 ; 攻撃減衰率 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 0,id(ig+9) ; ファイヤーウェポン if itn=253 : sad 1,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 2,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) ; エクスプロージョン redraw 0 color 0,0,0 : boxf : color 255,255,255 btl_put dmp_put dg_put redraw 1 pkey loop ; -------------------------------------------- ; 物理攻撃 -------------------------------------------- gsr=100 ; 攻撃減衰率 if ud(ug+16)=0 and ut=1 : gensui=120 : atk ud(ug+11),1 ; 素アタック if ud(ug+16)=2 { ; 2手 ------------------------ repeat 1 ; 右手 if ud(ug+40)=0 { ; 素手 if ud(ug+41)=0 or id(ud(ug+41)*idb+16)=5 { ; 左手が素手か盾 atk ud(ug+11),1 : gsr=75 : break ; 右素手攻撃 } } if ud(ug+40)>0 { ; 右手武器 in=ud(ug+40) : ig=in*idb atk ud(ug+11)+id(ig+11),id(ig+17) ; 右手武器攻撃 gsr=75 } loop redraw 0 color 0,0,0 : boxf : color 255,255,255 btl_put dmp_put dg_put redraw 1 pkey repeat 1 ; 左手 if ud(ug+40)=0 and ud(ug+41)=0 : atk ud(ug+11),1 : break ; 素手なら左素手攻撃 if ud(ug+41)>0 { ; 左手武器 in=ud(ug+41) : ig=in*idb atk ud(ug+11)+id(ig+11),id(ig+17) ; 左手武器攻撃 } loop redraw 0 color 0,0,0 : boxf : color 255,255,255 btl_put dmp_put dg_put redraw 1 pkey } ; ------------------------------------------- if ud(ug+16)>2 { ; 複数手 --------------- repeat ud(ug+16) ; 手数 redraw 0 color 0,0,0 : boxf : color 255,255,255 btl_put dmp_put dg_put redraw 1 pkey if ud(ug+40+cnt)=0 : atk ud(ug+11),1 : gsr-=25 : continue ; 素手 if ud(ug+40+cnt)>0 { ; 武器 in=ud(ug+40+cnt) : ig=in*idb if id(ig+16)!5 : atk ud(ug+11)+id(ig+11),id(ig+17) : gsr-=25 ; 盾で無ければ攻撃 } loop } ; -------------------------------------- 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 ; 戦闘する部隊 fg2=fc2\3+1 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 3 ; 3回戦闘 btn+ ;dgs "btn ",btn,9 ; イニシアティブ -------------- dim intv,6 ; イニシアティブ、順番 dim intvn,6 ; 値 repeat 6 ; リセット intv(cnt)=0 intvn(cnt)=0 loop repeat 3 : cnt2=cnt ; 値計算 cn1=(fg1-1)*3+cnt+1 cn2=(fg2-1)*3+cnt+1 if fn1(cn1)>0 { ; 攻勢側 intv(cnt)=fn1(cn1) ug=fn1(cn1)*udb n=0 : if ud(ug+8)=22 : n=ud(ug+9) ; 速攻 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) ; 速攻 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((fg1-1)*3+cnt)=un : fs=1 : break if fn2((fg2-1)*3+cnt)=un : fs=2 : break loop repeat 3,1 ; 隊列何番目か if fs=1 : if fn1((fg1-1)*3+cnt)=un : ut=cnt : break if fs=2 : if fn2((fg2-1)*3+cnt)=un : ut=cnt : break loop repeat 3,1 ; 敵ユニットNo.格納 if fs=1 : ffn(cnt)=fn2((fg2-1)*3+cnt) if fs=2 : ffn(cnt)=fn1((fg1-1)*3+cnt) loop /* repeat 6 ; 戦闘ステータスNp. bsg=bs(cnt*bsb) if bsg=cn : break loop */ gosub *atack ; 攻撃処理 loop fn_syo ; 隊列処理 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 ; 全滅した repeat 6*bsb ; 魔法効果半減処理 if cnt\bsb=0 : continue ; un if bs(cnt)>0 : bs(cnt)=bs(cnt)/2 ; 半減 loop loop return
ぎぃやぁぁあああってくらい増えてる感じはするが、まだ途中だ。
ちなみに左端にピッタリよせてあるコードは、デバッグモニター用の余計なコードだ。
pkeyというのはスペースキーを押すまで停止する自作命令で、確認しやすいようにしている。
最初の部分で bs(ステータス変数)を定義している。
初期化は戦闘の始め *fightの始めの方でオール 0リセットとunNO.の格納をしている。
最後に「魔法効果半減処理」というのがあって、1ターン終わると 2分の1になるようにした。
つまり今の所、効果は累積する。
それではテストを
火の魔女はバーサーク(味方 1体の攻撃力を強化)を
火の民はバトルソング(味方全員の攻撃力を強化)を
戦闘開始、上の白い数字がステータス変数。
ユニット1、火の魔女がバーサークを使った所。
上の白い部分、ユニット7、つまりファイヤードラゴンの攻撃力補整が 10になってる。
バーサークのかける相手はランダム。
つづいて火の民のバトルソング。
こちらは味方全員にかかる。
効果が累積しているのが分かると思う。
1ターンの終わりに半減する。
ファイヤードラゴンの攻撃。
左の緑のデバッグ表示を見て欲しい。
dmgn(元の攻撃力)に攻撃効果(ステータス補整)が足されたものが、atkg(最終攻撃力)になってる。
さらに zk1は種族補整で +20%している。
今回は防御されている。
再び火の魔女のバーサーク。
今度は自分にかけている。
再びバトルソング。
そして半減。
そんな感じだ。
今回はエンチャントウエポンも作ったが、記事が長くなるので割愛する。
こちらは zk2の処理の時足される。
前回から zk2_syoの内容が少し足されていると思う。
という訳で、今の所火の魔法は終わった。
ソースの中に火の魔法の分岐場所があると思うので、一応それで一揃い。
今回は割愛したが、アイテムエディッターで全魔法アイテムを一揃い作ったし、その関連でアイテムデータ(id)に 2データ要素付け足しもしている。
と言う訳で、流石にこれで戦闘の基礎部分はできたと思うし、作業は加速されると思いますが、どうでしょうね。