バトルシステムテスト

← ゲームに戻る

共通システム 全案共通

ATB(アクティブタイムバトル)

毎ティック、各モンスターの ATBゲージ が SPD 値 分ずつ増加する。ゲージが 100 に達したモンスターの行動順が来る。行動完了後はゲージが 0 にリセット される。

// Timelineクラス tick() より gauge += stats.spd // gauge >= 100 で行動(コマンド選択中は 100% 表示) gauge = 0 // 行動完了後にリセット
SPD が高いほど連続行動しやすい。「速攻 vs 耐久」プリセットでは SPD 50 vs 30。

控えモンスター ST 自動回復

いずれかのモンスターが行動を完了するたびに、同チームの控えモンスターの ST が max_st の 5% 回復する。

// Timeline onActionCompleted() より bench_monster.current_st += stats.max_st * 0.05

属性相性システム(AFFINITY)

スキルの属性と防御側の主・副属性を参照して相性倍率を計算する。

パターン倍率備考
有利属性(主 or 副)× 1.25例: fire → ice
不利属性× 0.8例: fire → water
等倍× 1.0
ダブル弱点(主・副属性の両方に有利)× 4.0通常の合算ではなく固定値
// 相性倍率計算 aff = AFFINITY[skill.element][defender.main_element] * AFFINITY[skill.element][defender.sub_element] // ただし両方 >1.0 のときは aff = 4.0(固定)

STAB(同属性ボーナス)

攻撃側の主属性または副属性がスキル属性と一致する場合、スキルの実効威力が ×1.5 になる。無属性技(element: "none")はSTABの対象外。

is_stab = s_elem !== 'none' && (attacker.main_element === s_elem || attacker.sub_element === s_elem) effPow = is_stab ? base_power × 1.5 : base_power

連続行動ペナルティ(ST コスト増加)

自分のターンが連続するたびに、攻撃カテゴリのスキルの ST 消費が増加する。素早さが高いモンスターが一方的に攻め続けることへの抑制として機能する。

// attacker.consecutive_count = 連続行動回数(1から始まる) extra_cost = (consecutive_count - 1) × 5 cost = max(10, skill.cost_st) + extra_cost // 例: 連続1回目 → +0ST、2回目 → +5ST、3回目 → +10ST ...
連続行動回数追加STコスト例(基本コスト20のとき)
1回目(通常)+020 ST
2回目+525 ST
3回目+1030 ST
4回目+1535 ST
n回目+(n-1)×5
  • 相手が1回行動するとカウントが リセット される
  • attack カテゴリのスキルのみ対象。Defend・回復技にはペナルティなし
  • バトルログに 「連続+XST」 と表示される

Defend アクション

攻撃せずに防御体制を取るアクション。自分のターンでも相手の攻撃ターン(リアクション)でも選択可能。

  • 自分の ST を max_st の +30% 回復(上限クリップ)
  • is_defending = true セット → 次に被弾したとき HP/ST ダメージが ×0.5
  • 案1・案2 ではブレイク状態 (is_break) を解除

リアクションシステム(相手ターン中の防御行動)

相手のATBが100に達して攻撃ターンが来ると、攻撃が実行される前にプレイヤー側へ防御行動の選択肢が提示される。

選択肢効果
防御系技(category: defense)ST回復・バフなど。STコストを消費するが自分のATBターンは消費しない
DefendST +30%回復・is_defending=true。ダメージを半減できる
スキップ何もせず相手の攻撃をそのまま受ける
リアクションはATBターンを消費しない。選択後に相手の攻撃が実行される。

案1: 現行実装 EngineCase1 / BattleEngine

STはシールドとして機能する。STが0になるとブレイク状態になり無防備になるが、攻撃自体は継続できる。

ST ダメージ(ペナルティシステム)

攻撃技カテゴリのスキルを使用するたびに、防御側に 固定ペナルティ として ST ダメージが入る。スキルの damage_st エフェクトは通常時は 使用されない

// ペナルティ計算 penalty = 10 // 基本ペナルティ penalty += 10 // 属性有利の場合(aff > 1.0) penalty += 10 // 圧倒判定: effPow × atkStat > defStat × defender.current_st // 最大ペナルティ: -30 ST

圧倒判定の詳細

