エフェクトのプログラムを整理した


2018年 2月21日
 
 
 まずとりあえずグチャグチャだったエフェクトのプログラムを整理した。

 もちろん表示自体はなんら変わらない。


 
 
 それではサクサクとソースを。

#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 efsox,int efsoy ; int efsx,int efsy,int dfsr,int dfsrn
; エフェクトセット(フラグ、グラ、速さ、反転、移動時間、透明か加算か、大きさx、大きさy); 動き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=ut : else : efsn2=ut+3 ; 場所x
	 swbreak
	 case 2 ; 敵固定
	  if fs=1 : efsn2=et+3 : else : efsn2=et ; 場所x
	 swbreak
	 case 3 ; 投射
	  if fs=1 : efsn2=ut : else : efsn2=ut+3 ; 場所x
	  n=ut+et-1 : ef(efg+8)=(btlxk*n+btlck)/efsa : if fs=2 : ef(efg+8)*=-1 ; 距離とスピード
	 swbreak
	 case 4 ; 敵全体投射
	  if fs=1 : efsn2=4 : else : efsn2=1 ; 場所x
	  ef(efg+8)=(btlxk*3)/efsa : if fs=2 : ef(efg+8)*=-1 ; 距離とスピード
	 swbreak
	 case 5 ; 味方全体
	  if fs=1 : efsn2=2 : else : efsn2=5 ; 場所x
	 swbreak
	 case 6 ; 敵全体
	  if fs=1 : efsn2=5 : else : efsn2=2 ; 場所x
	 swbreak
	 case 7 ; 召還
	  if fs=1 : efsn2=smn : else : efsn2=smn+3 ; 場所x
	 swbreak
	 case 8 ; リザレクション
	  if fs=1 : efsn2=rt : else : efsn2=rt+3 ; 場所x
	 swbreak
	swend

	efsx ; x

	if efsox=0 : eff(efg2+0)=1.0 : else : eff(efg2+0)=1.0*double(efsox)/10.0 ; 大きさ修正x
	if efsoy=0 : eff(efg2+1)=1.0 : else : eff(efg2+1)=1.0*double(efsoy)/10.0 ; 大きさ修正y

	efsm efsd	; 向き


