・コンセプト

・・概要

 デビル系のボスらしく、「強い」というよりも「卑怯」。

・・アドリブ性の要求

 左右の壁が移動するため、回避と反撃にアドリブ性が要求される。また、ボスの落下する位置にランダム性がある。

 各種レーザーのランダム性が高い。

・・バランス調整

 ボスが落下した時が、攻撃のチャンスとなる。ただし、「シエル出現」「メルトダウン」により、一筋縄では行かないように調整している
 なお、「シエルによるダメージ反射」や「メルトダウン」は、意図的にダメージを大きくしている。それは、「攻撃に躍起になりすぎた、プレイヤーの自己責任」となるからである。

 「シエル出現」に関しては、規則性があるランダムに出現させると、極めて理不尽になるからである。また、この規則性を利用して、出現を予測し、タイミング良く後ろに回り込むことで、攻撃のチャンスが生じる

・移動

 ガード用のMCが設定されていない場合は、通常の移動の処理を行う。
 ガード用のMCが設定されている場合は、ガード用のMCに配置している「position_boss」のMCの位置に移動する。

↓ガード用のMCの「position_boss」のMC(水色の長方形で囲まれた灰色の矩形)。

ASのファイル:boss_black_devil.txt
 
		if(enemy_guard_MC=="none"){_parent._x+=_root.velocity_boss_x;_parent._y+=_root.velocity_boss_y}	//ガード用のMCがない場合の移動(地形による位置調整の前)
		else{_parent._x=enemy_guard_MC._x+enemy_guard_MC.position_boss._x*enemy_direction;_parent._y=enemy_guard_MC._y+enemy_guard_MC.position_boss._y}	//ガード用のMCがある場合の移動
 

・通常状態

・・概要

 他のボスと同様に、乱数でアクションを選択する。特定の条件が満たされた場合は、EXなどを行う。
 優先順位は、EX>シエル出現>ナンバーボールとなる。

・・シエル出現への移行

 乱数でアクションを選択した後に、「シエル出現用のカウント」を増加させる。シエル出現用のカウントが一定の値以上の場合は、シエル出現に移行する。

・・ナンバーボールへの移行

 「レーザーのカウント(ナンバーボール用)」が一定の値以上の場合、ナンバーボールに移行する。
 「レーザーのカウント(ナンバーボール用)」に関しては、「・落下」も参照。

・シエル出現

・・概要

 ガード用のMC(シエル)を出現させる。ガード用のMC(シエル)は「チャージエネルギーの吸収」「ダメージ反射」を行う。

・・チャージエネルギーの吸収

 ゼロのチャージエネルギーを吸収して、ボスのライフを回復させる

↓チャージエネルギーの吸収。

 以下に、セイバーのセミチャージ判定がある場合の例を示す。

ASのファイル:boss_black_devil_guard_ciel.txt
 
			if(_root.zero_charge_saber=="semicharge"){	//セイバーのセミチャージ判定がある場合_root.enemy_identify[_root.boss_number-1]+=8//ボスのライフ回復
				if(_root.enemy_identify[_root.boss_number-1]>_root.boss_initial_life){_root.enemy_identify[_root.boss_number-1]=_root.boss_initial_life}	//最大値より大きい場合,補正する
				_root.zero_charge_saber="none";_root.count_zero_charge_saber=0	//チャージ判定をリセット
			}
 

・・ダメージ反射

 前方からの攻撃を反射(倍返し)する。

↓ダメージ反射。

ASのファイル:boss_black_devil_guard_ciel.txt
 
			if(enemy_vanish==0 and ((enemy_direction==1 and enemy_hit_attack<0) or (enemy_direction==-1 and enemy_hit_attack>0))){	//前方からの攻撃の場合
				enemy_effect=enemy_hit_attack_type	//ダメージエフェクトの判定を付加(ゼロに)_root.zero_life-=Math.abs(enemy_hit_attack)*2	//ゼロのライフを減少させる
				if(_root.zero_life<0){_root.zero_life=0}	//ライフ残量が0より少ない場合,0に補正
				_root.result_damage+=Math.abs(enemy_hit_attack)*2	//リザルト用のダメージに加算
			}
 

・上昇

