状態異常とバフ・デバフ による効果値の加算や上書きをする
Description
- 状態異常 燃焼 , 混乱 .. 効果時間が長い方を優先 効果が強い方で上書き 両方いいとこ取りする
- バフ・デバフ .. パラメータの増減 .. バフデバフ重ねがけあり。上昇値は乗算じゃなく加算 20%upを2回やった場合 40% 、管理は個別にしておいて、時間が来たらそれぞれ切れていけば良さげ。
Comments (3)
現状の実装状況
調査結果をまとめます。
現在の重ねがけ処理
付与時: 常に新規追加(上書きなし)
battle-effect.ts:315-326 の applyStatusEffect を見ると:
// 常に新規追加
const statusEffect = { id: statusEffectId, instanceId: getInstanceId(), duration, params, ... };
entity.statusEffects.push(statusEffect);
同じ状態異常が複数付与された場合、重複チェックなしでそのまま配列に積まれます。
参照時の挙動:種類によって異なる
種類: バフ/デバフ系(attack_power_up/down, defense_up/down, evasion_up, attack_speed_up, critical_percent_up)
参照方法: .filter() で全件取得し、ループで累積適用
重ねがけの効果: 効果が重なる(乗算で累積)
────────────────────────────────────────
種類: 行動制御系(stun, freeze, confusion)
参照方法: .some() で1つでもあればtrue
重ねがけの効果: duration が長い方が残るだけ(効果自体は変わらない)
────────────────────────────────────────
種類: DoT系(dot_damage)
参照方法: 各インスタンスごとにprocessStatusEffectIntervalで個別処理
重ねがけの効果: それぞれ独立してダメージ発生(実質重なる)
────────────────────────────────────────
種類: slow
参照方法: 移動速度計算時に全件参照して累積
重ねがけの効果: 効果が重なる
具体例
- 攻撃力+20% を2回付与 → 1.2 × 1.2 = 1.44倍 に(乗算累積)
- スタン を2回付与 → スタン状態自体は1つ分と同じ挙動(duration の長い方が残って効く)
- DoT 125ダメ/0.5秒 を2回付与 → 2つ独立して各0.5秒ごとにダメージ発生
期限切れ
tickStatusEffects(battle-effect.ts:241-257)で毎tick全ての状態異常のdurationを減らし、0以下になったものを配列から除去します。各イン
スタンスが独立してdurationを持つので、先に付与されたものから順に消えます。
slow は「移動速度版のデバフ」であり、処理の書き場所が違うだけ(damage-calculator.ts ではなく applyStatusEffectsLogic 内の switch
文)で、累積の仕組み自体はバフ・デバフと同じです。
[状態異常とバフデバフ]
重ねがけの処理を修正します。
・バフ・デバフ(attack_power_up/down, defense_up/down, evasion_up, attack_speed_up, critical_percent_up)(slow含む)
- 重ねがけが発生した場合、それぞれの効果を加算します。(攻撃力+20% を 2回付与 => 40%のattackupとする)
- 効果時間は、それぞれのバフ・デバフ個別に管理します
・Dot系(dot_damage)
- 重ねがけが発生した場合、効果時間が長い方を優先、効果が強い方を優先してマージします
- 燃焼が2個かさなって、片方が残り3秒/dotダメージ10、片方が残り5秒/dotダメージ5の場合 => 5秒/dotダメージ10 の効果にする
・行動制御系(stun, freeze, confusion)
- 現状のままでOK