; 回転
	if btsn=5  : if efsn2<=3 : eff(efg2+2)=0.6  : else : eff(efg2+2)=-0.6	; 曲刀
	if btsn=6  : if efsn2<=3 : eff(efg2+2)=-0.3 : else : eff(efg2+2)=0.3	; 刺突剣
	if btsn=8  : if efsn2<=3 : eff(efg2+2)=-0.9 : else : eff(efg2+2)=0.9	; 大剣
	if btsn=11 : if efsn2<=3 : eff(efg2+2)=0.6  : else : eff(efg2+2)=-0.6	; 槌
	if btsn=15 : if efsn2<=3 : eff(efg2+2)=1.6	: else : eff(efg2+2)=-1.6	; 大砲

	if btsf2=10 : if efsn2<=3 : eff(efg2+2)=1.6 : else : eff(efg2+2)=-1.6	; フャイヤー
	if btsf2=14 : if efsn2<=3 : eff(efg2+2)=0.6 : else : eff(efg2+2)=-0.6	; フレイムアロー

	if btsf2=20 : if efsn2<=3 : eff(efg2+2)=-1.5 : else : eff(efg2+2)=1.5	; アイスニードル
	if btsf2=21 : if efsn2<=3 : eff(efg2+2)=1.6  : else : eff(efg2+2)=-1.6	; ウォーターストリーム
	if btsf2=24 { ; アイスジャベリン
		if efsn2<=3 : eff(efg2+2)=-1.6  : else : eff(efg2+2)=1.6
		ef(efg+3)=10 : ef(efg+11)=30 ; グラ途中から
	}
	if btsf2=25 : eff(efg2+2)=-1.7 : eff(efg2+2)=1.7	; アイスピラー
	if btsf2=28 : ef(efg+7)+=24 ; メイルシュトローム

	if btsf2=37 { ; ライトニングボルト
		if efsn2<=3 : eff(efg2+2)=1.6  : else : eff(efg2+2)=-1.6
	}
	if btsf2=38 {	; ウィンドストーム
		if fs=1 : ef(efg+6)-=60 : else : ef(efg+6)+=60 ; x
	}

	if btsf2=40 : ef(efg+7)-=20 ; アースキュア
	if btsf2=42 : ef(efg+7)-=15	; ネイチャーヒール
	if btsf2=46 : if efsn2<=3 : eff(efg2+2)=1.6  : else : eff(efg2+2)=-1.6	; ストーンブラスト

	if btsf2=57 : if efsn2<=3 : eff(efg2+2)=1.6  : else : eff(efg2+2)=-1.6	; サイキックフォース
	if btsf2=59 : ef(efg+6)-=1 : ef(efg+7)-=60	; ホーリーライトサークル
	if btsf2=60 : ef(efg+7)-=10	; レイブレイド

	if btsf2=92 : ef(efg+7)-=40	; スタン
	if btsf2=105 or btsf2=106 {	; ファイヤーブレス、コールドブレス
		if fs=1 : eff(efg2+2)=1.5  : ef(efg+6)-=20
		if fs=2 : eff(efg2+2)=-1.5 : ef(efg+6)+=20
	}
	if btsf2=108 {	; 咆哮
		if fs=1 : ef(efg+6)-=60 : else : ef(efg+6)+=60 ; x
	}
	if btsf2=110 {	; ポイズンブレス
		if fs=1 : ef(efg+6)-=60 : else : ef(efg+6)+=60 ; x
	}

	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 bts int btsf ; 魔法

	btsn=0 : btsf2=btsf ; 種類

	switch btsf
	 case 1 ; 素アタック
	  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 : btsn=1
	  if us=71 or us=92 or us=96 or us=118 or us=132 or us=184 : btsn=2
	  if us=7 or us=16 or us=52 or us=135 or us=168 : btsn=3
	  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 : btsn=4

	  if btsn=0 : efs 2,1,2,1,0,0 : swbreak ; 素手
	  if btsn=1 : efs 2,3,2,1,0,0 : swbreak ; 牙
	  if btsn=2 : efs 2,2,2,2,0,0 : swbreak ; 爪
	  if btsn=3 : efs 2,4,2,2,0,0 : swbreak ; 尾
	  if btsn=4 : efs 2,9,2,1,0,0 : swbreak ; 体当たり
	 swbreak

	 case 2 ; 近接武器アタック
	  if itn=10 or itn=11 or itn=16 or itn=24 : btsn=5 : efs 2,5,1,1,0,0 : swbreak ; 曲刀
	  if itn=12 or itn=15 or itn=23 : btsn=6 : efs 2,7,2,2,0,0 : swbreak ; 刺突剣
	  if id(ig+19)=1 : btsn=7  : efs 2,15,2,2,0,0 : swbreak ; 剣
	  if id(ig+19)=2 : btsn=8  : efs 2,11,2,1,0,0 : swbreak ; 大剣
	  if id(ig+19)=3 : btsn=9  : efs 2, 8,2,1,0,0 : swbreak ; 槍
	  if id(ig+19)=4 : btsn=10 : efs 2,12,2,2,0,0 : swbreak ; 斧
	  if id(ig+19)=5 : btsn=11 : efs 2,13,2,2,0,0 : swbreak ; 槌
	  if id(ig+19)=6 : btsn=12 : efs 2,14,2,4,0,0 : swbreak ; 杖
	 swbreak

	 case 3 ; 投射武器アタック
	  if id(ig+19)=7 : btsn=13 : efs 3,16,1,1,8 ,0	: swbreak ; 弓
	  if id(ig+19)=8 : btsn=14 : efs 3,18,1,2,9 ,0	: swbreak ; ボウ
	  if itn=90		 : btsn=15 : efs 3,19,2,1,11,0	: swbreak ; 大砲
	  if id(ig+19)=9 : btsn=16 : efs 2,17,1,1,0 ,0	: swbreak ; 銃
	 swbreak

	 case 10 : efs 3,20,2,3,14,1		: swbreak	; ファイヤー
	 case 11 : efs 1,21,1,1,0 ,1,7 ,7	: swbreak	; ファイヤーウェポン
	 case 12 : efs 1,22,2,1,0 ,1		: swbreak	; バーサーク
	 case 13 : efs 2,23,2,1,0 ,1		: swbreak	; ファイヤーピレイム
	 case 14 : efs 3,24,1,1,13,1		: swbreak	; フレイムアロー
	 case 15 : efs 1,25,1,1,0 ,1		: swbreak	; バトルソング
	 case 16 : efs 3,26,1,1,7 ,1		: swbreak	; ファイアーボール
	 case 17 : efs 6,28,3,1,0 ,1		: swbreak	; ファイヤーウォール
	 case 18 : efs 6,29,3,1,0 ,1		: swbreak	; エクスプロージョン

	 case 20 : efs 3,30,1,1,18,1,2 ,0	: swbreak	; アイスニードル
	 case 21 : efs 3,31,2,3,17,1		: swbreak	; ウォーターストリーム
	 case 22 : efs 1,59,1,1,0 ,1		: swbreak	; ピュリファイ
	 case 23 : efs 1,33,1,1,0 ,1,8 ,8	: swbreak	; アイスエンチャント
	 case 24 : efs 3,34,1,1,18,1,2 ,18	: swbreak	; アイスジャベリン
	 case 25 : efs 2,35,3,4,0 ,0		: swbreak	; アイスピラー
	 case 26 : efs 1,36,2,1,0 ,1		: swbreak	; ウォータースクリーン
	 case 27 : efs 6,37,3,1,0 ,1		: swbreak	; 津波
	 case 28 : efs 6,38,3,1,0 ,1,25,0	: swbreak	; メイルシュトローム
	 case 29										; ブリザード
	  repeat 3,1
	   et=cnt : efs 2,39,2,1,0 ,1,8 ,8
	  loop
	 swbreak

	 case 30 : efs 3,40,1,1,8 ,1,0 ,3	: swbreak	; ウインドカッター
	 case 31 : efs 1,41,2,1,0 ,1,7 ,7	: swbreak	; ウインドムーブ
	 case 32 : efs 2,42,1,1,0 ,0,6 ,6	: swbreak	; サンダー
	 case 33 : efs 1,43,1,1,0 ,0,8 ,8	: swbreak	; ウィンドエンチャント
	 case 34 : efs 1,44,1,1,0 ,1,8 ,18	: swbreak	; サンダーウエポン
	 case 35 : efs 6,45,2,1,0 ,0		: swbreak	; セイレーンボイス
	 case 36 : efs 1,46,2,1,0 ,1		: swbreak	; ウィンドウォール
	 case 37 : efs 6,47,2,1,0 ,1,8 ,30	: swbreak	; ライトニングボルト
	 case 38 : efs 4,48,3,1,26,1,14,14	: swbreak	; ウィンドストーム

	 case 40 : efs 1,49,2,1,0 ,1,14,14	: swbreak	; アースキュア
	 case 41 : efs 1,50,2,1,0 ,1,12,12	: swbreak	; ハードコーティング
	 case 42 : efs 1,58,2,1,0 ,1,12,12	: swbreak	; ネイチャーヒール
	 case 43 : efs 2,52,1,1,0 ,1,8 ,8	: swbreak	; グラヴィティマグネット
	 case 44 : efs 1,53,2,1,0 ,1		: swbreak	; グラビティウエポン
	 case 45 : efs 2,54,2,1,0 ,1		: swbreak	; バインディングブランチ
	 case 46 : efs 3,55,2,1,14,0		: swbreak	; ストーンブラスト
	 case 47 : efs 7,56,2,1,0 ,1		: swbreak	; ゴーレムクリエイト
	 case 48 : efs 6,57,3,1,0 ,0,0 ,13	: swbreak	; アースクエイク

	 case 50 : efs 1,60,1,1,0 ,1,7 ,7	: swbreak	; ヒール
	 case 51 : efs 2,61,2,1,0 ,1,8 ,8	: swbreak	; ターンアンデッド
	 case 52 : efs 1,62,1,1,0 ,1,7 ,7	: swbreak	; フォースセンス
	 case 53 : efs 1,63,2,1,0 ,1		: swbreak	; ホーリーライトキュア
	 case 54 : efs 1,64,1,1,0 ,1,7 ,7	: swbreak	; ホーリーウエポン
	 case 55 : efs 1,65,2,1,0 ,1		: swbreak	; プロテクト
	 case 56 : efs 3,66,1,2,5 ,1,0 ,17	: swbreak	; レイアロー
	 case 57 : efs 3,67,1,3,8 ,1		: swbreak	; サイキックフォース
	 case 58 : efs 1,68,1,1,0 ,1,7 ,7	: swbreak	; ブレス
	 case 59 : efs 1,69,1,1,0 ,1,17,17	: swbreak	; ホーリーライトサークル
	 case 60 : efs 2,70,2,2,0 ,1,9 ,9	: swbreak	; レイブレイド
	 case 61 : efs 5,71,3,1,0 ,1,50,7	: swbreak	; ホーリーライトヒール
	 case 62 : efs 7,72,2,1,0 ,1		: swbreak	; ウィル・オ・ウィスプ
	 case 63 : efs 8,32,2,1,0 ,1		: swbreak	; リザレクション

	 case 70 : efs 2,73,1,1,0 ,1,9 ,9	: swbreak	; マインドブラスト
	 case 71 : efs 2,74,2,1,0 ,1,16,16	: swbreak	; ポイズン
	 case 72 : efs 2,75,2,1,0 ,0,20,20	: swbreak	; 邪眼
	 case 73 : efs 2,76,1,1,0 ,1		: swbreak	; チャーム
	 case 74 : efs 2,77,1,1,0 ,1		: swbreak	; ウィークネス
	 case 75 : efs 2,78,2,1,0 ,1		: swbreak	; カース
	 case 76 : efs 2,79,1,1,0 ,1		: swbreak	; ダークネス
	 case 77										; フレイムカース
	  repeat 3,1
	   et=cnt : efs 2,80,2,1,0 ,1,14,14
	  loop
	 swbreak
	 case 78 : efs 7,81,2,1,0 ,1		: swbreak	; デモンズゲート