攻撃力が防御側の現在の防御力を上回っているかを判定する。ST が減るほど防御力が落ちるため、連続攻撃でペナルティが増加しやすくなる。

effPow = skill.base_power × (STAB ? 1.5 : 1.0) total_attack = effPow × attacker.atk // or .mag total_defense = defender.def × defender.current_st // total_attack > total_defense → penalty +10

ブレイク状態

防御側の ST が 0 になると is_break = true になる。

  • 被ペナルティはSTではなくHPに直接入る
  • damage_st エフェクトが発動し威力計算でHP実ダメが入る
  • 自分がブレイク中に技を使うとコスト(最低 10)がHPから消費される
  • 攻撃技は使用可能(案2との違い)

ブレイク中 HP ダメージ倍率

raw = base_power × (atk / def) × aff // ブレイク倍率 mult = aff == 4.0 ? 8.0 // ダブル弱点 : aff > 1.0 ? aff × 2.0 // 属性有利 : 2.0 // 等倍 hp_damage = floor(raw × mult)

行動フロー

スキル使用
STコスト消費(自分)
ペナルティST/HPダメ(相手)
エフェクト処理
終了
自分がブレイク中
コストはHP消費
|
相手がブレイク中
ペナルティはHP直撃

案2: ブレイク強化 EngineCase2

案1と全く同じロジックに加え、ブレイク中の攻撃技を完全禁止する制約を追加した案。

案1 との差分

追加制約: ブレイク中は攻撃カテゴリのスキルが使用不可

executeSkill() の先頭でブロック。エラー BREAK_NO_ATTACK を返す。
プレイヤーUIでは攻撃ボタンが disabled 化される。
AIは自動的に Defend を実行する。

ブレイク状態での選択肢

アクション可否効果
攻撃技使用不可BREAK_NO_ATTACK エラー
Defend使用可ST +30%・ブレイク解除
trap カテゴリ技使用可trap は attack でないため許可
回復アイテム使用可通常通り

戦略的含意

  • STが0になると必ず1ターン休息(Defend)が強制される
  • ST消耗 → ブレイク → Defend → 復帰 のサイクルが明確
  • 案1より攻防のリズムが生まれやすい

案3: ST固定+HP溢れ EngineCase3

ブレイクという概念が存在しない。攻撃は常にST固定ダメージを与えつつ、スキル威力がST防御を超えた分だけHPに溢れダメージを与える。STが減るほど次の攻撃でHPに溢れやすくなる。

ブレイクなし設計

  • is_break フラグは使用・参照しない
  • ST が 0 になると行動不能(自動的に Defend 扱い)
  • スキルコストは常にST消費のみ(HP消費は発生しない)
  • BREAKバッジはUIに表示されない

ダメージ計算(damage_st エフェクト)

damage_st エフェクトを持つスキルは、ST 固定ダメージと HP 溢れダメージの2種類を同時に与える。

// _calcDamage() より effPow = base_power × (STAB ? 1.5 : 1.0) // ST固定ダメージ(ヒット確定) st_damage = min(current_st, 10 + (苦手属性 ? 10 : 0)) // HP溢れダメージ(威力がST防御を超えた分) pow_atk = effPow × atk st_def = defender.current_st × def hp_damage = max(0, floor(pow_atk - st_def))

ST残量とHP溢れダメージの関係

ST残量ST固定ダメHP溢れダメ(例: たいあたり)状況
100(満タン)-100(完全シールド)pow×atk < 100×def
50-10pow×atk超過分が流入STが半減→シールドも半減
10-10大量に流入ST薄い→ほぼHP直撃
0(空)0(不能)pow×atkがそのままHP流入行動不能・全ダメHP直撃

攻撃側のST消耗も重要

攻撃するたびに自分の ST もコスト分減る。ST が減ると st_def(current_st × def)が低下 し次の被弾でHP溢れが増える。攻めれば攻めるほど自分も脆くなるトレードオフ。

案3ではDefend(ST+30%)が攻守両面で重要。STを回復することで自分のHP防御壁(st_def)を維持できる。

3案 比較表 サマリ

