ランスっぽい武器を作る

要約するとリアル戦闘アニメーションのモーションでも自然に見える一方向武器※を作ろうということです。
このページに掲載されている情報はあくまでも
ベルサガのランス武器的な轢き逃げ系※2の攻撃モーションを採用する方法」程度に捉えていただけたらと思います。

※自分から攻撃した際に反撃を受けることがないが、自分も反撃できなくなる武器の設定
※2攻撃後に画面外へ移動してその場に戻ってこないモーション



攻撃前に移動した分威力が上がる」というベルサガの槍武器全般的なものに関しては、
戦闘計算式のgetPowerでunit.getMostResentMov(操作中のユニットの消費移動力)を取得するようにすれば再現できなくも無いのですが、
(「移動距離」ではなく「消費移動力」を取得しているので森や山を通っただけで威力が2マス分上がったりするが…)
2chのゲ製板スレにてスキップ中はgetMostResentMovが機能しなくなるという不具合が発見されているため、
実装するのはあまりおすすめできません。
(つまり敵ターン中にスキップすると敵が該当武器で攻撃した際に消費移動力分の威力補正が考慮されなくなる)




再攻撃、連続攻撃への対処

轢き逃げ系のモーションを採用する際に一番の壁になる部分が「再攻撃」と「スキルによる連続攻撃」の存在だと思われます。
(「反撃」に関しては武器側を一方向武器として扱えば解決します)
「クリティカルとどめ」のように次の攻撃が存在しないのが確定している状況のモーションであれば
轢き逃げ系のモーションも問題なく使えますが、
轢き逃げの後に「再攻撃」や「スキルによる連続攻撃」が発動してしまうと、
画面外へ消えたはずの攻撃側ユニットが画面内に瞬間移動して再び轢き逃げを行うという滑稽な状態になってしまいます。
そこで「再攻撃が不可能になるスキル」「連続攻撃が発動しなくなるスキル」を作成します。
(スキルで扱った方がゲーム中の視認性も良いしユニット、クラス、ステートにも付与できて汎用性が高くなります)

「再攻撃」の制限

singleton-calculator.jsのCalculator.calculateRoundCountが再攻撃の発動計算を行っているのでそちらに処理を加えます。
面倒な方はSRPG Studio素材集の中に入っている、
「再攻撃制限+再攻撃スキルに機能追加.js」を使用、または参考にしてください。

  • 変更例
(function () { 
var alias1 = Calculator.calculateRoundCount; //既存の再攻撃判定処理をalias1として宣言して保存
Calculator.calculateRoundCount = function(active, passive, weapon) {  //既存の処理を上書き
	var option = root.getMetaSession().getDifficulty().getDifficultyOption(); //難易度設定オプション取得
	var activeAgi = AbilityCalculator.getAgility(active, weapon);
	var passiveAgi = AbilityCalculator.getAgility(passive, ItemControl.getEquippedWeapon(passive));

	count = alias1.call(this, active, passive, weapon);  //alias1(再攻撃判定処理)から攻撃回数を得てcountに保存

	// 再攻撃不可スキル所持判定
	if (SkillControl.getPossessionCustomSkill(active,'NOROUNDATTACK')){
			count = 1;
	}

	return count; //修正されたcountを戻り値として返す
};

})();

キーワード「NOROUNDATTACK」のカスタムスキルを所持しているユニットは再攻撃できなくなります。

「連続攻撃」の制限

attack_order.jsのNormalAttackOrderBuilder._getAttackCountで連続攻撃スキルの発動判定を行っているので、
そちらを編集します。
面倒な方はSRPG Studio素材集の中に入っている、
「連続スキル制限スキル.js」を使用、または参考にしてください。

  • 変更例