・・概要

 画面外に向かって上昇する。画面外に出た場合は、落下に移行する。
 ナンバーボールに移行する場合は、途中で停止する。

・落下

・・乱数で落下位置を選択

 乱数で落下位置を選択する。

ASのファイル:boss_black_devil_action_falling.txt
 
	enemy_random_x=Math.floor(Math.random()*146)+55	//乱数で落下位置を選択
	_parent._x=enemy_random_x
 

・・ガード用のMCの出現

 ガード用のMCを出現させる。各種レーザーの場合と、EX回転バウンドの場合で、ガード用のMCが異なる。

 各種レーザーの場合は、「レーザーのカウント(ナンバーボール用)」を増加させる。

ASのファイル:boss_black_devil_action_falling.txt
 
	if(boss_action_next=="laser" or boss_action_next=="reflection_laser" or boss_action_next=="spin_laser"){	//各種レーザーの場合
		count_boss_laser_number_ball++	//レーザーのカウント(ナンバーボール用)を増加させる
		enemy_appearance_name="boss_black_devil_guard_normal"
	}
	else if(boss_action_next=="ex_rolling_bound"){	//EX回転バウンドの場合
		enemy_appearance_name="boss_black_devil_guard_circle"
	}
	#include "zero_AS/enemy/enemy_appearance.txt"
	enemy_guard_MC=enemy	//参照先を変数に保存
︙
 

・・次のアクションへの移行

 ガード用のMCと床との接触判定がある場合は、次のアクションに移行する。

ASのファイル:boss_black_devil_action_falling.txt
 
else if(enemy_guard_MC.enemy_hitrect.hit_floor!=0){	//ガード用のMCと床との接触判定がある場合
	count_boss_time=0	//カウントをリセット
	_root.boss_action=boss_action_next	//次のアクションに移行
}
 

・レーザー

・・概要

 レーザーを発射する。
 レーザーの方向によって、回避の方法が変化する。基本的に、「上」はダッシュ、「下」はジャンプで回避できる。「中」はどちらでも回避できるが、タイミングがややシビアになる(どちらかと言えば、ジャンプでの回避が無難)。

↓レーザー。

・・レーザー出現用のエフェクトの出現

 レーザー出現用のエフェクトを出現させる。同時に、レーザーの発射回数を増加させる。

・・レーザー発射回数の最大値に関する処理

 カウントが最大値の場合は、「レーザー発射回数の最大値」に関する処理を行う。
 「レーザー発射回数の最大値」は、ボスのライフによって変化する

ASのファイル:boss_black_devil_action_laser.txt
 
else if(count_boss_time==count_boss_laser_time_max){	//カウントが最大値の場合
	count_boss_time=0	//カウントをリセット
	//レーザーの発射回数の最大値に関する処理
	if(_root.boss_life>=_root.boss_initial_life*2/3){count_boss_laser_max=2}
	else if(_root.boss_life>=_root.boss_initial_life*1/3){count_boss_laser_max=3}
	else{count_boss_laser_max=4}}
 

・・乱数でレーザー発射を継続

 乱数でレーザー発射を継続する。
 この処理により、プレイヤーが、「ボスの攻撃が終了するタイミング」を予測し難いようにしている。

・・通常状態への移行

 レーザー発射を継続しない場合は、敵(ガード用MC)の消滅判定を付加し、各種の値をリセットし、通常状態に移行する。

・・レーザー出現用のエフェクト

 乱数でレーザーの発射方向を選択する。
 エフェクトが透明化した場合は、レーザーを出現させる。

・・レーザー

 レーザーの発射方向が「中」の場合は、ゼロの位置に向かって発射される。
 「上」の場合は、僅かに上の位置に、「下」の場合は、僅かに下の位置に向かって発射される。

・反射レーザー

・・概要

 「・レーザー」とほぼ同様の処理をしている。
 壁・床との接触判定がある場合に反射するため、それを考慮した回避をする必要がある。「上」はダッシュ→ジャンプ、「下」はジャンプ(→壁蹴り)で回避できる。「中」はどちらでも回避できるが、タイミングがややシビアになる(やはり、ジャンプでの回避が無難)。

 反射レーザーの処理に関しては、EXバスター(チャージ)の「・ベクトルレーザー(チャージ)」を参照。

