combat-system-creator

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Combat System Creator - SHINOBI WAY

战斗系统创建工具 - 《SHINOBI WAY》

Create combat system components following the dual-system architecture: pure calculations separated from state workflow.
遵循双系统架构创建战斗系统组件:将纯计算与状态工作流分离。

Architecture Principle

架构原则

Player Action → CombatCalculationSystem (pure math) → CombatWorkflowSystem (apply to state)
CombatCalculationSystem: Pure functions, no mutations, returns complete results CombatWorkflowSystem: State management, applies calculated results, controls flow
Player Action → CombatCalculationSystem (pure math) → CombatWorkflowSystem (apply to state)
CombatCalculationSystem:纯函数,无状态变更,返回完整结果 CombatWorkflowSystem:状态管理,应用计算结果,控制流程

When to Use

适用场景

  • Add new damage calculations or formulas
  • Create new status effects or mitigation mechanics
  • Add new combat phases or turn logic
  • Refactor existing combat code
  • Balance or modify combat math
  • 添加新的伤害计算或公式
  • 创建新的状态效果或减伤机制
  • 添加新的战斗阶段或回合逻辑
  • 重构现有战斗代码
  • 平衡或修改战斗数值

Quick Reference

快速参考

Damage Pipeline (5 Steps)

伤害计算流程(5步)

1. Hit Check    → MELEE: Speed vs Speed | RANGED: Accuracy vs Speed | AUTO: Always hits
2. Base Damage  → ScalingStat × damageMult
3. Element      → Super: 1.5× (+10% crit) | Resist: 0.5× | Neutral: 1.0×
4. Critical     → 8% + (DEX × 0.5) + bonuses, max 75%, multiplier 1.75×
5. Defense      → Flat (max 60% reduction) then % (soft cap 75%)
1. Hit Check    → MELEE: Speed vs Speed | RANGED: Accuracy vs Speed | AUTO: Always hits
2. Base Damage  → ScalingStat × damageMult
3. Element      → Super: 1.5× (+10% crit) | Resist: 0.5× | Neutral: 1.0×
4. Critical     → 8% + (DEX × 0.5) + bonuses, max 75%, multiplier 1.75×
5. Defense      → Flat (max 60% reduction) then % (soft cap 75%)

Mitigation Pipeline (Priority Order)

减伤流程(优先级顺序)

1. INVULNERABILITY → Blocks ALL damage (return 0)
2. REFLECTION      → Calculate reflected damage (before curse)
3. CURSE           → Amplify: damage × (1 + curseValue)
4. SHIELD          → Absorb damage before HP
5. GUTS            → Survive at 1 HP if roll succeeds
1. INVULNERABILITY → Blocks ALL damage (return 0)
2. REFLECTION      → Calculate reflected damage (before curse)
3. CURSE           → Amplify: damage × (1 + curseValue)
4. SHIELD          → Absorb damage before HP
5. GUTS            → Survive at 1 HP if roll succeeds

Defense Formulas

防御公式

TypeFlatPercent (Soft Cap)
Physical
STR × 0.3
STR / (STR + 200)
Elemental
SPI × 0.3
SPI / (SPI + 200)
Mental
CAL × 0.25
CAL / (CAL + 150)
类型固定防御百分比防御(软上限)
物理
STR × 0.3
STR / (STR + 200)
元素
SPI × 0.3
SPI / (SPI + 200)
精神
CAL × 0.25
CAL / (CAL + 150)

Damage Properties

伤害属性

PropertyFlat Def% Def
NORMAL✅ (max 60%)
PIERCING
ARMOR_BREAK
TRUE
属性固定防御减免百分比防御减免
NORMAL✅(最高60%)
PIERCING
ARMOR_BREAK
TRUE

Workflow: Adding New Mechanics

工作流:添加新机制

Step 1: Identify System

步骤1:确定所属系统