項目 案1: 現行 案2: ブレイク強化 案3: ST固定+HP溢れ
ブレイク概念 あり あり なし
ブレイク中の攻撃技 使用可能 使用不可
ブレイク中のコスト消費先 HP から消費 —(攻撃不可のため不問)
ST → HP の移行方式 ブレイク後に全HP流入 ブレイク後に全HP流入 毎攻撃:固定ST削り+威力超過分がHP直撃
ブレイク中被ダメ倍率 ×2.0 〜 ×8.0 ×2.0 〜 ×8.0 なし(倍率変化なし)
STダメージの発生源 固定ペナルティのみ(-10〜-30) 固定ペナルティのみ(-10〜-30) 固定ダメージ -10(苦手属性 -20)
HPダメージの発生源 ブレイク後のみ ブレイク後のみ max(0, pow×atk − current_st×def)
ゲームリズム ST削り → ブレイク → 大ダメージ ST削り → ブレイク → 強制休息 → 復帰 毎ターンST/HP両方消耗する持久戦
戦略の幅 ブレイク中も攻め続けるか選択可能 ブレイク回避とDefendタイミングが重要 STを維持して防御壁を保つかトレードオフ
連続行動ペナルティ あり(攻撃ST+5/連続) あり(攻撃ST+5/連続) あり(攻撃ST+5/連続)
AI の挙動 ランダム選択 ブレイク中は自動 Defend ランダム選択

スキルエフェクト一覧 全案共通定義

各スキルは effects[] 配列でエフェクトを持つ。エフェクトのタイプによって動作が異なる。

type案1・案2 での動作案3 での動作
damage_st 通常時: スキップ(ペナルティで処理済み)
ブレイク時: 威力計算で HP 実ダメ(×2〜×8倍率)
ST固定ダメ: -10(苦手属性 -20)
HP溢れダメ: max(0, effPow×atk − current_st×def)
damage_hp_direct HP 直接ダメージ(base_power 固定値)
ブレイク時 ×2.0、防御時 ×0.5
HP 直接ダメージ(同左。ブレイク倍率なし)
防御時 ×0.5 のみ
delay_gauge 相手の ATB ゲージを value 分減少(全案共通)
recover_st_direct 自分の ST を value 分回復。ST > 0 ならブレイク解除 自分の ST を value 分回復(ブレイク解除なし)
recover_hp ターゲットの HP を value 分回復(全案共通)
recover_st (BattleEngineのみ) max_st の percent% + st_rec の値を回復
(game.js の BattleEngine クラスのみ)

スキルコスト(ST 消費)

cost = max(10, skill.cost_st) // 最低コスト 10 // 案1・案2: ブレイク中は cost が HP から消費 // 案3: 常に ST から消費(HPには影響しない) // 案4: ST=0 時のみ HP から消費(逆転可能)

スキルカテゴリ

category説明ペナルティ対象
attack通常攻撃技対象
trap罠系(設置攻撃)対象
support回復・補助技対象外
itemバトルアイテム対象外

案4: 改良版(現在の本番候補) EngineCase4

案3をベースに「ST削り威力連動・ST=0時HP消費継続・連続行動ペナルティ倍増・属性倍率調整」の4点を改良。スマホ短時間プレイを想定した1〜2分バトルを目標とする。

案3からの変更点

項目案3案4
ST削り量 固定 10(弱点 +10) effPow/3 + 弱点?10 (範囲 5〜25)
ST=0 時の行動 行動不能(auto-Defend) HP からコスト消費で攻撃継続可能
連続行動コスト増加 +5 ST/回 +10 ST/回
STAB 倍率 ×1.5 ×1.3
ダブル弱点上限 ×4.0 ×3.0
Defend 時 HP 溢れダメ 軽減なし ×0.5 軽減

ダメージ計算式

// ST ダメージ(威力連動) st_raw = floor(effPow / 3) + (is_weakness ? 10 : 0) st_dmg = clamp(st_raw, 5, 25) // HP 溢れダメージ overflow = max(0, effPow × atk − current_st × def) hp_dmg = floor(overflow × (is_defending ? 0.5 : 1.0)) // ST=0 時のみ HP からコスト消費 if (current_st == 0 && category == 'attack') hp -= cost

本番への切替方法

game.js 1行目の切替ラインを変更するだけ:
export { EngineCase3 as BattleEngine } from './test-engines.js';
export { EngineCase4 as BattleEngine } from './test-engines.js';
TUTORIAL

👆 タップして説明を見る

-