; その他のエフェクト

	 case 90 : efs 2,27,1,1,0 ,1		: swbreak	; ファイアーボールの爆発

	 case 91 : efs 1,90,1,1,0 ,1		: swbreak	; 麻痺
	 case 92 : efs 1,91,2,1,0 ,0,8 ,8	: swbreak	; スタン
	 case 93 : efs 1,92,1,1,0 ,1		: swbreak	; 魅惑
	 case 94 : efs 1,93,2,1,0 ,1		: swbreak	; 火傷
	 case 95 : efs 1,74,2,1,0 ,1		: swbreak	; 毒

	 case 96 : efs 1,43,2,1,0 ,1,9 ,9	: swbreak	; 再生

; 特殊

	 case 101 : efs 2,76,1,1,0 ,1		: swbreak	; チャーム
	 case 102 : efs 7,81,2,1,0 ,1		: swbreak	; ネクロマンサー
	 case 103 : efs 2,82,1,1,0 ,1		: swbreak	; 吸血
	 case 104 : efs 2,83,1,1,0 ,1,7 ,7	: swbreak	; ナイトメア
	 case 105 : efs 6,84,1,4,0 ,1,5 ,18	: swbreak	; ファイヤーブレス
	 case 106 : efs 6,85,1,4,0 ,1,5 ,18	: swbreak	; コールドブレス
	 case 107 : efs 6,47,2,1,0 ,1		: swbreak	; サンダーブレス
	 case 108 : efs 4,86,1,2,15,1		: swbreak	; 咆哮
	 case 109 : efs 6,87,1,1,0 ,1,20,0	: swbreak	; ホーリーブレス
	 case 110 : efs 4,78,2,1,20,1		: swbreak	; ポイズンブレス
	 case 111 : efs 6,37,3,1,0 ,1		: swbreak	; 津波
	 case 112 : efs 2,89,2,1,0 ,1		: swbreak	; 火の息
	 case 113 : efs 2,27,1,1,0 ,1		: swbreak	; ファイアーボールの爆発
	 case 114 : efs 3,26,1,1,7 ,1		: swbreak	; ファイアーボール
	 case 115 : efs 6,29,3,1,0 ,1		: swbreak	; ファイアーストーム
	 case 116 : efs 6,39,2,1,0 ,1		: swbreak	; コールドストーム
	 case 117 : efs 2,80,2,1,0 ,1		: swbreak	; ダークスフィア
	 case 118 : efs 3,48,3,1,20,1		: swbreak	; ウィンドストーム

	swend

	return

 
 
 前回に比べたら随分スッキリしたと思う。

  bts1~いくつかを、全部 btsで処理するようにまとめ、switch文で処理し、エフェクトNo.とグラのNo.を別にする事によって一つのグラを使いまわせるようにした。

 大きさの修正データを btsに移した。

 efsswitch文を整理して汎用性を上げた。

 そんな所かな。
 
 
 
 ところでエフェクトのデータはキャラやアイテムより大きいと書いたが、数字を見ると意外とそうでもなかったので参考までに報告してみる。
 
 
 キャラデータ(画像は縮小)

 7.43MB
 
 
 アイテムデータ(画像は縮小)

 10.1MB
 
 
 エフェクトデータ(こんな感じで 90個くらい)

 18MB
 
 
 そんなに差はなかったけど、キャラとアイテムは bmpだからかな?
 
 
 次は戦闘プログラムを整理する予定。
 
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です