---
name: edit-word
description: Add a new word or modify an existing word in WordLibrary — changes auto-propagate to WordCard, battle damage, dictionary display, damage popups
---

## What this skill does

Редактирует `scenes/WordLibrary.gd` в функции `build_all()`: добавляет новое слово или меняет существующее. Все изменения сразу применяются везде (карточки, бой, словарь, попапы урона), потому что вся игра читает WordData напрямую.

## WordData structure (scenes/WordData.gd)

Слово создаётся через `_w(text, base_damage, miss_damage, _rarity)` — возвращает `WordData`.

### Поля WordData

| Поле | Тип | Описание |
|------|-----|----------|
| `id` | String | Уникальный ID, совпадает с текстом |
| `text` | String | Отображаемый текст |
| `base_damage` | int | Урон при успешном вводе |
| `miss_damage` | int | Урон игроку при пропуске |
| `level` | int | Уровень (по умолч. 1) |
| `element` | String | `"neutral"` / `"poison"` / `"fire"` / `"frost"` / `"holy"` / `"shadow"` |
| `poison_stacks` | int | Стаки яда (для poison) |
| `fire_burst_bonus` | int | Бонус взрывного урона (для fire) |
| `frost_slow_sec` | float | Замедление в секундах (для frost) |
| `heal_amount` | int | Лечение HP (для holy) |
| `ability_text` | String | Описание способности слова. Если пусто — UI сам сгенерирует строку из element-эффектов |
| `chain_bonus` | int | Цепочечный бонус |
| `deck_synergy_bonus` | int | Бонус синергии колоды |
| `position_bonuses` | Array[PositionBonus] | Список позиционных бонусов (см. ниже) |

## PositionBonus API (scenes/PositionBonus.gd)

Создаётся через `PositionBonus.slot(index, description)` или `PositionBonus.pattern(ids, slots, description)`.

| Метод | Назначение |
|-------|-----------|
| `PositionBonus.slot(slot_index, description)` | Бонус для конкретной позиции (0-4) |
| `PositionBonus.pattern(word_ids, slot_indices, description)` | Паттерн из нескольких слов |

### Поля PositionBonus

| Поле | Тип | Описание |
|------|-----|----------|
| `slot_index` | int | Позиция (0-4) |
| `description` | String | Что увидит игрок |
| `damage_multiplier` | float | Множитель урона (например 1.5 = +50%) |
| `bonus_heal` | int | Дополнительное лечение |
| `bonus_poison` | int | Дополнительные стаки яда |
| `bonus_frost_sec` | float | Дополнительное замедление |
| `cleanse_debuffs` | bool | Снять все негативные эффекты |
| `text_override` | String | Подменить текст слова для ввода |

## Как изменения распространяются

Всё, что нужно отредактировать — `WordLibrary.gd`. Ничего больше. Почему:

- **WordCard.gd** читает все поля WordData напрямую (base_damage, element, ability_text, position_bonuses...) — карточки обновляются автоматически
- **battle_combat.gd** в `_calc_damage()` читает base_damage, element, fire_burst_bonus, frost_slow_sec, heal_amount, poison_stacks — урон и эффекты работают автоматически
- **battle_words_controller.gd** получает WordData и использует text, element — слова падают и вводятся корректно
- **map_screen.gd** вызывает `WordLibrary.build_all()` и строит карточки через `WordCard.build(wd, "dict")` — словарь показывает новое слово
- **damage_numbers.gd** показывает урон который посчитал battle_combat — попапы работают без изменений
- **event_screen / battle_ui / mechanic_shop** используют `WordLibrary.pick_offers()` — новые слова появляются в наградах

Единственное исключение: если добавляется **новый элемент** (не из existing six), надо добавить его цвет в `WordData.get_element_color()` и иконку в `WordData.get_element_icon()`, обработку в `battle_combat._calc_damage()`, и метку в `WordCard._get_element_label()`.

## Порядок действий

1. Открой `scenes/WordLibrary.gd`, найди функцию `build_all()`
2. Выбери секцию (COMMON / RARE / CURSED) или добавь свою
3. Создай слово:
   ```gdscript
   var myword := _w("myword", 10, 4)
   myword.element = "fire"
   myword.fire_burst_bonus = 5
   myword.ability_text = "Описание способности."
   ```
4. Добавь PositionBonus если нужно:
   ```gdscript
   var pos := PositionBonus.slot(0, "На 1 позиции урон = 15")
   pos.damage_multiplier = 1.5
   myword.position_bonuses.append(pos)
   ```
5. Добавь в базу: `db.append(myword)`
6. **Для модификации** — найди существующее слово в `build_all()` (ищи по `_w("oldword", ...)` или `var oldword`), поменяй его поля
7. Никакие другие файлы менять не нужно (если не добавляется новый элемент)
