2018年 2月15日
あーしんど
やっぱり 2ヶ月かかった、エフェクトは思ったより大変だという事が分かった。
今回は魔法の地、光、闇と、特殊攻撃、それから麻痺やスタン、火傷なんかのエフェクトだ。
一つ押し出してるのは、光の魔法サイキックフォースだ。
実は光の魔法、フォースセンス(速さ上昇)、サイキックフォース、レイブレイドといった魔法でジ○ダイの騎士ごっこができるようになっているのだ、フフフ。
バグてんこもりで、まだ挙動が 100%では無いが、とりあえず一段落。
気に入らないエフェクトについては追々直していこう。
この後、戦闘のソースを最適化、というか整理する予定なので、あんまり意味は無いが、とりあえず現時点でのソースを。
#deffunc efsx ; 座標x
if efsn2<=3 : ef(efg+6)=bcx1(efsn2)+40 ; x
if efsn2>=4 : ef(efg+6)=bcx2(efsn2-3)+40 ; x
return
#deffunc efsm int efsmf ; 向き
repeat 1
if efsmf=1 : eff(efg2+0)=1.0 : eff(efg2+1)=1.0 : break ; 正
if efsmf=2 : eff(efg2+0)=-1.0 : eff(efg2+1)=1.0 : break ; 左右反転
if efsmf=3 : eff(efg2+0)=1.0 : eff(efg2+1)=-1.0 : break ; 上下反転
if efsmf=4 : eff(efg2+0)=-1.0 : eff(efg2+1)=-1.0 : break ; 全反転
loop
if efsn2<=3 : eff(efg2+0)*=-1.0 ; 左の隊の場合の反転
return
#deffunc efs int efsf,int efsn1,int efsn3,int efsd,int efsa,int efse ; int efsx,int efsy,int dfsr,int dfsrn
; エフェクトセット(フラグ、グラ、速さ、反転、移動時間、透明か加算か); 動きx、動きy、回転、回転速度)
if efsf=0 : return
f=0
repeat efb ; No,ピック
if ef(efd*cnt)=0 : efg=efd*cnt : efg2=4*cnt : f=1 : break
loop
if f=0 : return ; 空きが無い
ef(efg)=efsf ; 表示種類
ef(efg+1)=efsn1 ; グラNo.
ef(efg+2)=efsn2 ; 表示場所
ef(efg+3)=0 ; アニメカウント
ef(efg+4)=0 ; アニメ速さカウント
ef(efg+5)=efsn3 ; アニメ速さ
ef(efg+6)=0 ; x
ef(efg+7)=btly1+65 ; y
ef(efg+8)=0 ; 動きx
ef(efg+9)=0 ; 動きy
ef(efg+10)=efse ; 表示種類(0=通常、1=加算)
ef(efg+11)=efsa ; 移動時間
repeat 4
eff(efg2+cnt)=0.0 ; リセット
loop
switch efsf ; 表示種類
case 1 ; 敵固定
if fs=1 : efsn2=et+3 : else : efsn2=et ; 場所x
efsx ; x
efsm efsd ; 向き
swbreak
case 2 ; 投射
if fs=1 : efsn2=ut : else : efsn2=ut+3 ; 場所x
if efsn1=48 : if fs=1 : efsn2=4 : else : efsn2=1 ; ウインドストーム
efsx ; x
n=ut+et-1 : ef(efg+8)=(btlxk*n+btlck)/efsa : if fs=2 : ef(efg+8)*=-1 ; 距離とスピード
if itn=289 : ef(efg+8)=(btlxk*2)/efsa : if fs=2 : ef(efg+8)*=-1
efsm efsd ; 向き
if id(ig+19)=7 : nf1=-1.0 : nf2=1.0 : else : nf1=1.0 : nf2=-1.0 ; 弓
; if fs=1 : eff(efg2+0)=nf1 : else : eff(efg2+0)=nf2 ; 向きx
;eff(efg2+1)=1.0 ; 向きxy
swbreak
case 3 ; 自分固定
if fs=1 : efsn2=ut : else : efsn2=ut+3 ; 場所x
efsx ; x
efsm efsd ; 向き
swbreak
case 4 ; 全体
et=2 : n1=3 : n2=0
if itn=312 : n1=0 : n2=3
if fs=1 : efsn2=et+n1 : else : efsn2=et+n2 ; 場所x
efsx ; x
efsm efsd ; 向き
swbreak
case 5 ; 召還
if fs=1 : efsn2=smn : else : efsn2=smn+3 ; 場所x
efsx ; x
efsm efsd ; 向き
swbreak
case 6 ; リザレクション
if fs=1 : efsn2=rt : else : efsn2=tr+3 ; 場所x
efsx ; x
efsm efsd ; 向き
swbreak
case 7 ; 咆哮、ホーリーブレス、ポイズンブレス
if fs=1 : ef(efg+6)=bcx2(1)+40 : else : ef(efg+6)=bcx1(1)+40 ; 場所x
if efsn=78 : if fs=1 : ef(efg+6)=bcx2(1) : else : ef(efg+6)=bcx1(1) ; ポイズンブレス
ef(efg+8)=(btlxk*2)/efsa : if fs=2 : ef(efg+8)*=-1 ; 距離とスピード
if fs=1 : efsn2=1 : else : efsn2=4
efsm efsd ; 向き
swbreak
swend
; 回転
if efsn1=5 : if efsn2<=3 : eff(efg2+2)=0.6 : else : eff(efg2+2)=-0.6 ; 曲刀
if efsn1=7 : if efsn2<=3 : eff(efg2+2)=-0.3 : else : eff(efg2+2)=0.3 ; 刺突剣
if efsn1=11 : if efsn2<=3 : eff(efg2+2)=-0.9 : else : eff(efg2+2)=0.9 ; 大剣
if efsn1=13 : if efsn2<=3 : eff(efg2+2)=0.6 : else : eff(efg2+2)=-0.6 ; 槌
;if efsn1=14 : if efsn2<=3 : eff(efg2+2)=0.3 : else : eff(efg2+2)=-0.3 ; 杖
if efsn1=19 : if efsn2<=3 : eff(efg2+2)=1.6 : else : eff(efg2+2)=-1.6 ; 大砲
if efsn1=20 : if efsn2<=3 : eff(efg2+2)=1.6 : else : eff(efg2+2)=-1.6 ; フャイヤー
if efsn1=24 : if efsn2<=3 : eff(efg2+2)=0.6 : else : eff(efg2+2)=-0.6 ; フレイムアロー
if efsn1=30 : if efsn2<=3 : eff(efg2+2)=-1.9 : else : eff(efg2+2)=1.9 ; アイスニードル
if efsn1=31 : if efsn2<=3 : eff(efg2+2)=1.6 : else : eff(efg2+2)=-1.6 ; ウォーターストリーム
;if efsn1=32 : eff(efg2+0)=0.8 : eff(efg2+1)=0.8 ; ピュリファイ
if efsn1=33 : eff(efg2+0)=0.8 : eff(efg2+1)=0.8 ; アイスエンチャント
if efsn1=34 { ; アイスジャベリン
eff(efg2+0)=0.2 : eff(efg2+1)=1.8
ef(efg+3)=10 : ef(efg+11)=30
if efsn2<=3 : eff(efg2+2)=-1.6 : else : eff(efg2+2)=1.6
}
if efsn1=35 : eff(efg2+2)=-1.7 : eff(efg2+2)=1.7 ; アイスピラー
if efsn1=38 { ; メイルシュトローム
eff(efg2+0)=2.5 : eff(efg2+1)=1.0
ef(efg+7)+=24
}
if itn=270 { ; ブリザード
n1=ef(efg+6)-btlxk : n2=ef(efg+6)+btlxk ; x
eff(efg2+0)=0.8 : eff(efg2+1)=0.8
repeat 2 : cnt2=cnt ; 左右のブリザード
repeat efb ; No,ピック
efg=efd*cnt : efg2=4*cnt : if ef(efg)>0 : continue
ef(efg)=efsf ; 表示種類
ef(efg+1)=efsn1 ; グラNo.
ef(efg+3)=0 ; アニメカウント
ef(efg+4)=0 ; アニメ速さカウント
ef(efg+5)=efsn3 ; アニメ速さ
if cnt2=0 : ef(efg+6)=n1 ; x
if cnt2=1 : ef(efg+6)=n2 ; x
ef(efg+7)=btly1+65 ; y
ef(efg+8)=0 ; 動きx
ef(efg+9)=0 ; 動きy
ef(efg+10)=efse ; 表示種類(0=通常、1=加算)
ef(efg+11)=efsa ; 移動時間
repeat 4
eff(efg2+cnt)=0.0 ; リセット
loop
efsm efsd ; 向き
eff(efg2+0)=0.8 : eff(efg2+1)=0.8
break
loop
loop
}
if efsn1=40 : eff(efg2+0)=1.0 : eff(efg2+1)=0.3 ; ウインドカッター
if efsn1=41 : eff(efg2+0)=0.7 : eff(efg2+1)=0.7 ; ウインドムーブ
if efsn1=42 : eff(efg2+0)=0.6 : eff(efg2+1)=0.6 ; サンダー
if efsn1=43 : eff(efg2+0)=0.8 : eff(efg2+1)=0.8 ; ウィンドエンチャント
if efsn1=44 : eff(efg2+0)=0.8 : eff(efg2+1)=1.8 ; サンダーウエポン
if efsn1=47 { ; ライトニングボルト
eff(efg2+0)=0.5 : eff(efg2+1)=3.0
if efsn2<=3 : eff(efg2+2)=1.6 : else : eff(efg2+2)=-1.6
}
if efsn1=48 {
eff(efg2+0)=1.4 : eff(efg2+1)=1.4 ; ウィンドストーム}
if fs=1 : ef(efg+6)-=40 : else : ef(efg+6)+=40 ; x
}
if efsn1=49 : eff(efg2+0)=1.3 : eff(efg2+1)=1.3 : ef(efg+7)-=20 ; アースキュア
if efsn1=50 : eff(efg2+0)=1.2 : eff(efg2+1)=1.2 ; ハードコーティング
if efsn1=51 : eff(efg2+0)=0.8 : eff(efg2+1)=0.8 ; ネイチャーヒール
if efsn1=52 : eff(efg2+0)=0.8 : eff(efg2+1)=0.8 ; グラヴィティマグネット
if efsn1=55 : if efsn2<=3 : eff(efg2+2)=1.6 : else : eff(efg2+2)=-1.6 ; ストーンブラスト
if efsn1=57 : eff(efg2+1)=1.3 : ef(efg+7)+=15 ; アースクエイク
if efsn1=58 : eff(efg2+0)=1.2 : eff(efg2+1)=1.2 : ef(efg+7)-=15 ; ネイチャーヒール2
if efsn1=60 : eff(efg2+0)=0.7 : eff(efg2+1)=0.7 ; ヒール
if efsn1=61 : eff(efg2+0)=0.8 : eff(efg2+1)=0.8 ; ターンアンデッド
if efsn1=62 : eff(efg2+0)=0.7 : eff(efg2+1)=0.7 ; フォースセンス
if efsn1=64 : eff(efg2+0)=0.7 : eff(efg2+1)=0.7 ; ホーリーウエポン
if efsn1=66 : eff(efg2+0)=1.0 : eff(efg2+1)=1.7 ; レイアロー
if efsn1=67 : if efsn2<=3 : eff(efg2+2)=1.6 : else : eff(efg2+2)=-1.6 ; サイキックフォース
if efsn1=68 : eff(efg2+0)=0.7 : eff(efg2+1)=0.7 ; ブレス
if efsn1=69 : eff(efg2+0)=1.7 : eff(efg2+1)=1.7 : ef(efg+6)-=1 : ef(efg+7)-=60 ; ホーリーライトサークル
if efsn1=70 : eff(efg2+0)*=0.9 : eff(efg2+1)*=0.9 : ef(efg+7)-=10 ; レイブレイド
if efsn1=71 : eff(efg2+0)=5.0 : eff(efg2+1)=0.7 : ;ef(efg+7)-=10 ; レイブレイド
if efsn1=73 : eff(efg2+0)=0.9 : eff(efg2+1)=0.9 ; マインドブラスト
if efsn1=74 : eff(efg2+0)=1.6 : eff(efg2+1)=1.6 ; ポイズン
if efsn1=75 : eff(efg2+0)=2.0 : eff(efg2+1)=2.0 ; 邪眼
if efsn1=80 : eff(efg2+0)=1.4 : eff(efg2+1)=1.4 ; フレイムカース
if efsn1=83 : eff(efg2+0)=0.7 : eff(efg2+1)=0.7 ; ナイトメア
if efsn1=84 or efsn1=85 { ; ファイヤーブレス、コールドブレス
eff(efg2+0)=0.5 : eff(efg2+1)=1.8
if fs=1 : eff(efg2+0)*=-1.0 : eff(efg2+1)*=-1.0 : eff(efg2+2)=1.5 : ef(efg+6)-=20
if fs=2 : eff(efg2+0)*=-1.0 : eff(efg2+1)*=1.0 : eff(efg2+2)=1.6 : ef(efg+6)+=20
}
if efsn1=87 : eff(efg2+0)=2.0 : eff(efg2+1)=1.0 ; ホーリーブレス
if efsn1=91 : eff(efg2+0)=0.8 : eff(efg2+1)=0.8 : ef(efg+7)-=40 ; スタン
return
#deffunc efp ; エフェクトプット
repeat efb
efg=efd*cnt : efg2=4*cnt ; データの先頭
if ef(efg)=0 : continue ; 無い
ef(efg+4)+ : if ef(efg+4)>=ef(efg+5) : ef(efg+3)+ : ef(efg+4)=0 : ; アニメウエイト処理
if ef(efg+10)=0 : gmode 3,,,255 : else : gmode 5,,,255 ; 透明、加算
pos ef(efg+6),ef(efg+7)
celput efw(ef(efg+1)),ef(efg+3),eff(efg2+0),eff(efg2+1),eff(efg2+2)
if ef(efg+3)>=efga(ef(efg+1)) : ef(efg)=0 : break ; アニメ
if ef(efg+3)<=ef(efg+11) : ef(efg+6)+=ef(efg+8) ; 動きx
ef(efg+7)+=ef(efg+9) ; 動きy
eff(efg2+2)+=eff(efg2+3) ; 回転
loop
return
#deffunc bts1 ; 素アタック
if us=6 or us=11 or us=13 or us=33 or us=36 or us=46 or us=51 or us=72 or us=74 or us=97 or us=111 or us=167 or us=181 or us=185 or us=205 : efs 1,3,2,1 : return ; 牙
if us=71 or us=92 or us=96 or us=118 or us=132 or us=184 : efs 1,2,2,2 : return ; 爪
if us=7 or us=16 or us=52 or us=135 or us=168 : efs 1,4,2,2 : return ; 尾
if us=1 or us=8 or us=12 or us=32 or us=35 or us=43 or us=50 or us=73 or us=94 or us=95 or us=112 or us=120 or us=151 or us=152 or us=153 or us=169 or us=183 or us=190 or us=192 : efs 1,9,2,1 : return ; 体当たり
efs 1,1,2,1 ; 素手
return
#deffunc bts2 ; 近接武器アタック
if itn=10 or itn=11 or itn=16 or itn=24 : efs 1,5,1,1 : return ; 曲刀
if itn=12 or itn=15 or itn=23 : efs 1,7,2,2 : return ; 刺突剣
if id(ig+19)=1 : efs 1,15,2,2 : return ; 剣
if id(ig+19)=2 : efs 1,11,2,1 : return ; 大剣
if id(ig+19)=3 : efs 1, 8,2,1 : return ; 槍
if id(ig+19)=4 : efs 1,12,2,2 : return ; 斧
if id(ig+19)=5 : efs 1,13,2,2 : return ; 槌
if id(ig+19)=6 : efs 1,14,2,4 : return ; 杖
return
#deffunc bts3 ; 投射武器アタック
if id(ig+19)=7 : efs 2,16,1,1,8 : return ; 弓
if id(ig+19)=8 : efs 2,18,1,2,9 : return ; ボウ
if itn=90 : efs 2,19,2,1,11 : return ; 大砲
if id(ig+19)=9 : efs 1,17,1,1,0 : return ; 銃
return
#deffunc bts4 ; 魔法
if itn=251 : efs 2,20,2,3,17,1 : return ; ファイヤー
if itn=252 : efs 3,21,1,1,0 ,1 : return ; ファイヤーウェポン
if itn=253 : efs 3,22,2,1,0 ,1 : return ; バーサーク
if itn=254 : efs 1,23,2,1,0 ,1 : return ; ファイヤーピレイム
if itn=255 : efs 2,24,1,1,15,1 : return ; フレイムアロー
if itn=256 : efs 3,25,1,1,0 ,1 : return ; バトルソング
if itn=257 : efs 2,26,1,1,7 ,1 : return ; ファイアーボール
if itn=258 : efs 4,28,3,1,0 ,1 : return ; ファイヤーウォール
if itn=259 : efs 4,29,3,1,0 ,1 : return ; エクスプロージョン
if itn=261 : efs 2,30,1,3,18,1 : return ; アイスニードル
if itn=262 : efs 2,31,2,3,15,1 : return ; ウォーターストリーム
if itn=263 : efs 3,59,1,1,0 ,1 : return ; ピュリファイ
if itn=264 : efs 3,33,1,1,0 ,1 : return ; アイスエンチャント
if itn=265 : efs 2,34,1,1,18,1 : return ; アイスジャベリン
if itn=266 : efs 1,35,3,4,0 ,0 : return ; アイスピラー
if itn=267 : efs 3,36,2,1,0 ,1 : return ; ウォータースクリーン
if itn=268 : efs 4,37,3,1,0 ,1 : return ; 津波
if itn=269 : efs 4,38,3,1,0 ,1 : return ; メイルシュトローム
if itn=270 : efs 4,39,2,1,0 ,1 : return ; ブリザード
if itn=281 : efs 2,40,1,1,8 ,1 : return ; ウインドカッター
if itn=282 : efs 3,41,2,1,0 ,1 : return ; ウインドムーブ
if itn=283 : efs 1,42,1,1,0 ,0 : return ; サンダー
if itn=284 : efs 3,43,1,1,0 ,0 : return ; ウィンドエンチャント
if itn=285 : efs 3,44,1,1,0 ,1 : return ; サンダーウエポン
if itn=286 : efs 4,45,2,1,0 ,0 : return ; セイレーンボイス
if itn=287 : efs 3,46,2,1,0 ,1 : return ; ウィンドウォール
if itn=288 : efs 4,47,2,1,0 ,1 : return ; ライトニングボルト
if itn=289 : efs 2,48,3,1,20,1 : return ; ウィンドストーム
if itn=291 : efs 3,49,2,1,0 ,1 : return ; アースキュア
if itn=292 : efs 3,50,2,1,0 ,1 : return ; ハードコーティング
if itn=293 : efs 3,58,2,1,0 ,1 : return ; ネイチャーヒール
if itn=294 : efs 1,52,1,1,0 ,1 : return ; グラヴィティマグネット
if itn=295 : efs 3,53,2,1,0 ,1 : return ; グラビティウエポン
if itn=296 : efs 1,54,2,1,0 ,1 : return ; バインディングブランチ
if itn=297 : efs 2,55,2,1,14,0 : return ; ストーンブラスト
if itn=298 : efs 5,56,2,1,0 ,1 : return ; ゴーレムクリエイト
if itn=299 : efs 4,57,3,1,0 ,0 : return ; アースクエイク
if itn=301 : efs 3,60,1,1,0 ,1 : return ; ヒール
if itn=302 : efs 1,61,2,1,0 ,1 : return ; ターンアンデッド
if itn=303 : efs 3,62,1,1,0 ,1 : return ; フォースセンス
if itn=304 : efs 3,63,2,1,0 ,1 : return ; ホーリーライトキュア
if itn=305 : efs 3,64,1,1,0 ,1 : return ; ホーリーウエポン
if itn=306 : efs 3,65,2,1,0 ,1 : return ; プロテクト
if itn=307 : efs 2,66,1,2,5 ,1 : return ; レイアロー
if itn=308 : efs 2,67,1,3,8 ,1 : return ; サイキックフォース
if itn=309 : efs 3,68,1,1,0 ,1 : return ; ブレス
if itn=310 : efs 3,69,1,1,0 ,1 : return ; ホーリーライトサークル
if itn=311 : efs 1,70,2,2,0 ,1 : return ; レイブレイド
if itn=312 : efs 4,71,3,1,0 ,1 : return ; ホーリーライトヒール
if itn=313 : efs 5,72,2,1,0 ,1 : return ; ウィル・オ・ウィスプ
if itn=314 : efs 6,32,2,1,0 ,1 : return ; リザレクション
if itn=321 : efs 1,73,1,1,0 ,1 : return ; マインドブラスト
if itn=322 : efs 1,74,2,1,0 ,1 : return ; ポイズン
if itn=323 : efs 1,75,2,1,0 ,0 : return ; 邪眼
if itn=324 : efs 1,76,1,1,0 ,1 : return ; チャーム
if itn=325 : efs 1,77,1,1,0 ,1 : return ; ウィークネス
if itn=326 : efs 1,78,2,1,0 ,1 : return ; カース
if itn=327 : efs 1,79,1,1,0 ,1 : return ; ダークネス
if itn=328 : efs 1,80,2,1,0 ,1 : return ; フレイムカース
if itn=329 : efs 5,81,2,1,0 ,1 : return ; デモンズゲート
return
#deffunc bts5 int bts5f; その他のエフェクト
if itn=257 : efs 1,27,1,1,0 ,1 : return ; ファイアーボールの爆発
if bts5f=1 : efs 3,90,1,1,0 ,1 : return ; 麻痺
if bts5f=2 : efs 3,91,2,1,0 ,0 : return ; スタン
if bts5f=3 : efs 3,92,1,1,0 ,1 : return ; 魅惑
if bts5f=4 : efs 3,93,2,1,0 ,1 : return ; 火傷
if bts5f=5 : efs 3,74,2,1,0 ,1 : return ; 毒
return
#deffunc bts6 int bts6f ; 特殊
if bts6f=1 : efs 1,76,1,1,0 ,1 : return ; チャーム
if bts6f=2 : efs 5,81,2,1,0 ,1 : return ; ネクロマンサー
if bts6f=3 : efs 1,82,1,1,0 ,1 : return ; 吸血
if bts6f=4 : efs 1,83,1,1,0 ,1 : return ; ナイトメア
if bts6f=5 : efs 4,84,1,1,0 ,1 : return ; ファイヤーブレス
if bts6f=6 : efs 4,85,1,1,0 ,1 : return ; コールドブレス
if bts6f=7 : efs 4,47,2,1,0 ,1 : return ; サンダーブレス
if bts6f=8 : efs 7,86,1,1,14,1 : return ; 咆哮
if bts6f=9 : efs 4,87,1,1,0 ,1 : return ; ホーリーブレス
if bts6f=10 : efs 7,78,2,1,19,1 : return ; ポイズンブレス
if bts6f=11 : efs 4,37,3,1,0 ,1 : return ; 津波
if bts6f=12 : efs 1,89,2,1,0 ,1 : return ; 火の息
if bts6f=13 : efs 1,27,1,1,0 ,1 : return ; ファイアーボールの爆発
if bts6f=14 : efs 2,26,1,1,7 ,1 : return ; ファイアーボール
if bts6f=15 : efs 4,29,3,1,0 ,1 : return ; ファイアーストーム
if bts6f=16 : efs 4,39,2,1,0 ,1 : return ; コールドストーム
if bts6f=17 : efs 1,80,2,1,0 ,1 : return ; ダークスフィア
if bts6f=18 : efs 2,48,3,1,20,1 : return ; ウィンドストーム
return
次はアイテムの戦闘プログラムか、続いて戦闘ソースを全部最適化(整理)する予定。
たぶんそれだけで、1ヶ月はまたかかるんだろうなぁ。