2017年 11月4日
魔法攻壁処理の基本的な部分が出来たので報告。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 |
#defcfunc zk2_syo int zk2sf,int zk2sn ; 特殊のアイテム属性補整(zk2sf=0 全属性、1~6 各属性) ------- zk2sg=0 : k1=120 : k2=80 ; アイテム補整 ------- if zk2sf=0 or zk2sf=1 { ; 火 zk2sn2=zk2sn+ud(ug+31) n=zk2sn2-ud(eg+32)+ud(eg+34)-ud(eg+36)+ud(eg+35) ; 火値-水+地-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 if ud(eg+7)=4 or ud(eg+7)=5 { ; 地、光。+% if n>0 : n=n*k1/100 : else : n=n*k2/100 } if ud(eg+7)=2 or ud(eg+7)=6 { ; 水、闇。-% if n>0 : n=n*k2/100 : else : n=n*k1/100 } zk2sg+=n } if zk2sf=0 or zk2sf=2 { ; 水 zk2sn2=zk2sn+ud(ug+32) n=zk2sn+ud(ug+32)-ud(eg+33)+ud(eg+31)-ud(eg+36)+ud(eg+35) ; 水値-風+火-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 if ud(eg+7)=1 or ud(eg+7)=5 { ; 火、光。+% if n>0 : n=n*k1/100 : else : n=n*k2/100 } if ud(eg+7)=3 or ud(eg+7)=6 { ; 風、闇。-% if n>0 : n=n*k2/100 : else : n=n*k1/100 } zk2sg+=n } if zk2sf=0 or zk2sf=3 { ; 風 zk2sn2=zk2sn+ud(ug+33) n=zk2sn+ud(ug+33)-ud(eg+34)+ud(eg+32)-ud(eg+36)+ud(eg+35) ; 風値-地+水-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 if ud(eg+7)=2 or ud(eg+7)=5 { ; 水、光。+% if n>0 : n=n*k1/100 : else : n=n*k2/100 } if ud(eg+7)=4 or ud(eg+7)=6 { ; 地、闇。-% if n>0 : n=n*k2/100 : else : n=n*k1/100 } zk2sg+=n } if zk2sf=0 or zk2sf=4 { ; 地 zk2sn2=zk2sn+ud(ug+34) n=zk2sn2-ud(eg+31)+ud(eg+33)-ud(eg+36)+ud(eg+35) ; 地値-火+風-闇+光 if n>zk2sn2 : n=zk2sn2 ; 最大値 if n<0 and n<zk2sn2 : n=-zk2sn2 ; 最小値 if ud(eg+7)=3 or ud(eg+7)=5 { ; 風、光。+% if n>0 : n=n*k1/100 : else : n=n*k2/100 } if ud(eg+7)=1 or ud(eg+7)=6 { ; 火、闇。-% if n>0 : n=n*k2/100 : else : n=n*k1/100 } zk2sg+=n } if zk2sf=0 or zk2sf=5 { ; 光 n=0 repeat 4 if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt) loop zk2sn2=zk2sn+ud(ug+35) nn=zk2sn2-n+ud(eg+36) if nn>zk2sn2 : nn=zk2sn2 ; 最大値 if nn<0 and nn<zk2sn2 : nn=-zk2sn2 ; 最小値 if 1<=ud(eg+7) and ud(eg+7)<=4 { ; 4属、+% if nn>0 : nn=nn*k2/100 : else : nn=nn*k1/100 } if ud(eg+7)=6 { ; 闇、-% if nn>0 : nn=nn*k1/100 : else : nn=nn*k2/100 } zk2sg+=nn } if zk2sf=0 or zk2sf=6 { ; 闇 n=0 repeat 4 if ud(eg+31+cnt)>0 : n+=ud(eg+31+cnt) loop zk2sn2=zk2sn+ud(ug+36) nn=zk2sn2+n-ud(eg+35) if nn>zk2sn2 : nn=zk2sn2 ; 最大値 if nn<0 and nn<zk2sn2 : nn=-zk2sn2 ; 最小値 if 1<=ud(eg+7) and ud(eg+7)<=4 { ; 4属、+% if nn>0 : nn=nn*k1/100 : else : nn=nn*k2/100 } if ud(eg+7)=5 { ; 光、-% if nn>0 : nn=nn*k2/100 : else : nn=nn*k1/100 } zk2sg+=nn } return zk2sg #deffunc dmg int dmgf,int dmgn ; ダメージ処理(攻撃種類、値); ------------------- ; ダメージ計算 --------------------------------- atkg=dmgn*(gsr+zk1)/100 ; 攻撃力 switch dmgf case 1 ; 物理 atn=0 : repeat 2 : atn+=rnd(atkg+1) : loop ; 攻撃値 r=ud(eg+12)+1 ; 敵の防御力 dfn=0 : repeat 2 : dfn+=rnd(r) : loop ; 防御値 swbreak case 2 ; 魔法 atn=0 : repeat 2 : atn+=rnd(atkg+1) : loop ; 攻撃値 r=ud(eg+22)+1 ; 敵の魔力 dfn=0 : repeat 2 : dfn+=rnd(r) : loop ; 防御値 swbreak case 3 ; 特殊 atn=0 ; 特殊の攻撃値 dfn=0 ; 特殊の場合防御無し swbreak swend dm=atn-dfn : if dm<0 : dm=0 ; 基礎ダメージ dm=dm+(zk2*gsr/100) ; ダメージ+属性ダメージ if dm=0 : n=dm : cn=0 ; miss if dm>0 : n=dm : if dmgf=3 : cn=4 : else : cn=dmgf ; カラー if dm<0 : n=-dm : cn=3 ; 回復カラー、緑 if fs=1 : dmp_set n,3+et,cn ; ダメージ表示 if fs=2 : dmp_set n,et,cn ud(eg+26)-=dm : if ud(eg+26)<0 : ud(eg+26)=0 ; HP処理 return #deffunc rang int rangn ; 射程判定 ------------------------------- rangf=0 ; 攻撃したかフラグ repeat 3,1 ; 射程 if rangn<(ut-1)+cnt : break ; 射程外 et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 rangf+ : break ; 攻撃した loop return #deffunc brang int brangn ; 後方から射程判定 ------------------------------- rangf=0 ; 攻撃したかフラグ repeat 3 ; 射程 if brangn<(ut-1)+(3-cnt) : continue ; 射程外 et=3-cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 rangf+ : break ; 攻撃した loop return #deffunc atk int atkn,int atkrg ; 攻撃(攻撃値、射程) ------- rang atkrg ; 射程判定 if rangf=0 : return ; 射程内に敵がいなかった zk1=zk_syo(ud(ug+7)); 種族属性補整 zk2=zk2_syo(0,0) ; アイテム属性補整 dmg 1,atkn return #deffunc matk int matkf,int mzk,int matkn,int matkrg ; 魔法攻撃(属性、攻撃値、射程) ------- switch matkf case 0 ; 手前の一体 -------------- rang matkrg ; 射程判定 if rangf=0 : swbreak ; 射程内に敵がいなかった zk1=zk_syo(ud(ug+7)) ; 種族属性補整 zk2=zk2_syo(mzk,matkn) ; アイテム属性補整 dmg 2,ud(ug+22) swbreak case 1 ; 後列の一体 -------------- brang matkrg ; 射程判定 if rangf=0 : swbreak ; 射程内に敵がいなかった zk1=zk_syo(ud(ug+7)) ; 種族属性補整 zk2=zk2_syo(mzk,matkn) ; アイテム属性補整 dmg 2,ud(ug+22) swbreak case 2 ; 貫通 -------------- repeat 3,1 : et=cnt if matkrg<(ut-1)+et : break ; 射程外 en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 zk1=zk_syo(ud(ug+7)) ; 種族属性補整 zk2=zk2_syo(mzk,matkn) ; アイテム属性補整 dmg 2,ud(ug+22) ; 攻撃 gsr-=25 ; 威力減衰 loop swbreak case 3 ; 全列 -------------- repeat 3,1 et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 zk2=zk2_syo(mzk,matkn) ; 特殊のアイテム属性補整 dmg 2,ud(ug+22) loop swbreak case 4 ; 着弾範囲型 -------------- f=0 repeat 3,1 ; 3体いるか if ffn(cnt)=0 or ud(ffn(cnt)*udb+26)<=0 : f=1 : break loop if matkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか if f=0 { ; 3体の場合 gsr=100 ; 中央 et=2 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) gsr=75 ; 左右 et=1 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) et=3 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) swbreak } rang matkrg : if rangf=0 : swbreak ; 射程内に敵がいなかった zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) ; 1体目 et+ : if et>3 : swbreak ; 範囲外 en=ffn(et) : if en=0 : swbreak ; 2体目にいない eg=en*udb : if ud(eg+26)<=0 : swbreak ; HPが0 gsr=75 : zk2=zk2_syo(mzk,matkn) : dmg 2,ud(ug+22) ; 2体目 swbreak swend return #deffunc tatk int tatkf,int tzk,int tatkn,int tatkrg ; 特殊攻撃(属性、攻撃値、射程) ------- zk1=0 ; 種族属性補整 switch tatkf case 0 ; 手前の一体 -------------- rang tatkrg : if rangf=0 : return ; 射程内に敵がいなかった zk2=zk2_syo(tzk,tatkn) ; 特殊のアイテム属性補整 dmg 3,tatkn swbreak case 1 ; 後列の一体 -------------- swbreak case 2 ; 貫通 swbreak case 3 ; 全列 -------------- repeat 3,1 et=cnt : en=ffn(et) : if en=0 : continue ; 隊列にいない eg=en*udb : if ud(eg+26)<=0 : continue ; HPが0 zk2=zk2_syo(tzk,tatkn) ; 特殊のアイテム属性補整 dmg 3,tatkn loop swbreak case 4 ; 着弾範囲型 -------------- f=0 repeat 3,1 ; 3体いるか if ffn(cnt)=0 or ud(ffn(cnt)*udb+26)<=0 : f=1 : break loop if tatkrg<(ut-1)+2 : f=1 ; 真ん中に射程が届くか if f=0 { ; 3体の場合 gsr=100 ; 中央 et=2 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn gsr=75 ; 左右 et=1 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn et=3 : en=ffn(et) : eg=en*udb : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn swbreak } rang tatkrg : if rangf=0 : swbreak ; 射程内に敵がいなかった zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn ; 1体目 et+ : en=ffn(et) : if en=0 : swbreak ; 2体目にいない eg=en*udb : if ud(eg+26)<=0 : swbreak ; HPが0 gsr=75 : zk2=zk2_syo(tzk,tatkn) : dmg 3,tatkn ; 2体目 swbreak swend return *atack ; 攻撃処理 ---------------------------------------------------- en=0 ; 敵ユニットNo. ; ユニット特殊、魔法 gsr=100 ; 攻撃減衰率 if ud(ug+8)=60 : tatk 0,1,ud(ug+9),1 ; 火の息 if ud(ug+8)=61 : tatk 4,1,ud(ug+9),3 ; ファイヤーボール if ud(ug+8)=62 : tatk 3,1,ud(ug+9),0 ; ファイヤーストーム if ud(ug+8)=63 : tatk 3,2,ud(ug+9),0 ; コールドストーム ; 物理アタック gsr=100 ; 攻撃減衰率 if ud(ug+16)=0 and ut=1 : gsr=120 : atk ud(ug+11),1 ; 素アタック if ud(ug+16)=2 { ; 2手 ------------------------ repeat 1 ; 右手 if ud(ug+40)=0 { ; 素手 if ud(ug+41)=0 or id(ud(ug+41)*idb+16)=5 { ; 左手が素手か盾 atk ud(ug+11),1 : gsr=75 : break ; 右素手攻撃 } } if ud(ug+40)>0 { ; 右手武器 in=ud(ug+40) : ig=in*idb atk ud(ug+11)+id(ig+11),id(ig+17) ; 右手武器攻撃 gsr=75 } loop repeat 1 ; 左手 if ud(ug+40)=0 and ud(ug+41)=0 : atk ud(ug+11),1 : break ; 素手なら左素手攻撃 if ud(ug+41)>0 { ; 左手武器 in=ud(ug+41) : ig=in*idb atk ud(ug+11)+id(ig+11),id(ig+17) ; 左手武器攻撃 } loop } ; ------------------------------------------- if ud(ug+16)>2 { ; 複数手 --------------- repeat ud(ug+16) ; 手数 if ud(ug+40+cnt)=0 : atk ud(ug+11),1 : gsr-=25 : continue ; 素手 if ud(ug+40+cnt)>0 { ; 武器 in=ud(ug+40+cnt) : ig=in*idb if id(ig+16)!5 : atk ud(ug+11)+id(ig+11),id(ig+17) : gsr-=25 ; 盾で無ければ攻撃 } loop } ; -------------------------------------- ; アイテム魔法 --------------------------------------- repeat 7 ; 装備欄 in=ud(ug+40+cnt) : if in<=0 : continue ig=in*idb : itn=id(ig) gsr=100 ; 減衰率リセット if itn=231 : matk 0,1,id(ig+9),id(ig+17) ; ファイヤー if itn=232 : matk 1,1,id(ig+9),id(ig+17) ; ファイヤーピレイム if itn=233 : matk 2,1,id(ig+9),id(ig+17) ; フレイムアロー if itn=234 : matk 4,1,id(ig+9),id(ig+17) ; ファイアーボール if itn=235 : matk 3,1,id(ig+9),id(ig+17) ; ファイヤーウォール if itn=236 : matk 3,1,id(ig+9),id(ig+17) ; エクスプロージョン loop ; -------------------------------------------- redraw 0 color 0,0,0 : boxf : color 255,255,255 btl_put dmp_put dg_put redraw 1 return |
zk1_syoは同じなので割愛。
たぶん zk2_syoが全部共通で処理できるようになった、覚えてない。
そこで zk3は必要無い事が判明したので無くなった。
switch分で攻撃タイプの処理を分岐して分かりやすくなった。
だいぶまとまってきたと思う。
今回、魔法の部分は、最後のアイテム魔法の部分で分岐する。
ではテスト。
ファイヤーからエクスプロージョンまで火の魔法アイテムがある。
順番に行く。
知力が低いのでアイテム欄が 2つしかない,
ファイヤー
字が小さいが、青い数字で 2、今の所魔法ダメージは青表示。
ファイヤーピレイム
ピレイム(柱)は後列から優先して攻撃する魔法。
魔力ダメージが 11出たので、合わせて 19ダメージ。
魔法の基本ダメージは威力と書いてある所、見えるかな?
フレイムアローは貫通型で、25%ずつ減衰する。
この場合、真ん中だけ魔力ダメージが出ている。
ファイアーボール
着弾範囲型で、着弾点(この場合中央)が 100%で左右が 75%。
この場合も、たぶん真ん中だけ魔力ダメージが出てる。
ファイヤーウォール
全範囲型。
エクスプロージョン
全範囲型。
今回は以上。