Ask: Is this pure math or state management?
CombatCalculationSystemCombatWorkflowSystem
Damage formulasApplying damage to HP
Hit/miss/evasion rollsTurn order management
Crit calculationsBuff duration tracking
Defense reductionPhase transitions
Effect chance rollsCombat log generation
思考:这是纯计算还是状态管理?
CombatCalculationSystemCombatWorkflowSystem
伤害公式将伤害应用到HP
命中/闪避判定回合顺序管理
暴击计算增益效果时长追踪
防御减免计算阶段转换
效果触发概率判定战斗日志生成

Step 2: Design the Calculation Interface

步骤2:设计计算接口

For new calculations, define the result interface:
typescript
interface NewMechanicResult {
  // All values needed to apply this mechanic
  value: number;
  triggered: boolean;
  // Metadata for logging
  logs: CombatLogEntry[];
}
对于新的计算逻辑,定义结果接口:
typescript
interface NewMechanicResult {
  // 应用该机制所需的所有值
  value: number;
  triggered: boolean;
  // 日志元数据
  logs: CombatLogEntry[];
}

Step 3: Implement Pure Function

步骤3:实现纯函数

typescript
// In CombatCalculationSystem
function calculateNewMechanic(
  attackerStats: DerivedStats,
  defenderStats: DerivedStats,
  context: CombatContext
): NewMechanicResult {
  // Pure calculation - NO state mutation
  return { value, triggered, logs };
}
typescript
// 在CombatCalculationSystem中
function calculateNewMechanic(
  attackerStats: DerivedStats,
  defenderStats: DerivedStats,
  context: CombatContext
): NewMechanicResult {
  // 纯计算 - 无状态变更
  return { value, triggered, logs };
}

Step 4: Implement Workflow Application

步骤4:实现工作流应用逻辑

typescript
// In CombatWorkflowSystem
function applyNewMechanic(
  state: CombatWorkflowState,
  result: NewMechanicResult
): CombatWorkflowState {
  // Apply result to state - returns NEW state
  return { ...state, /* updated values */ };
}
typescript
// 在CombatWorkflowSystem中
function applyNewMechanic(
  state: CombatWorkflowState,
  result: NewMechanicResult
): CombatWorkflowState {
  // 将结果应用到状态 - 返回新状态
  return { ...state, /* 更新后的值 */ };
}

Creating New Status Effects

创建新状态效果

Effect Types Available

可用效果类型

typescript
// Damage Over Time
DOT, BLEED, BURN, POISON

// Crowd Control
STUN, CONFUSION, SILENCE

// Defensive
SHIELD, INVULNERABILITY, REFLECTION

// Stat Modifiers
BUFF, DEBUFF, CURSE

// Recovery
HEAL, REGEN, CHAKRA_DRAIN
typescript
// 持续伤害
DOT, BLEED, BURN, POISON

// 群体控制
STUN, CONFUSION, SILENCE

// 防御类
SHIELD, INVULNERABILITY, REFLECTION

// 属性修改
BUFF, DEBUFF, CURSE

// 恢复类
HEAL, REGEN, CHAKRA_DRAIN

Effect Interface

效果接口

typescript
interface SkillEffect {
  type: EffectType;
  value: number;           // Damage/heal amount or multiplier
  duration: number;        // Turns (-1 = permanent)
  chance: number;          // 0.0-1.0 application chance
  targetStat?: PrimaryStat; // For BUFF/DEBUFF
  damageType?: DamageType;  // For DoTs
  damageProperty?: DamageProperty;
}
typescript
interface SkillEffect {
  type: EffectType;
  value: number;           // 伤害/治疗量或乘数
  duration: number;        // 持续回合数(-1 = 永久)
  chance: number;          // 触发概率(0.0-1.0)
  targetStat?: PrimaryStat; // 用于BUFF/DEBUFF
  damageType?: DamageType;  // 用于持续伤害
  damageProperty?: DamageProperty;
}

DoT Damage Formula

持续伤害公式

