データベースでもっと詳しく調べる必要があるのか、それともそのような別のスクリプトが必要なのか?
スキルの「クリティカルヒット」設定は、クリティカルヒットが発生するかどうかだけを制御します。実際の確率は、ユーザーのクリティカル率と対象のクリティカル回避率に基づいて計算されるため、確実なクリティカルヒットを可能にするデータベース設定はありません。
クリティカルヒットのメッセージが必要ない場合、Aceではクリティカルダメージが3倍になるため、「クリティカルヒット」を無効にして、ダメージ式を3倍にすることで同じ効果を得られます。例えば、(a.atk * 4 - b.def * 2) * 3 のようにします。これにより、クリティカルヒットと同じダメージを与えられます。
メッセージ付きの実際のクリティカルヒットを実現したい場合は、小さなスクリプトを使用できます。スクリプトエディタ(F11)を開き、▼素材(▼メインより上)の下に新しいスロットを挿入して、以下のコードを貼り付けてください。
class Game_Battler
alias always_crit_item_cri item_cri
def item_cri(user, item)
return 1.0 if item.note =~ /<always crit>/i
always_crit_item_cri(user, item)
end
end
その後、常にクリティカルヒットさせるスキルNote欄に <always crit> を追加してください。対象のクリティカル回避率も無視されるため、攻撃が命中するたびに必ずクリティカルヒットになります。
やあ、Bazさん。MVでも似たような状況に遭遇していて、もしお時間があればぜひお手伝いいただけないでしょうか。
私はYanflyプラグインをかなり多用しているのですが、BattleCore、CriticalControl、Buffs&StatesCore、DamageCoreを組み合わせて、「オフバランス」という状態を作成しようと考えています。この状態は、攻撃を受けた際に必ずクリティカルヒットが発生するよう保証するものです。物理攻撃が外れた場合にこの状態を付与する、グローバルなパッシブ追跡スキルを通じて発動するように設定しています。
最後の部分については、以下のノテタグを使って完璧に動作しているようです。
<Custom Deselect Effect>
if (this.isPhysical() && (target.result().missed || target.result().evaded)) {
user.addState(13);
}
</Custom Deselect Effect>
私の問題点は、もちろん、効果適用時にクリティカルヒットが発生しないことです。これが「オフバランス」状態に設定しているノテタグです。
<Custom Select Effect>
// 着弾する攻撃をクリティカルヒットに強制する(スキルがクリティカルを許可している場合のみ)
var skill = this.item();
if (skill && skill.damage.critical) {
this._prevForcedCriticalHit = $gameSystem._forceCritical;
this._prevForcedNoCriticalHit = $gameSystem._forceNoCritical;
BattleManager.actionForceCritical();
}
</Custom Select Effect>
<Custom Deselect Effect>
// 以前のクリティカル設定を復元する
if (this._prevForcedCriticalHit !== undefined) {
$gameSystem._forceCritical = this._prevForcedCriticalHit;
$gameSystem._forceNoCritical = this._prevForcedNoCriticalHit;
}
</Custom Deselect Effect>
<Custom Respond Effect>
// クリティカルヒットに成功した後、「オフバランス」状態を解除する
if (target.result().critical && target.result().hpDamage > 0) {
target.removeState(stateId);
}
</Custom Respond Effect>
もちろん、このアプローチ自体が間違っている可能性もあります。ご助力いただけますと大変感謝いたします。
あなたのオフバランスのノートタグは、Yanflyのクリティカル脆弱性(Critical Vulnerability)のヒント行と完全に一致しており、タイミングも問題ありません。Selectはヒット判定の前にターゲットに対して実行され、そこでのthisはアクションを指すため、this.item()は正常に機能します。したがって、ステート自体は正常で、強制クリティカルが読み込まれていないだけではないかと考えています。
Force Criticalは1か所でしかチェックされません。それはCritical ControlのmodifyCriticalであり、これはDamage CoreのDamage Step 6からのみ実行されます。Plugin ManagerでDamage Coreを開き、Step 6とStep 7を確認してください。以下のように表示されているはずです:
Damage Step 6: critical = this.modifyCritical(critical, baseDamage, target);
Damage Step 7: target.result().critical = critical;
これらのステップはDamage Core 1.04で再構築され、変更履歴には、以前のバージョンからアップグレードする場合は手動で更新する必要があると記載されています。どちらかが欠落しているか、編集されている場合、エラーなく強制クリティカルがスキップされます。また、Critical Controlはリスト内でDamage Coreの下に配置されている必要があります。
クリティカルが正常に動作するようになったら、もう1つ変更すべき点があります。Respond EffectはDeselectが実行される前にオフバランスを解除するため、Deselectが古い設定を復元する機会がありません。強制クリティカルはアクション終了まで有効なままになり、そのアクション内のその後のすべてのヒットもクリティカルになります。解除処理をDeselect内、復元処理の後に移動することで、この問題を回避できます:
<Custom Select Effect>
var skill = this.item();
if (skill && skill.damage.critical) {
this._prevForcedCriticalHit = $gameSystem._forceCritical;
this._prevForcedNoCriticalHit = $gameSystem._forceNoCritical;
BattleManager.actionForceCritical();
}
</Custom Select Effect>
<Custom Deselect Effect>
if (this._prevForcedCriticalHit !== undefined) {
$gameSystem._forceCritical = this._prevForcedCriticalHit;
$gameSystem._forceNoCritical = this._prevForcedNoCriticalHit;
}
if (target.result().critical && target.result().hpDamage > 0) {
target.removeState(stateId);
}
</Custom Deselect Effect>
Step 6とStep 7が正しく設定されているにもかかわらずクリティカルが機能しない場合、プラグインリストのスクリーンショットをいただければ、ダメージフローに他の影響を与えている要素があるかどうかを判断するのに役立ちます。
ありがとうございます、バズさん!あなたは本当にこのコミュニティの柱ですね。完璧に動いています!
私の問題は、Damage Step 6 にありました。なぜかそこに . という記号を置き換えてしまっていたのです。これが、プレイテストでクリティカルヒットが全く見られなかった理由です。
おそらく、朝早くコーヒーなしで作業を始めた時に起きたミスでしょう。こういうことは決してしてはいけません。
もう一度ありがとうございます。どこに問題があったか気づくのにどれくらい時間がかかったか、想像もつきません。
バズ、愛してる
バズの公式のトリックは初心者にも優しい優れた選択肢です。ダメージを3倍にすることで、スクリプトを一切記述することなくクリティカルレベルのダメージを与えることができます。私のプロジェクトでも重攻撃スキルに同じ手法を用いて完璧に機能しました。実際に「クリティカル!」というメッセージを表示させたい場合は、小さなスクリプトを試す価値もあります。