↓反射レーザー。

・回転レーザー

・・概要

 「・レーザー」とほぼ同様の処理をしている。
 拡大しつつ一回転するレーザーを出現させる。ボスが右向きの場合、「右」は、ボスにダッシュなどで接近し、「左」は、ジャンプで回避する。
 一応、「レーザーの回転方向を見てからでも回避できる」ように設定しているつもりだが、慣れないと回避はシビアかもしれない。

↓回転レーザー。

 ちなみに、この攻撃は、ベクター画像の性質(スケール変化、回転などが容易)をフル活用している。ドット等で作成する場合は、相応の労力を要すると思われる。

・・回転レーザー

・・・MC

 回転レーザーのMCには、多くのhitrectを配置している。

↓回転レーザーのMC。

・・・回転終了角度

 回転終了角度の計算を行う。

 回転終了角度は、「ボスが向いている方向の側の、壁と床との接点」と設定している。

 壁・床の位置を取得する。

↓壁・床の配置。

ASのファイル:boss_black_devil_spin_laser.txt
 
	wall_right_x=_root.board.wall_right_1._x
	wall_left_x=_root.board.wall_left_1._x
	floor_y=_root.board.floor_1._y
 

 ボスと、「壁と床との接点」との角度を算出する。
 ボスが右向きの場合の例を示す。

ASのファイル:boss_black_devil_spin_laser.txt
 
	if(enemy_direction==1){	//右向きの場合
		radian_enemy_end=Math.atan2(floor_y-_parent._y,wall_right_x-_parent._x)	//回転終了角度
		rotation_enemy_end=radian_enemy_end*180/Math.PI
	}
︙
 

・・・回転開始角度

 回転の方向が「右」の場合は、回転開始角度は、回転終了角度から「-360」の値となる。
 回転の加速度は正の値となる。

ASのファイル:boss_black_devil_spin_laser.txt
 
	if(enemy_laser_rotation=="right"){	//回転の方向が右の場合
		rotation_enemy_start=rotation_enemy_end-360	//回転開始角度
		acceleration_rotation_enemy=0.3	//回転の加速度
	}
︙
 

・・・スケール変化、回転

 回転速度に「回転の加速度」を加算する。そして、レーザーを拡大しつつ、回転させる。

ASのファイル:boss_black_devil_spin_laser.txt
 
		velocity_rotation_enemy+=acceleration_rotation_enemy	//回転速度を増加させる
 
		if(enemy_vanish==0){
			if(_parent._xscale<=80){_parent._xscale+=2}	//スケール変化
			rotation_enemy+=velocity_rotation_enemy	//回転
		}
︙
 

・・・消滅判定

 回転終了角度となった場合(つまり、一回転した場合)、消滅判定を付加する。

ASのファイル:boss_black_devil_spin_laser.txt
 
		if((enemy_laser_rotation=="right" and rotation_enemy>rotation_enemy_end) or (enemy_laser_rotation=="left" and rotation_enemy<rotation_enemy_end)){rotation_enemy=rotation_enemy_end;enemy_vanish=1}	//回転終了角度となった場合,消滅判定
 

・ナンバーボール

・・概要

 ボスとゼロとで、ナンバーボールの打ち返し合戦をする。

 ボスが中央付近にいる場合には、「⑧」の弾を打ち返すことがシビアになる。「⑧」の場合は、氷柱&クリスタル(チャージ)を使用するのも有効。

↓ナンバーボール。

・・ナンバーボールの出現

 ナンバーボールを出現させる際に、ナンバーボールのMCの参照先を変数に保存する。

ASのファイル:boss_black_devil_action_number_ball.txt
 
	enemy_number_ball_MC=enemy	//参照先を変数に保存
 

・・ナンバーボールが近接した場合

・・・概要

 「ナンバーボールの接触判定の対象」がボスの場合に、ナンバーボールが近接した場合は、特定の条件が満たされた場合に、ガード用のMC(腕)を出現させる。

 前提となる条件は、以下の通りとなる。

ASのファイル:boss_black_devil_action_number_ball.txt
 