typescript
// DoTs get 50% defense mitigation
dotDamage = max(1, baseDamage - (flatDef × 0.5) - (damage × percentDef × 0.5))
typescript
// 持续伤害仅受到50%的防御减免
dotDamage = max(1, baseDamage - (flatDef × 0.5) - (damage × percentDef × 0.5))

Creating New Combat Phases

创建新战斗阶段

Existing Turn Phases

现有回合阶段

Player Turn:
  1. TURN_START → Reset flags
  2. UPKEEP → Toggle costs, passive regen
  3. MAIN_ACTION → Skill execution
  4. DEATH_CHECK → Victory/defeat
  5. TURN_END → Mark turn complete
Enemy Turn:
  1. DOT_ENEMY → Process enemy DoTs
  2. DOT_PLAYER → Process player DoTs (through shield)
  3. DEATH_CHECK_DOT → Check DoT kills
  4. ENEMY_ACTION → AI skill selection + execution
  5. DEATH_CHECK_ATTACK → Check combat kills
  6. RESOURCE_RECOVERY → Cooldowns, chakra regen
  7. TERRAIN_HAZARDS → Environmental damage
  8. FINAL_DEATH_CHECK → Hazard kills
玩家回合:
  1. TURN_START → 重置标记
  2. UPKEEP → 扣除消耗,被动恢复
  3. MAIN_ACTION → 技能执行
  4. DEATH_CHECK → 判定胜负
  5. TURN_END → 标记回合结束
敌人回合:
  1. DOT_ENEMY → 处理敌人的持续伤害
  2. DOT_PLAYER → 处理玩家的持续伤害(先通过护盾抵消)
  3. DEATH_CHECK_DOT → 判定持续伤害是否造成击杀
  4. ENEMY_ACTION → AI选择并执行技能
  5. DEATH_CHECK_ATTACK → 判定攻击是否造成击杀
  6. RESOURCE_RECOVERY → 冷却重置,查克拉恢复
  7. TERRAIN_HAZARDS → 环境伤害
  8. FINAL_DEATH_CHECK → 判定环境伤害是否造成击杀

Adding New Phase

添加新阶段

typescript
// 1. Add to CombatPhase enum
enum CombatPhase {
  // ... existing
  NEW_PHASE,
}

// 2. Create calculation function
function calculateNewPhaseEffects(state: CombatWorkflowState): NewPhaseResult;

// 3. Create workflow handler
function processNewPhase(state: CombatWorkflowState): CombatWorkflowState;

// 4. Insert into turn flow in processEnemyTurn or executePlayerAction
typescript
// 1. 添加到CombatPhase枚举
enum CombatPhase {
  // ... 现有阶段
  NEW_PHASE,
}

// 2. 创建计算函数
function calculateNewPhaseEffects(state: CombatWorkflowState): NewPhaseResult;

// 3. 创建工作流处理函数
function processNewPhase(state: CombatWorkflowState): CombatWorkflowState;

// 4. 插入到processEnemyTurn或executePlayerAction的回合流程中

Output Templates

输出模板

New Calculation Function

新计算函数

typescript
/**
 * [Description of what this calculates]
 * @param attackerStats - Attacker's derived stats
 * @param defenderStats - Defender's derived stats
 * @param skill - The skill being used
 * @returns [ResultType] with all calculation details
 */
export function calculateX(
  attackerStats: DerivedStats,
  defenderStats: DerivedStats,
  skill: Skill
): XResult {
  const result: XResult = {
    // Initialize result object
  };

  // Pure calculations here
  // NO state mutation
  // Use Math.random() for rolls

  return result;
}
typescript
/**
 * [该函数的计算说明]
 * @param attackerStats - 攻击者的派生属性
 * @param defenderStats - 防御者的派生属性
 * @param skill - 当前使用的技能
 * @returns [结果类型],包含所有计算细节
 */
export function calculateX(
  attackerStats: DerivedStats,
  defenderStats: DerivedStats,
  skill: Skill
): XResult {
  const result: XResult = {
    // 初始化结果对象
  };

  // 纯计算逻辑
  // 无状态变更
  // 使用Math.random()进行概率判定

  return result;
}

