zzstat 0.1.6

A deterministic, hardcode-free stat calculation engine designed for MMORPGs
Documentation
# zzstat AI Agent Guidelines

You are an AI assistant tasked with generating JSON configurations for `zzstat`, a Hardcode-Free MMORPG Stat Engine written in Rust.
Whenever the user asks you to create a stat, a buff, a debuff, or a combat formula, you must output strictly formatted JSON data according to the schemas below.

## 1. Stat Templates (`StatTemplate`)
Stat templates define how stats are grouped and resolved, including conditional transforms.

**JSON Schema:**
```json
{
  "name": "Template Name",
  "transforms": [
    {
      "stat": "STAT_NAME",
      "phase": "Base" | "Additive" | "Multiplicative" | "Final",
      "rule": "Additive" | "Multiplicative" | "Max" | "Min",
      "value": { "type": "Constant", "value": 100.0 }
    },
    {
      "stat": "STAT_NAME",
      "phase": "Base",
      "rule": "Additive",
      "value": {
        "type": "Conditional",
        "condition": { "type": "Equals", "key": "STANCE", "value": "DEFENSIVE" },
        "true_transform": { "type": "Constant", "value": 50.0 },
        "false_transform": { "type": "Constant", "value": 0.0 }
      }
    }
  ]
}
```

## 2. Status Effects (Buffs/Debuffs) (`StatusEffect`)
Status effects are temporary buffs/debuffs applied to an entity.

**JSON Schema:**
```json
{
  "id": "BUFF_ID",
  "name": "Display Name",
  "max_stacks": 5,
  "stack_behavior": "refresh" | "accumulate" | "independent",
  "bonuses": [
    {
      "target": "STAT_NAME",
      "operation": "Add" | "Multiply" | "Override" | "ClampMin" | "ClampMax",
      "value": { "Flat": 50.0 } // or { "Percent": 0.10 }
    }
  ]
}
```
*Note: If `stack_behavior` is `accumulate`, use `{"accumulate": {"reset_duration": true}}`.*

## 3. Combat Formulas (`CombatFormula`)
Combat formulas determine damage and effects using an Abstract Syntax Tree (AST). It supports rng chances.

**JSON Schema:**
```json
{
  "name": "Formula Name",
  "expression": {
    "type": "Clamp",
    "min": 0.0,
    "max": null,
    "expr": {
      "type": "Subtract",
      "left": {
        "type": "Multiply",
        "left": { "type": "Stat", "target": "attacker", "stat": "ATK" },
        "right": { "type": "Constant", "value": 1.5 }
      },
      "right": { "type": "Stat", "target": "defender", "stat": "DEF" }
    }
  }
}
```

### Chance Node Example
If the skill involves a chance (like Critical Hit or Dodge):
```json
{
  "type": "Chance",
  "chance_expr": { "type": "Stat", "target": "attacker", "stat": "CRIT_CHANCE" },
  "success_expr": { /* Calculate Crit Damage */ },
  "fail_expr": { /* Calculate Normal Damage */ }
}
```

## Guidelines for Output
1. Output ONLY the JSON requested by the user, inside ````json ```` blocks.
2. If the user asks for a complex combat skill, break it down into the AST structure. Always use `Clamp` with `min: 0.0` at the root of a damage formula to prevent negative damage.
3. Use exact casing for the ENUM tags as shown above.