if(enemy_number_ball_MC.enemy_hitrect.enemy_hit_target=="boss"){	//ナンバーボールの接触判定の対象がボスの場合
	if(Math.abs(_parent._x-enemy_number_ball_MC._x)<=60 and Math.abs(_parent._y-enemy_number_ball_MC._y)<60){	//ナンバーボールが近接した場合}
}
 

・・・反射可能な番号の最大値

 「反射可能な番号の最大値」を判定する。ボスのライフの減少に応じて、「反射可能な番号の最大値」が大きくなる。

ASのファイル:boss_black_devil_action_number_ball.txt
 
		if(_root.boss_life>_root.boss_initial_life*2/3){number_number_ball_reflection_max=2}	//反射可能な番号の最大値の判定
		else if(_root.boss_life>_root.boss_initial_life/3){number_number_ball_reflection_max=4}
		else{number_number_ball_reflection_max=6}
 

・・・ガード用のMC(腕)の出現

 「ナンバーボールの番号」が「反射可能な番号の最大値」以下の場合は、ガード用のMC(腕)を出現させる。

ASのファイル:boss_black_devil_action_number_ball.txt
 
		if(enemy_number_ball_MC.enemy_hitrect.number_number_ball<=number_number_ball_reflection_max){	//ナンバーボールの番号が反射可能な番号の最大値以下の場合
			enemy_appearance_name="boss_black_devil_guard_arm"
			#include "zero_AS/enemy/enemy_appearance.txt"
︙
			enemy.enemy_hitrect.enemy_number_ball_MC=enemy_number_ball_MC	//ナンバーボールのMCの変数を伝達
		}
 

・・ナンバーボールとボスとの接触判定がある場合

 ナンバーボールとボスとの接触判定がある場合は、ダウンに移行する。また、ナンバーボールのMCの参照先の変数をリセットする。

ASのファイル:boss_black_devil_action_number_ball.txt
 
if(enemy_number_ball_MC.enemy_hitrect.enemy_explosion==1 and enemy_number_ball_MC.enemy_hitrect.enemy_hit_target=="boss"){	//ナンバーボールとボスとの接触判定がある場合
	count_boss_time=0	//カウントをリセット
	enemy_number_ball_MC="none"	//ナンバーボールのMCの参照先の変数をリセット
	_root.boss_action="down"	//ダウンに移行
}
 

・・ナンバーボールとゼロ・地形との接触判定がある場合

 ナンバーボールとゼロ・地形との接触判定がある場合は、各種レーザーに移行する。

ASのファイル:boss_black_devil_action_number_ball.txt
 
else if((enemy_number_ball_MC.enemy_hitrect.enemy_explosion==1 and enemy_number_ball_MC.enemy_hitrect.enemy_hit_target=="zero") or enemy_number_ball_MC.enemy_hitrect.enemy_explosion_landform==1){	//ナンバーボールとゼロ・地形との接触判定がある場合}
 

・・ガード用のMC(腕)

 ガード用のMC(腕)は、ナンバーボールとの接触判定がある場合、接触判定をナンバーボールに伝達する

ASのファイル:boss_black_devil_guard_arm.txt
 
︙
		if(hittest==1){
			enemy_vanish=1	//消滅判定
			enemy_number_ball_MC.enemy_hitrect.hit_enemy_guard_arm=1	//接触判定をナンバーボールに伝達
		}
 

・・ナンバーボール

・・・ナンバーボールの番号

 「ナンバーボールの番号」は、ゼロやボスがナンバーボールを打ち返す毎に増加する。この値により、スケールの最大値・速度の最大値・加速度・ダメージなどが変化する

・・・接触判定の対象

 「接触判定の対象」が、「ゼロ」と「ボス」とで、処理を変える。

・・・接触判定の対象がゼロの場合

 「接触判定の対象」がゼロの場合、ゼロとの接触判定がある場合は、爆発判定を付加する
 一定の値以上のダメージの攻撃との接触判定がある場合は、「接触判定の対象」をボスに変更し、「ナンバーボールの番号」を増加させ、ボスとの角度を算出する

ASのファイル:boss_black_devil_number_ball.txt
 
		if(enemy_hit_target=="zero"){	//接触判定の対象がゼロの場合
			hit_enemy_guard_arm=0	//ガード用のMCとの接触判定をリセット
			if(hit_zero!=0){enemy_explosion=1}	//ゼロとの接触判定がある場合,爆発判定
			else{
 
				//攻撃との接触判定があり,連鎖値が大きい場合
				if(enemy_hit_attack_type!="none" and enemy_chain>enemy_chain_old){
					if(Math.abs(enemy_hit_attack)>=8){	//一定の値以上のダメージの攻撃の場合
						enemy_hit_target="boss"	//接触判定の対象をボスに変更
						number_number_ball++	//ナンバーボールの番号を増加させる
						velocity_enemy=0	//速度をリセット
						radian_enemy=Math.atan2(_root.boss_y-_parent._y,_root.boss_x-_parent._x)	//ボスとの角度を算出
					}}
			}
		}
 

・・・接触判定の対象がボスの場合

 「接触判定の対象」がボスの場合、ガード用のMCとの接触判定がある場合は、「接触判定の対象」をゼロに変更し、「ナンバーボールの番号」を増加させ、ゼロとの角度を算出する
 ボスとの接触判定がある場合は、爆発判定を付加し、「ボスとバスターとの接触判定」「ボスの連鎖値」の処理を行う
 なお、ゼロの追撃が可能になるように、連鎖値は「1」と設定している

ASのファイル:boss_black_devil_number_ball.txt
 
		else{	//接触判定の対象がボスの場合
			hit_zero=0	//ゼロとの接触判定をリセット
			if(hit_enemy_guard_arm==1){	//ガード用のMCとの接触判定がある場合
				enemy_effect="guard"	//ガードエフェクトを付加
				enemy_hit_target="zero"	//接触判定の対象をゼロに変更
				number_number_ball++	//ナンバーボールの番号を増加させる
				velocity_enemy=0	//速度をリセット
				radian_enemy=Math.atan2(_root.zero_y-_parent._y,_root.zero_x-_parent._x)	//ゼロとの角度を算出
			}
			else{if(hittest==1){
					enemy_explosion=1	//爆発判定
					boss_MC=_root.board["enemy_"+_root.boss_number]	//参照先を変数に保存
					boss_MC.enemy_hitrect.enemy_hit_attack_type="buster"	//攻撃の種類
					boss_MC.enemy_hitrect.enemy_hit_attack=number_number_ball	//ダメージ
					boss_MC.enemy_hitrect.enemy_chain=1	//ボスの連鎖値
				}
			}
		}
 

・・・爆発判定がある場合

 爆発判定がある場合は、「ナンバーボールの爆発」のMCを出現させる。
 ゼロは、このMCにより、ダメージを受けることになる。

・メルトダウン

・・概要

 ボスを中心とした広範囲の攻撃。ボスのライフが減少すると範囲が更に広くなる。

 壁蹴りで回避可能。ボスが左右の端にいる状態で、かつ、左右の壁の間隔が広い場合は、ボスの反対側の壁に向かうことでも回避できる。
 連鎖値を高く設定しているため、ボスに接触し、その無敵時間を利用してやり過ごす方法は不可能。

↓メルトダウン。

 元ネタはTOD2のハルファス。

・EX回転バウンド

・・概要

 ガード用のMC(円)を出現させ、回転バウンドを行う。

↓EX回転バウンド。

・・回転係数

 「反発係数」「回転角速度」などの値は、「回転係数」を用いて算出される。
 「回転係数」は、時間経過・ゼロの攻撃・床との接触などで減少する。「回転係数」が一定の値まで減少した場合は、消滅判定が付加される。

ASのファイル:boss_black_devil_guard_circle.txt
 
		if(rotation_enemy_coefficient<=0){rotation_enemy_coefficient=0;enemy_vanish=1}	//回転係数が減少した場合,消滅判定
 
		enemy_restitution=rotation_enemy_coefficient/rotation_enemy_coefficient_max	//反発係数の算出
		velocity_rotation_enemy=velocity_rotation_enemy_max*enemy_restitution	//回転角速度の算出
 

・ダウン

・・概要

 ダウンする。攻撃チャンスだが、その後のシエル出現には要警戒

・ボスと攻撃との接触判定がある場合の処理

・・概要

 特筆するような処理はないので、解説は省略する。

最終更新:2020年12月19日 08:57