New Workflow Function

新工作流函数

typescript
/**
 * [Description of what state changes this applies]
 * @param state - Current combat state
 * @param result - Calculation result to apply
 * @returns New combat state with changes applied
 */
export function applyX(
  state: CombatWorkflowState,
  result: XResult
): CombatWorkflowState {
  // Create new state object (immutable)
  const newState = { ...state };

  // Apply result values to state
  // Add combat logs
  // Check for combat end conditions

  return newState;
}
typescript
/**
 * [该函数的状态变更说明]
 * @param state - 当前战斗状态
 * @param result - 要应用的计算结果
 * @returns 应用变更后的新战斗状态
 */
export function applyX(
  state: CombatWorkflowState,
  result: XResult
): CombatWorkflowState {
  // 创建新的状态对象(不可变)
  const newState = { ...state };

  // 将结果值应用到状态
  // 添加战斗日志
  // 检查战斗结束条件

  return newState;
}

New Effect Implementation

新效果实现

typescript
// In constants/index.ts - Add to SKILLS
NEW_SKILL: {
  id: 'new_skill',
  name: 'New Skill Name',
  // ... other properties
  effects: [{
    type: EffectType.NEW_EFFECT,
    value: 10,
    duration: 3,
    chance: 0.8,
    damageType: DamageType.PHYSICAL,
    damageProperty: DamageProperty.NORMAL
  }]
}

// In CombatSystem.ts - Handle in applyMitigation or processDoT
if (buff.effect.type === EffectType.NEW_EFFECT) {
  // Calculate effect
  // Apply to appropriate target
}
typescript
// 在constants/index.ts中 - 添加到SKILLS
NEW_SKILL: {
  id: 'new_skill',
  name: 'New Skill Name',
  // ... 其他属性
  effects: [{
    type: EffectType.NEW_EFFECT,
    value: 10,
    duration: 3,
    chance: 0.8,
    damageType: DamageType.PHYSICAL,
    damageProperty: DamageProperty.NORMAL
  }]
}

// 在CombatSystem.ts中 - 在applyMitigation或processDoT中处理
if (buff.effect.type === EffectType.NEW_EFFECT) {
  // 计算效果
  // 应用到目标
}

Reference Files

参考文件

  • combat-mechanics.md - Full combat formulas and constants
  • architecture.md - Dual-system architecture details
  • combat-mechanics.md - 完整的战斗公式和常量
  • architecture.md - 双系统架构细节

Balance Constants

平衡常量

Resource Pools

资源池

  • HP:
    50 + (WIL × 12)
  • Chakra:
    30 + (CHA × 8)
  • HP Regen:
    maxHP × 0.02 × (WIL / 20)
  • Chakra Regen:
    INT × 2
  • HP:
    50 + (WIL × 12)
  • 查克拉:
    30 + (CHA × 8)
  • HP恢复:
    maxHP × 0.02 × (WIL / 20)
  • 查克拉恢复:
    INT × 2

Combat Constants

战斗常量

  • Base Hit: 92%
  • Hit Range: 30-98%
  • Base Crit: 8%
  • Crit Cap: 75%
  • Crit Mult: 1.75×
  • Flat Def Cap: 60% of damage
  • % Def Cap: 75%
  • 基础命中率: 92%
  • 命中范围: 30-98%
  • 基础暴击率: 8%
  • 暴击率上限: 75%
  • 暴击倍数: 1.75×
  • 固定防御减免上限: 伤害的60%
  • 百分比防御减免上限: 75%

Survival

生存相关

  • Guts:
    WIL / (WIL + 200)
  • Status Resist:
    CAL / (CAL + 80)
  • Evasion:
    SPD / (SPD + 250)
  • 不屈(Guts):
    WIL / (WIL + 200)
  • 状态抗性:
    CAL / (CAL + 80)
  • 闪避率:
    SPD / (SPD + 250)