(function () { 
	NormalAttackOrderBuilder._getAttackCount = function(virtualActive, virtualPassive) {
		var skill;
		var attackCount = virtualActive.attackCount;

	// 連続不可スキルを所持していたら連続攻撃スキルの全ての処理を飛ばす
		if (!SkillControl.getPossessionCustomSkill(virtualActive.unitSelf,'NOCONTINUOUSATTACK')){
			skill = SkillControl.getBattleSkill(virtualActive.unitSelf, virtualPassive.unitSelf, SkillType.CONTINUOUSATTACK);
			if (SkillRandomizer.isSkillInvoked(virtualActive.unitSelf, virtualPassive.unitSelf, skill)) {
				// 連続攻撃のスキルによって攻撃回数が倍になる
				attackCount *= skill.getSkillValue();
				
				// attackEntryがないから、現時点で追加処理はできない。
				// 後で追加できるように保存する。
				virtualActive.skillContinuousAttack = skill;
			}
		}
	
		return attackCount;
	};
})();

キーワード「NOCONTINUOUSATTACK」のカスタムスキルを所持しているユニットは「連続攻撃」スキルが発動しなくなります。

これらのスキルを「一方向武器」にチェックが付いた武器に持たせれば準備完了です。

轢き逃げモーションを作る

轢き逃げ攻撃を作る為にいよいよオリジナルモーションを作成します。
アニメーション画面上側のモーションタイプから、「戦士系」のモーションに「直接攻撃」と「移動」のカスタムモーションを追加しましょう。
名前は「ランス攻撃」と「ランス移動」のように分かりやすいものにしておくと良いです。

「ランス移動」は通常の「移動」からのコピペをベースに作成しましょう。
右の欄のモーション名を右クリックし、「データの引き継ぎ」を行うことで簡単にコピーすることができます。


そして、移動時の全てのコマの武器を真横にします。こうすると自然な感じに轢き逃げしているように見えます。


「ランス攻撃」は実際に轢き逃げを行う部分になるので、1コマ目に命中判定を設定した後、
移動時と同じようにキースプライトと武器スプライトを1コマずつ左へずらしていきます。
1コマごとにどのくらいずらしていけばいいかは移動時のモーションを参考にするとよいでしょう。
(デフォルトの通常クラスの移動モーションであれば1コマ目のx座標を297に設定し、以降のコマのx座標を-30ずつしていけばOK)


最終的にx座標が27より少なくなるまで移動させればゲーム中では画面外へ去っていくように見えるようになります。
(境界線の設定がデフォルトの場合)

後は上記で作成した「再攻撃・連続攻撃不可能の一方向武器」のモーション情報で
全ての直接攻撃(クリティカル、瞬殺含む)をランス攻撃に、
全ての移動(移動前攻撃、クリティカル、瞬殺含む)をランス移動に設定すれば、
「リアル戦闘時に轢き逃げ攻撃を行う一方向武器」の完成です。

バグ覚悟でベルサガの槍武器全般的なものを作る

一応、「特定の武器を装備中の時は直前の消費移動力が攻撃力に反映される」ようにする方法を載せておきます。
前述の通り敵ターン中にスキップするとその分の補正が攻撃力に入らなくなるバグが存在するため、
味方だけ使用可能にするなどの工夫が必要だと思われます。
(この現象に限らず、SRPG Studioのスキップ機能はバグ・フリーズの温床である……)

(function() {

	var alias1 = AbilityCalculator.getPower;

	AbilityCalculator.getPower = function(unit, weapon) {
			var pow = alias1.call(this, unit, weapon);

			if (typeof weapon.custom.idou == 'number') {
				pow += weapon.custom.idou * unit.getMostResentMov();
			}
					
			return pow;
	};

})();

武器のカスタムパラメータ「idou」の数値×消費移動力分の補正を攻撃力に追加します。
この補正が反映されるのは移動後の攻撃対象選択時のみであり、
ユニットステータスなどでは一切反映されません。(この時は消費移動力が0になっているので)
最終更新:2017年05月06日 04:41