Compare commits
36 Commits
main
..
930061e55a
| Author | SHA1 | Date | |
|---|---|---|---|
| 930061e55a | |||
| 412ecb6c86 | |||
| f01e061a4e | |||
| 7966cbc916 | |||
| 83d37e0f8b | |||
| 0de5452a39 | |||
| fdbfc00dd1 | |||
| edf8695ff0 | |||
| 88bde16e17 | |||
| e22c2e1d31 | |||
| 1a4d7d8a2b | |||
| ce83356931 | |||
| a61ab6436c | |||
| 3cebf43642 | |||
| 12c76a1396 | |||
| d50d5809c6 | |||
| f1cf353a4d | |||
| a88187db20 | |||
| 3f65e769cf | |||
| 721812f718 | |||
| 4409b0de17 | |||
| ad28dc9921 | |||
| 92ddefc2d1 | |||
| 24b6125eb6 | |||
| 757d17bfbc | |||
| eb666993e7 | |||
| e158ea7e11 | |||
| 2615c9ccb2 | |||
| de6c605808 | |||
| 99686158cf | |||
| de399b74b8 | |||
| aaa1ef5661 | |||
| beee8e4e6a | |||
| 53aa3567f2 | |||
| 5c393ec66c | |||
| 8b5ba12f46 |
@@ -7,13 +7,34 @@ chaque combat est reproductible grâce à un générateur aléatoire seedé —
|
||||
produit un rapport d'équilibrage en français : taux de victoire par camp avec
|
||||
bande de confiance 3σ, nuls, rounds moyens et attrition par combattant.
|
||||
|
||||
Phase 0 : le moteur de combat couvre le socle des règles (initiative, attaques,
|
||||
critiques, RD, états de vie, déplacement, mêlée/distance). La couche LLM
|
||||
(tactiques et rédaction du rapport) n'est pas encore implémentée.
|
||||
|
||||
## Fonctionnalités
|
||||
|
||||
- Carte en grille de cases de 5 ft (1,5 m) au format YAML : couches ASCII
|
||||
`terrain`, `elevation`, `zones`, points nommés `markers`, déploiement par camp.
|
||||
- Comptage des diagonales selon la règle 5-10-5, coûts de déplacement selon le
|
||||
terrain, règle des coins pour les diagonales le long des murs.
|
||||
- Monstres définis en JSON (bestiaire) ; combattants déployés dans les zones de
|
||||
la carte ; ids dupliqués automatiquement désambiguïsés (`goblin`, `goblin-2`…).
|
||||
- Combats déterministes : chaque run utilise un flux `SeededRng(seed + i)` ;
|
||||
même seed ⇒ mêmes combats.
|
||||
- Rapport d'équilibrage en français : taux de victoire + bande 3σ
|
||||
(σ = √(p(1−p)/n)), nuls, rounds moyens, attrition moyenne par combattant
|
||||
(touches, critiques, dégâts infligés/subis).
|
||||
- Interface en ligne de commande `pf1e-sim`.
|
||||
|
||||
## Prérequis et installation
|
||||
|
||||
**Prérequis :**
|
||||
Prérequis :
|
||||
|
||||
- Python ≥ 3.12
|
||||
- [uv](https://docs.astral.sh/uv/) (gestionnaire de paquets et d'environnements)
|
||||
|
||||
**Installation :**
|
||||
Installation :
|
||||
|
||||
```bash
|
||||
git clone <url-du-dépôt> pf1e-simulator
|
||||
cd pf1e-simulator
|
||||
@@ -21,8 +42,8 @@ uv sync --dev # inclut pytest, ruff et basedpyright
|
||||
```
|
||||
|
||||
`uv sync` seul suffit pour n'utiliser que la CLI (pas d'outillage de dev).
|
||||
Vérification :
|
||||
|
||||
**Vérification :**
|
||||
```bash
|
||||
uv run pf1e-sim --help
|
||||
```
|
||||
@@ -42,7 +63,8 @@ uv run pf1e-sim \
|
||||
--runs 1000 --seed 1
|
||||
```
|
||||
|
||||
**Sortie (extrait) :**
|
||||
Sortie (extrait) :
|
||||
|
||||
```
|
||||
=== Rapport d'équilibrage ===
|
||||
Carte : Arène d'essai
|
||||
@@ -50,19 +72,17 @@ players : 3 combatants
|
||||
monsters : 2 combatants
|
||||
1000 combats simulés (seed 1, plafond 100 rounds)
|
||||
|
||||
Victoires players : 96.2% (962) — bande 3σ : [94.4%, 98.0%]
|
||||
Victoires monsters : 3.6% (36) — bande 3σ : [1.8%, 5.4%]
|
||||
Nuls : 0.2% (2)
|
||||
Rounds moyens : 6.6
|
||||
Victoires players : 91.4% (914) — bande 3σ : [88.7%, 94.1%]
|
||||
Victoires monsters : 8.6% (86) — bande 3σ : [5.9%, 11.3%]
|
||||
Nuls : 0.0% (0)
|
||||
Rounds moyens : 6.0
|
||||
```
|
||||
|
||||
## Utilisation de la CLI
|
||||
|
||||
```
|
||||
usage: pf1e-sim [-h] --map MAP [--side NAME [FILE ...]] [--runs RUNS]
|
||||
[--seed SEED] [--round-cap ROUND_CAP] [--transcript]
|
||||
[--simple-monster-death] [--llm-report] [--output OUTPUT]
|
||||
[--llm-model MODEL] [--llm-base-url URL] [--llm-api-key KEY]
|
||||
[--seed SEED] [--round-cap ROUND_CAP]
|
||||
```
|
||||
|
||||
| Option | Rôle | Défaut |
|
||||
@@ -71,45 +91,412 @@ usage: pf1e-sim [-h] --map MAP [--side NAME [FILE ...]] [--runs RUNS]
|
||||
| `--side NAME [FILE ...]` | Camp `NAME` avec un ou plusieurs JSON de monstres ; répétable pour chaque camp | — |
|
||||
| `--runs RUNS` | Nombre de combats simulés | `1000` |
|
||||
| `--seed SEED` | Graine du générateur aléatoire | `1` |
|
||||
| `--round-cap ROUND_CAP` | Plafond de rounds par combat, entier ≥ 1 | `100` |
|
||||
| `--transcript` | Imprimer le déroulé du premier combat en tableau | désactivé |
|
||||
| `--simple-monster-death` | Mort simplifiée des monstres : `hp ≤ 0` | désactivé |
|
||||
| `--llm-report` | Générer un rapport narratif FR via LLM | désactivé |
|
||||
| `--output OUTPUT` | Écrire le rapport complet (factuel + LLM) dans ce fichier | — |
|
||||
| `--llm-model MODEL` | Modèle LLM (défaut: `PF1E_LLM_MODEL` ou `gpt-4o-mini`) | — |
|
||||
| `--llm-base-url URL` | URL de base LLM (défaut: `PF1E_LLM_BASE_URL`) | — |
|
||||
| `--llm-api-key KEY` | Clé API LLM (défaut: `PF1E_LLM_API_KEY`) | — |
|
||||
| `--round-cap ROUND_CAP` | Plafond de rounds par combat (au-delà, combat nul) | `100` |
|
||||
|
||||
**Exemple avec rapport LLM :**
|
||||
```bash
|
||||
export PF1E_LLM_API_KEY=sk-...
|
||||
export PF1E_PROMPT_PACK_DIR=/chemin/vers/prompt-pack
|
||||
uv run pf1e-sim \
|
||||
--map data/maps/sample_arena.yaml \
|
||||
--side players data/monsters/goblin.json \
|
||||
--side monsters data/monsters/orc.json \
|
||||
--runs 100 --seed 1 --llm-report --output rapport.md
|
||||
```
|
||||
Codes de sortie :
|
||||
|
||||
- `0` — simulation terminée, rapport imprimé.
|
||||
- `2` — erreur d'utilisation ou de données (message sur stderr) : côté
|
||||
inconnu, côté de déploiement manquant, zone trop petite, fichier invalide…
|
||||
|
||||
Règles de construction d'une rencontre :
|
||||
|
||||
- Les noms de camps (`--side NAME`) doivent correspondre exactement à la
|
||||
section `deployment` de la carte, et **tous** les camps du déploiement
|
||||
doivent être fournis.
|
||||
- Le même fichier monstre peut être répété pour créer plusieurs combattants
|
||||
identiques ; les ids sont désambiguïsés globalement dans l'ordre de
|
||||
déploiement (`goblin`, `goblin-2`, `goblin-3`).
|
||||
- Les combattants d'un camp remplissent les cases de leur zone dans l'ordre
|
||||
(ligne, colonne). Une zone trop petite pour le nombre de combattants est une
|
||||
erreur.
|
||||
|
||||
## Interpréter le rapport
|
||||
|
||||
Pour chaque camp, le rapport donne le taux de victoire observé et une bande de
|
||||
confiance à 3σ calculée en forme fermée (modèle binomial) :
|
||||
|
||||
- σ = √(p(1−p)/n) ; la bande est [p − 3σ, p + 3σ], bornée à [0, 1].
|
||||
- Un affrontement symétrique (combattants identiques sur des zones en miroir)
|
||||
doit rester proche de 50 % ; un écart hors de la bande 3σ signale un
|
||||
déséquilibre (avantage d'initiative, géométrie, portées…).
|
||||
- Une bande large indique un échantillon trop petit pour conclure — augmentez
|
||||
`--runs`.
|
||||
- L'attrition moyenne par combattant indique qui participe réellement : un
|
||||
combattant à distance qui n'est jamais rejoint affiche des dégâts subis
|
||||
proches de zéro, un combattant qui meurt systématiquement affiche des dégâts
|
||||
subis supérieurs à ses PV maximum (dégâts du coup fatal inclus).
|
||||
- Les nuls proviennent des combats atteignant le plafond de rounds (combattants
|
||||
immobiles, camps inaccessibles…).
|
||||
|
||||
Exemple vérifié — 1 gobelin (players) contre 2 orcs (monsters), 1000 runs,
|
||||
seed 1 : players 22,0 %, bande 3σ [18,1 % ; 25,9 %], 0 nuls, 5,2 rounds moyens.
|
||||
Sans ligne de visée depuis la zone de départ, l'archer gobelin doit contourner
|
||||
le mur central avant de tirer ; mais avec l'économie d'action activée, les orcs
|
||||
parcourent toute leur vitesse (30 ft) puis frappent dans le même tour — le
|
||||
gobelin solitaire ne peut plus les distancer et tombe vite en mêlée sous les
|
||||
2d4+4 des falchions. C'est ce déséquilibre de cadence qui penche fortement le
|
||||
face-à-face à 1 contre 2 du côté des monstres.
|
||||
|
||||
## Formats de données
|
||||
|
||||
Voir la documentation complète dans [`docs/data-formats/`](docs/data-formats/) :
|
||||
- [Carte (YAML)](docs/data-formats/map.md)
|
||||
- [Monstre (JSON)](docs/data-formats/monster.md)
|
||||
- [Fiches de personnages PJ](docs/data-formats/pc-sheets.md)
|
||||
### Carte (YAML)
|
||||
|
||||
## Règles implémentées
|
||||
Chaque couche est un bloc ASCII de mêmes dimensions ; un caractère = une case
|
||||
de `square_size_ft` pieds. Seule `terrain` est obligatoire.
|
||||
|
||||
Voir la documentation complète dans [`docs/rules/`](docs/rules/) :
|
||||
- [Règles Phase 0 implémentées](docs/rules/phase-0-implemented.md)
|
||||
- [Conformance SRD](docs/rules/conformance-srd.md)
|
||||
```yaml
|
||||
name: "Arène d'essai"
|
||||
square_size_ft: 5
|
||||
|
||||
## Architecture & développement
|
||||
terrain: | # couche obligatoire
|
||||
####################
|
||||
#......######......#
|
||||
#..C...######...C..#
|
||||
#......~..~........#
|
||||
#..TT..~..~...TT...#
|
||||
#......~..~........#
|
||||
#..C............C..#
|
||||
####################
|
||||
|
||||
Voir [`docs/architecture/`](docs/architecture/) pour l'architecture technique,
|
||||
le plan d'implémentation Phase 2 (LLM), et les décisions de design.
|
||||
legend: # un caractère = un type de terrain
|
||||
"#": { type: wall, move_cost: null, blocks_los: true } # bloque déplacement + LoS
|
||||
".": { type: floor, move_cost: 1 }
|
||||
"T": { type: rubble, move_cost: 2 } # terrain difficile
|
||||
"~": { type: water, move_cost: 2 }
|
||||
"C": { type: pillar, move_cost: null, cover: true } # bloque le pas, couvert
|
||||
|
||||
## Contribuer
|
||||
elevation: | # optionnel : chiffres = hauteur (validé, pas encore appliqué)
|
||||
....................
|
||||
..1111..............
|
||||
..1111..............
|
||||
....................
|
||||
|
||||
Consultez [`docs/contributing.md`](docs/contributing.md) pour les guidelines de
|
||||
contribution : style de code, tests, gate de validation, processus de PR.
|
||||
zones: | # optionnel : lettres de zone de déploiement
|
||||
....................
|
||||
.AAAA..........BBBB.
|
||||
.AAAA..........BBBB.
|
||||
....................
|
||||
|
||||
markers: # optionnel : points nommés (validés, pas encore utilisés)
|
||||
autel: [1, 16]
|
||||
|
||||
deployment: # obligatoire si zones : nom de camp -> lettre de zone
|
||||
players: A
|
||||
monsters: B
|
||||
```
|
||||
|
||||
Valeur du `move_cost` : entier > 0 pour un terrain praticable, `null` pour un
|
||||
terrain infranchissable (mur, pilier). `blocks_los` et `cover` sont appliqués
|
||||
par la résolution des attaques (module `los.py`, règle des coins) : pas de
|
||||
ligne d'effet ⇒ l'attaque est impossible ; couvert ⇒ bonus de +4 CA.
|
||||
|
||||
### Monstre (JSON)
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Goblin",
|
||||
"level": 1,
|
||||
"size": "Small",
|
||||
"cr": "1/3",
|
||||
"xp": 135,
|
||||
"source": "Bestiary > Goblin",
|
||||
"abilities": {
|
||||
"str_score": 11, "dex_score": 15, "con_score": 12,
|
||||
"int_score": 10, "wis_score": 9, "cha_score": 6
|
||||
},
|
||||
"hp_max": 6,
|
||||
"ac": { "total": 16, "touch": 13, "flat_footed": 14 },
|
||||
"bab": 1,
|
||||
"initiative_mod": 6,
|
||||
"speed_land_ft": 30,
|
||||
"saves": { "fort": 3, "ref": 2, "will": -1 },
|
||||
"attacks": [
|
||||
{
|
||||
"name": "short sword",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 2,
|
||||
"damage": [{ "formula": "1d4", "types": ["slashing"] }],
|
||||
"crit_range": 19,
|
||||
"crit_mult": 2
|
||||
},
|
||||
{
|
||||
"name": "short bow",
|
||||
"kind": "ranged",
|
||||
"attack_bonus": 4,
|
||||
"damage": [{ "formula": "1d4", "types": ["piercing"] }],
|
||||
"crit_mult": 3,
|
||||
"range_increment_ft": 60
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Champ `range_increment_ft` (optionnel, uniquement pour `kind: ranged`) :
|
||||
incrément de portée en pieds. La pénalité de portée vaut −2 par incrément
|
||||
complet au-delà du premier ; l'arme reste utilisable jusqu'à 10 incréments,
|
||||
au-delà elle n'est pas sélectionnable. `damage_bonus` et `dr` sont optionnels.
|
||||
Deux monstres d'exemple sont fournis : gobelin et orc.
|
||||
|
||||
### Fiches de personnages (PJ)
|
||||
|
||||
`fiches_personnages/` contient les 8 fiches de PJ au format Foundry VTT
|
||||
(`pf1-sheet/v1`) ; le chargeur `loaders/foundry.py` sait les lire. Elles sont
|
||||
transposées en JSON au schéma `Combatant` dans `data/pcs/` (`esha.json`,
|
||||
`harvie.json`, `ierlieth.json`, `jeanne.json`, `misty.json`, `nairda.json`,
|
||||
`oni.json`, `tammara.json`) et se passent directement à la CLI comme les
|
||||
monstres :
|
||||
|
||||
```bash
|
||||
uv run pf1e-sim --map data/maps/sample_arena.yaml \
|
||||
--side players data/pcs/oni.json \
|
||||
--side monsters data/pcs/tammara.json --runs 200
|
||||
```
|
||||
|
||||
Les armes placeholder des fiches sans dégâts encodés sont omises (notées
|
||||
dans `notes` le cas échéant) ; le champ `source` de chaque fichier pointe
|
||||
vers la fiche Foundry d'origine.
|
||||
|
||||
## Règles implémentées et limites de la Phase 0
|
||||
|
||||
Règles modélisées :
|
||||
|
||||
- 1 naturel = échec automatique ; 20 naturel = touche + menace de critique.
|
||||
- Critique : (dés + bonus) × multiplicateur ; la RD s'applique après
|
||||
multiplication, les types perforants annulent la RD, les dégâts plancher à 0.
|
||||
- Mort quand `hp < min(-10, -CON)` ; `hp ≤ 0` = inactif.
|
||||
- Initiative : triée sur (total, modificateur, ordre de liste), sans re-jet.
|
||||
- Économie d'action : un tour normal donne une action standard + une action de
|
||||
mouvement (ou une action à round complet), plus swift/free/immediate. La
|
||||
politique renvoie une séquence ordonnée d'actions exécutées dans l'ordre ;
|
||||
`default_policy` renvoie `(full_attack,)` si l'ennemi est en portée, `(charge,)`
|
||||
si une ligne droite existe, `(5foot_step, full_attack)` si un seul pas
|
||||
suffit à entrer en portée, ou `(move, attack)` sinon. Les actions immédiates
|
||||
(hors-tour, consomment le prochain swift) ne sont pas encore modélisées.
|
||||
- Attaques multiples par action : une arme avec `count` > 1 (« 2x Talons »)
|
||||
résout `count` balayages indépendants dans la même action ; les balayages
|
||||
restants sont perdus si la cible tombe (inconsciente ou morte) en cours de
|
||||
rafale. Attaque à outrance (action à round complet) : à BAB +6/+11/+16, des
|
||||
attaques supplémentaires à -5/-10/-15 ; les armes naturelles (`count` > 1)
|
||||
ne gagnent pas d'itératifs. Plusieurs armes naturelles en une seule attaque
|
||||
à outrance ne sont pas modélisées.
|
||||
- Mêlée : allonge d'une case ; mouvement : un déplacement parcourt jusqu'à la
|
||||
vitesse du combattant en cases le long du plus court chemin réel (champ de
|
||||
coût Dijkstra depuis la cible, diagonales 5-10-5), en s'arrêtant adjacent à
|
||||
l'ennemi le plus proche — les combattants contournent les murs au lieu
|
||||
d'osciller contre eux.
|
||||
- Ligne d'effet : une cible entièrement derrière un terrain `blocks_los` ne
|
||||
peut pas être attaquée — la politique se déplace jusqu'à gagner une ligne de
|
||||
visée.
|
||||
- Couvert (règle des coins) : la cible gagne +4 CA sur la touche et la
|
||||
confirmation de critique ; couvert mou : une créature active entre
|
||||
l'attaquant et la cible octroie aussi +4 CA aux attaques à distance (les
|
||||
attaques de mêlée ignorent les créatures).
|
||||
- Flanquement : +2 au jet d'attaque de mêlée si un allié actif (doté d'une arme
|
||||
de mêlée) menace la cible depuis la bordure ou le coin opposé. Les attaques à
|
||||
distance ignorent le flanquement ; un allié désarmé ou à distance ne compte
|
||||
pas pour le flanquement.
|
||||
- Attaques d'opportunité : un combattant actif doté d'une arme de mêlée menace
|
||||
les 8 cases adjacentes. Deux déclencheurs sont modélisés : (1) quitter une
|
||||
case menacée — le mouvement est résolu pas à pas, et chaque ennemi qui menace
|
||||
la case actuelle porte une AoO avant que le mouvant ne la quitte ; (2) tirer
|
||||
avec une arme à distance depuis une case menacée — chaque ennemi menaçant
|
||||
porte une AoO avant chaque tir. Une AoO par combattant par round (piste
|
||||
`_aoo_used`, réinitialisée au début du round) ; les AoO sont toujours portées
|
||||
(PF1e permet de les décliner, le simulateur ne le fait pas). Le pas de
|
||||
placement (5 ft) ne provoque jamais d'AoO (voir ci-dessous) ; la retraite ne
|
||||
protège que la case de départ (voir ci-dessous).
|
||||
- Charge : action à round complet. Le combattant se déplace en ligne droite
|
||||
(Bresenham) jusqu'à 2× sa vitesse vers la case la plus proche d'où il peut
|
||||
frapper la cible en mêlée, puis porte une seule attaque de mêlée à +2. La
|
||||
charge impose −2 CA à l'attaquant jusqu'au début de son prochain tour. La
|
||||
ligne droite doit être dégagée (pas de terrain difficile, d'obstacles ni de
|
||||
créatures) ; distance minimum 2 cases (10 ft). `default_policy` choisit la
|
||||
charge quand l'ennemi est hors de portée mais joignable en ligne droite.
|
||||
- Retraite : action à round complet. Le combattant se déplace jusqu'à 2× sa
|
||||
vitesse en s'éloignant de l'ennemi le plus proche (ascension gloutonne du
|
||||
champ de coût Dijkstra depuis la menace). La case de départ n'est pas
|
||||
considérée comme menacée — aucune AoO en la quittant. Les cases
|
||||
ultérieures provoquent des AoO normalement (résolues pas à pas, comme pour
|
||||
le mouvement). `default_policy` ne choisit pas la retraite (disponible via
|
||||
une politique personnalisée).
|
||||
- Pas de placement (5-foot step) : action libre qui déplace le combattant d'une
|
||||
case vers l'ennemi le plus proche sans provoquer d'AoO. Exclusivité mutuelle
|
||||
avec tout autre mouvement (move, charge, retraite) dans le même tour —
|
||||
tracked via `moved_this_turn`, réinitialisé au début du tour. `default_policy`
|
||||
choisit `(5foot_step, full_attack)` quand un seul pas suffit à entrer en
|
||||
portée.
|
||||
- Distance : pénalité cumulative de −2 par incrément de portée complet au-delà
|
||||
du premier, appliquée au jet d'attaque et à la confirmation de critique ;
|
||||
l'arme ranged reste utilisable jusqu'à 10 incréments. Les armes de jet
|
||||
(5 incréments max) ne sont pas distinguées des armes à projectiles.
|
||||
- Jets de sauvegarde : `resolve_save(state, save_type, dc)` — fort/ref/will.
|
||||
1 naturel = échec automatique, 20 naturel = succès automatique. Les
|
||||
modificateurs d'effets (`StatModifier` avec `target` correspondant) sont
|
||||
appliqués via `resolve_modifiers` (mêmes règles d'empilement que les
|
||||
attaques). Renvoie un `SaveResult` (success, roll, total, dc).
|
||||
- Incantation : chaque `CombatantState` porte `spell_slots_left` (initialisé depuis
|
||||
le champ `spell_slots` du JSON, ex. `{"1": 4, ...}`) ; `_cast_spell` dépense
|
||||
l'emplacement du niveau concerné (`spend_spell_slot`). Le DD vaut `10 + niveau du
|
||||
sort + mod de la caractéristique d'incantation` (`casting_ability`), la sauvegarde
|
||||
est résolue par `resolve_save`, et la RD ne réduit pas les dégâts des sorts
|
||||
(`test_dr_does_not_reduce_spell_damage`). Incanter dans une
|
||||
case menacée provoque des AoO ; tout dégât subi pendant l'incantation impose un
|
||||
jet de concentration dont le DD dépend de la situation (`_concentration_dc`) :
|
||||
`10 + dégâts + niveau` si blessé, `10 + CMB de l'adversaire + niveau` si agrippé,
|
||||
sinon `15 + 2×niveau` (incantation défensive), jet = d20 + niveau + mod de CON
|
||||
(+4 avec le don Combat Casting). `default_policy` choisit soin / offensif / buff via
|
||||
`_find_heal_spell`, `_find_offensive_spell` et `_find_ally_needing_heal`.
|
||||
- Invocation : les créatures invoquées agissent (calées sur la case d'initiative de
|
||||
leur conjurateur via `_build_round_order`) puis expirent après leur `summon_duration`
|
||||
(`_expire_summons` décrémente puis retire).
|
||||
- Conditions effectives : 18 conditions prédéfinies (`conditions.py`). Leurs drapeaux
|
||||
comportementaux sont appliqués par le moteur : `cant_act` (étourdi, paralysé, dazed,
|
||||
endormi) annule le tour ; `cant_attack` (nauséeux) n'autorise qu'une unique action
|
||||
simple et bloque toute attaque / manœuvre ; `staggered` restreint à une action
|
||||
simple (pas d'attaque à outrance) ; `cant_move` bloque le déplacement ;
|
||||
`denies_dex_to_ac` (à plat ventre, paralysé…) fait perdre le bonus de Dextérité à
|
||||
la CA (CA flat-footed). À plat ventre : −4 CA et −4 aux attaques à distance.
|
||||
Agrippé : −4 Dextérité, −2 attaque/CA/Réflexes, sans déplacement ni AoO.
|
||||
- Manœuvres de combat : trip, disarm, bull_rush, sunder, grapple et escape sont
|
||||
modélisées, chacune comme une tentative unique (1d20 + CMB contre CMD) :
|
||||
trip → `prone` ; disarm → `disarmed` (−4 attaque) ; bull_rush → pousse la cible ;
|
||||
grapple → `grappled`/`pinned` ; escape → **une** sauvegarde (bonus statique de la
|
||||
compétence `escape_artist` ou CMB, + un d20) contre CMD — une seule tentative,
|
||||
sans boucle multi-tour. Un sunder endommage l'**arme**, pas les PV : `str_mod + 2`
|
||||
de dégâts à l'arme, qui se brise à 10 d'usure cumulée (`_WEAPON_DURABILITY`) →
|
||||
`disarmed` ; une arme brisée est exclue de `usable_attacks()`. `default_policy` ne
|
||||
choisit pas ces manœuvres (utilisables via `Action(kind="maneuver")` ou une
|
||||
politique personnalisée).
|
||||
- Combat Reflexes : 1 AoO par combattant par round par défaut ; avec le don Combat
|
||||
Reflexes, `1 + mod de Dextérité` AoO par round (`_aoo_allowance`, plancher 1).
|
||||
- Sortilèges du sorcier (witch hex) : le DD vaut `10 + niveau//2 + mod d'Intelligence`
|
||||
(evil_eye, slumber, cackle) ; `cackle` prolonge d'un round les sortilèges déjà
|
||||
actifs, sur une liste instantanée pour ne pas s'étendre à l'infini. Les sorts à
|
||||
zone (AoE) utilisent le DD d'incantation du jeteur et, sur une sauvegarde réussie,
|
||||
ne font que la moitié des dégâts.
|
||||
- Dons : les 8 PJ portent 55 noms de dons uniques ; le chargeur résout chacun d'eux
|
||||
soit vers un effet réel (Power Attack actif, Weapon Focus ciblé par arme, Toughness
|
||||
lié au niveau, dons passifs via `_stat_modifiers`), soit vers un « no-op » tracé en
|
||||
toute transparence (noms décoratifs / de race) — aucun n'est silencieusement ignoré
|
||||
(`tests/test_feats.py`).
|
||||
- Capacités de classe émises par `default_policy`, chacune conditionnée à une ressource
|
||||
`> 0` dépensée dans la méthode d'exécution : `channel_energy` (oni, allié < 50 % ou
|
||||
ennemis groupés à 30 ft), sortilège `evil_eye` (nairda), deed `up_close_and_deadly`
|
||||
(tammara, action bonus +1d6 à ≤ 30 ft), `inspire_courage` + `spell_combat` (misty)
|
||||
— couvertes par `tests/test_class_abilities.py`.
|
||||
- Le Liche (`data/monsters/lich.json`) : aura de terreur (30 ft, Volonté DD 22 ou
|
||||
`shaken` 1 round, au début de son tour) et contact paralysant (au toucher,
|
||||
`paralysé` 1d4+1 rounds), RD 15/magie+contondant ; son JSON porte un dictionnaire
|
||||
`spell_slots` sans clés dupliquées.
|
||||
|
||||
Non modélisé (couches `elevation`/`markers` présentes mais non appliquées
|
||||
dans la résolution) :
|
||||
|
||||
- Effets mécaniques de hauteur/élévation (les hauteurs sont validées mais non
|
||||
appliquées au déplacement, à la portée ou à la ligne d'effet).
|
||||
- Tailles Large+ (2×2), allonge > 5 ft (la mêlée reste limitée à une case) et
|
||||
actions immédiates hors-tour (consommeraient le prochain swift).
|
||||
- Parmi les manœuvres, seules trip / disarm / bull_rush / sunder / grapple / escape
|
||||
sont câblées ; les autres (overrun, dirty trick, steal, reposition, drag) ne le
|
||||
sont pas. Une arme brisée ne peut pas être réparée en cours de combat.
|
||||
- Les modificateurs d'effets conditionnés par un `condition=` au runtime ne sont pas
|
||||
évalués (`_modifier_condition_holds` renvoie toujours False, le modificateur est
|
||||
alors exclu) ; la distribution des dégâts par type sur un sort n'envoie que des
|
||||
dégâts simples (sans plage « half on save » pour les effets ciblés).
|
||||
|
||||
## Architecture
|
||||
|
||||
- `dice.py` — parseur de notation de dés (`2d4+1`) et lancer.
|
||||
- `rng.py` — `SeededRng` (flux reproductible par graine) et `ScriptedRng`
|
||||
(séquence de dés scriptée pour les tests de transcripts).
|
||||
- `models.py` — schémas Pydantic v2 : `Combatant`, `AbilityScores`,
|
||||
`ACProfile`, `AttackSpec`, `DamageComponent`, `Saves`, `DamageReduction`.
|
||||
- `map.py` — `MapSpec`/`TerrainType`, chargement YAML et validation
|
||||
(dimensions, caractères connus, zones, déploiement, markers).
|
||||
- `grid.py` — grille 5-10-5 : `distance`, `step_cost`, règle des coins
|
||||
(`diagonal_allowed`), Dijkstra `reachable` avec ou sans budget.
|
||||
- `los.py` — ligne d'effet et couvert par la règle des coins : gate de ligne
|
||||
d'effet dans `weapon_for`, bonus de couvert +4 CA (terrain et couvert mou
|
||||
des créatures) dans `resolve_attack`.
|
||||
- `combat.py` — `CombatEngine` déterministe : initiative, actions, résolution
|
||||
des attaques (couvert, ligne d'effet, pénalités de portée), états de vie,
|
||||
incantation (emplacements, concentration par situation, AoO d'incantation),
|
||||
invocation, manœuvres, capacités de classe, transcripts, politique par
|
||||
défaut.
|
||||
- `effects.py` — système d'effets : `StatModifier` (modificateur de
|
||||
caractéristique avec type de bonus) et `resolve_modifiers` (application des
|
||||
règles d'empilement PF1e). Types de bonus cumulables (dodge, racial, trait,
|
||||
sans type) s'additionnent ; types non-cumulables (morale, sacré, profane,
|
||||
enhancement…) gardent la valeur la plus élevée. Les pénalités suivent les
|
||||
mêmes règles. Fondation pour sorts, conditions, dons et capacités de classe.
|
||||
- `conditions.py` — conditions PF1e : `Condition` (dataclass avec
|
||||
modificateurs + flags comportementaux) et 18 conditions prédéfinies
|
||||
(shaken, sickened, fatigued, exhausted, entangled, dazzled, blinded,
|
||||
deafened, flat-footed, prone, stunned, paralyzed, nauseated, dazed,
|
||||
staggered, frightened, panicked, cowering). Les modificateurs sont intégrés
|
||||
à `resolve_attack` (attaque, dégâts, CA) et `resolve_save` (jets de
|
||||
sauvegarde) via `_stat_modifiers` qui collecte effets + conditions ; les
|
||||
drapeaux comportementaux (`cant_act`, `cant_attack`, `cant_move`, staggered,
|
||||
etc.) sont appliqués par le moteur pendant le tour.
|
||||
- `abilities.py` — dons et capacités : `AbilitySpec` (dataclass avec
|
||||
catégorie feat/class/racial/trait) et fabriques de dons (Weapon Focus ciblé
|
||||
par arme, Toughness lié au niveau, Power Attack actif −X attaque / +2X
|
||||
dégâts, X = BAB//4 + 1, mêlée uniquement, declared as free action at turn
|
||||
start via `state.power_attack`). Les modificateurs sont collectés par
|
||||
`_stat_modifiers` avec filtrage par arme (`weapon_filter`). Le champ
|
||||
`features` de `Combatant` contient les aptitudes permanentes ; le chargeur
|
||||
(`loaders/combatant.py`) résout les noms de dons des fiches vers des
|
||||
`AbilitySpec` réels ou des « no-op » tracés.
|
||||
- `spells.py` — sorts : `SpellSpec` (dataclass avec niveau, école, portée,
|
||||
sauvegarde, DC de base) et types d'effets (`DamageEffect`, `ConditionEffect`,
|
||||
`HealEffect`, `BuffEffect`). Portées PF1e (personal, touch, close, medium,
|
||||
long) calculées par `spell_range_ft`. Chargeur JSON (`load_spell`,
|
||||
`load_spell_registry`) pour `data/spells/`. Le moteur intègre les sorts via
|
||||
`Action(kind="cast_spell")` et `_cast_spell` : résolution de sauvegarde,
|
||||
application des dégâts (demi-dégâts sur sauvegarde réussie ; la RD ne
|
||||
s'applique pas aux dégâts de sorts), conditions, soins (plafonnés à hp_max)
|
||||
et buffs. Le champ `spells` de `Combatant` contient les noms de sorts connus ;
|
||||
le `spell_registry` est passé au `CombatEngine`.
|
||||
- `metrics.py` — statistiques en forme fermée : `win_rate`, `win_rate_sigma`,
|
||||
`win_rate_band` (bande 3σ bornée à [0, 1]).
|
||||
- `runner.py` — `EncounterSpec`/`Side`, `build_states` (placement en zone +
|
||||
désambiguïsation des ids), `run_encounter` (un `SeededRng` par run) et
|
||||
agrégation en `EncounterReport` avec attrition par combattant.
|
||||
- `cli.py` — front-end argparse `pf1e-sim`, rapport français, code de sortie 2
|
||||
en cas d'erreur.
|
||||
- `loaders/` — `combatant.py` (chargeur unifié PJ + monstres avec résolution
|
||||
des dons → `AbilitySpec` et des sorts → `Combatant.spells`) et
|
||||
`foundry.py` (outil de migration one-shot depuis les fiches Foundry).
|
||||
|
||||
## Développement
|
||||
|
||||
La gate de validation complète (tests + lint + types) :
|
||||
|
||||
```bash
|
||||
uv run pytest -q # 472 tests
|
||||
uv run ruff check src tests
|
||||
uv run basedpyright src # mode strict
|
||||
```
|
||||
|
||||
- Ruff est configuré avec `select = ["ALL"]`, longueur de ligne 100.
|
||||
- Basedpyright tourne en `typeCheckingMode = "strict"` sur `src` et `tests`.
|
||||
- Le moteur est testé par des transcripts épinglés (combats 1v1 et 2v2
|
||||
scriptés) et par des assertions statistiques en forme fermée (matchup
|
||||
symétrique dans la bande 3σ).
|
||||
|
||||
## Feuille de route
|
||||
|
||||
- **Phase 1** — magie et états : largement réalisée. Sorts par emplacements
|
||||
(`spells.py` + base `data/spells/`, 11 sorts), DD et sauvegardes, RD non
|
||||
appliquée aux dégâts de sorts, concentration par situation, invocation,
|
||||
conditions effectives (`conditions.py`), manœuvres de combat, dons (55 noms
|
||||
résolus, `abilities.py` + chargeur) et capacités de classe (channel energy,
|
||||
hex, deeds, inspire courage / spell combat) sont en place et documentés dans
|
||||
« Règles implémentées ». Restent hors du socle (voir « Non modélisé ») : les
|
||||
hauteurs/élévations, tailles Large+, allonges > 5 ft, actions immédiates
|
||||
hors-tour, et le reste des manœuvres.
|
||||
- **Phase 2** — couche tactique LLM : stratégies en langage naturel traduites
|
||||
en politiques, balayage de matrices de positionnement. (Non implémentée.)
|
||||
- **Phase 3** — rapporteur LLM local : agrégation des statistiques et
|
||||
rédaction du rapport d'équilibrage en français. (Non implémentée.)
|
||||
|
||||
@@ -20,8 +20,8 @@ legend:
|
||||
|
||||
elevation: |
|
||||
....................
|
||||
....................
|
||||
....................
|
||||
..1111..............
|
||||
..1111..............
|
||||
....................
|
||||
....................
|
||||
....................
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
name: "Elevation Test"
|
||||
square_size_ft: 5
|
||||
|
||||
terrain: |
|
||||
############
|
||||
#..........#
|
||||
#..........#
|
||||
#..........#
|
||||
#..........#
|
||||
#..........#
|
||||
#..........#
|
||||
#..........#
|
||||
#..........#
|
||||
############
|
||||
|
||||
legend:
|
||||
"#": { type: wall, move_cost: null, blocks_los: true }
|
||||
".": { type: floor, move_cost: 1 }
|
||||
|
||||
elevation: |
|
||||
............
|
||||
............
|
||||
..0000......
|
||||
..0000......
|
||||
............
|
||||
............
|
||||
......1111..
|
||||
......1111..
|
||||
............
|
||||
............
|
||||
|
||||
zones: |
|
||||
............
|
||||
............
|
||||
..AAAA......
|
||||
..AAAA......
|
||||
............
|
||||
............
|
||||
......BBBB..
|
||||
......BBBB..
|
||||
............
|
||||
............
|
||||
|
||||
markers:
|
||||
ground_center: [5, 5]
|
||||
platform_center: [6, 8]
|
||||
|
||||
deployment:
|
||||
players: A
|
||||
monsters: B
|
||||
@@ -1,70 +1,53 @@
|
||||
{
|
||||
"name": "Celestial Wolf",
|
||||
"alignment": "NG",
|
||||
"level": 2,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
"str_score": 13,
|
||||
"dex_score": 15,
|
||||
"con_score": 15,
|
||||
"int_score": 2,
|
||||
"wis_score": 12,
|
||||
"cha_score": 6
|
||||
},
|
||||
"hp_max": 13,
|
||||
"ac": {
|
||||
"total": 14,
|
||||
"touch": 12,
|
||||
"flat_footed": 12
|
||||
},
|
||||
"bab": 1,
|
||||
"initiative_mod": 2,
|
||||
"speed_land_ft": 50,
|
||||
"saves": {
|
||||
"fort": 5,
|
||||
"ref": 5,
|
||||
"will": 1
|
||||
},
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"attacks": [
|
||||
{
|
||||
"id": "celestial_wolf:bite",
|
||||
"name": "Bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 2,
|
||||
"damage": [
|
||||
"name": "Celestial Wolf",
|
||||
"level": 2,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
"str_score": 13,
|
||||
"dex_score": 15,
|
||||
"con_score": 12,
|
||||
"int_score": 2,
|
||||
"wis_score": 12,
|
||||
"cha_score": 6
|
||||
},
|
||||
"hp_max": 15,
|
||||
"ac": {
|
||||
"total": 14,
|
||||
"touch": 13,
|
||||
"flat_footed": 12
|
||||
},
|
||||
"bab": 1,
|
||||
"initiative_mod": 2,
|
||||
"speed_land_ft": 50,
|
||||
"saves": {
|
||||
"fort": 4,
|
||||
"ref": 5,
|
||||
"will": 2
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"formula": "1d6+1",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
"id": "celestial_wolf:bite",
|
||||
"name": "Bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 3,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6+1",
|
||||
"types": ["piercing"]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true
|
||||
}
|
||||
],
|
||||
"dr": {
|
||||
"amount": 5,
|
||||
"bypass": ["magic"]
|
||||
},
|
||||
"resistances": {
|
||||
"acid": 5,
|
||||
"cold": 5,
|
||||
"electricity": 5
|
||||
},
|
||||
"spell_resistance": 6,
|
||||
"notes": "SRD Bestiary wolf (2d8+4 hp 13, AC 14/touch 12/flat 12, Fort +5, Will +1, bite +2 1d6+1 plus trip, Str 13 Dex 15 Con 15) + celestial template. Encoded from the template: DR 5/magic, energy resistance acid/cold/electricity 5, SR 6 (CR 1 + 5). Not encodable in this model: smite evil 2/day (+2 damage vs evil), the bite's free trip on hit (the engine has trip only as a standard-action maneuver, no auto-trip attack qualifier), and the weapon model has no magic property so no equipment bypasses the DR 5/magic (correct for mundane weapons). Summoning scaling (energy resistance +2 and SR +5 per summon spell level above 2nd) is not modeled; this sheet is the summon monster II baseline. Alignment inferred: SRD celestial template = any good; NG chosen for the good axis with neutral law axis",
|
||||
"source": "summon monster II",
|
||||
"features": [],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {}
|
||||
],
|
||||
"source": "summon monster II",
|
||||
"features": [],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {}
|
||||
}
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
{
|
||||
"name": "Giant Belostomatid",
|
||||
"alignment": "N",
|
||||
"level": 3,
|
||||
"size": "Large",
|
||||
"cr": "3",
|
||||
"xp": 800,
|
||||
"source": "Bestiary > Giant Belostomatid",
|
||||
"notes": "Digestive enzyme (DC 15 Fort or paralyzed 1d4 rounds + 1d2 Con damage/round) and grab on claws not modeled in Phase 0; Int - (mindless) modeled as 0; immune to mind-affecting not modeled; swim 40 ft / fly 20 ft (poor) not modeled, land speed only.",
|
||||
"abilities": {
|
||||
"str_score": 15,
|
||||
"dex_score": 13,
|
||||
"con_score": 16,
|
||||
"int_score": 0,
|
||||
"wis_score": 11,
|
||||
"cha_score": 2
|
||||
},
|
||||
"hp_max": 30,
|
||||
"ac": {
|
||||
"total": 15,
|
||||
"touch": 10,
|
||||
"flat_footed": 14
|
||||
},
|
||||
"bab": 3,
|
||||
"initiative_mod": 1,
|
||||
"speed_land_ft": 20,
|
||||
"saves": {
|
||||
"fort": 7,
|
||||
"ref": 2,
|
||||
"will": 1
|
||||
},
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"attacks": [
|
||||
{
|
||||
"name": "bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 2,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 10,
|
||||
"natural": true
|
||||
},
|
||||
{
|
||||
"name": "claw",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"slashing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 2,
|
||||
"crit_mult": 2,
|
||||
"count": 2,
|
||||
"reach_ft": 10,
|
||||
"natural": true
|
||||
}
|
||||
],
|
||||
"cmb": 6,
|
||||
"cmd": 17
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "Goblin",
|
||||
"alignment": "NE",
|
||||
"level": 1,
|
||||
"size": "Small",
|
||||
"cr": "1/3",
|
||||
@@ -20,8 +19,6 @@
|
||||
"initiative_mod": 6,
|
||||
"speed_land_ft": 30,
|
||||
"saves": { "fort": 3, "ref": 2, "will": -1 },
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"attacks": [
|
||||
{
|
||||
"name": "short sword",
|
||||
|
||||
+13
-19
@@ -1,34 +1,30 @@
|
||||
{
|
||||
"name": "Lich",
|
||||
"alignment": "NE",
|
||||
"level": 11,
|
||||
"size": "Medium",
|
||||
"creature_type": "undead",
|
||||
"abilities": {
|
||||
"str_score": 10,
|
||||
"str_score": 12,
|
||||
"dex_score": 14,
|
||||
"con_score": 10,
|
||||
"int_score": 22,
|
||||
"con_score": 14,
|
||||
"int_score": 20,
|
||||
"wis_score": 14,
|
||||
"cha_score": 16
|
||||
},
|
||||
"hp_max": 111,
|
||||
"hp_max": 100,
|
||||
"ac": {
|
||||
"total": 23,
|
||||
"total": 25,
|
||||
"touch": 14,
|
||||
"flat_footed": 21
|
||||
"flat_footed": 23
|
||||
},
|
||||
"bab": 5,
|
||||
"initiative_mod": 2,
|
||||
"bab": 8,
|
||||
"initiative_mod": 6,
|
||||
"speed_land_ft": 30,
|
||||
"saves": {
|
||||
"fort": 6,
|
||||
"ref": 7,
|
||||
"will": 11
|
||||
"fort": 10,
|
||||
"ref": 10,
|
||||
"will": 14
|
||||
},
|
||||
"casting_ability": "int",
|
||||
"arcane_caster": true,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {
|
||||
"1": 4,
|
||||
"2": 4,
|
||||
@@ -42,15 +38,14 @@
|
||||
"id": "lich:touch",
|
||||
"name": "Paralyzing Touch",
|
||||
"kind": "touch",
|
||||
"attack_bonus": 5,
|
||||
"natural": true,
|
||||
"attack_bonus": 10,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d8+5",
|
||||
"types": ["negative"]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"damage_bonus": 5,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
@@ -62,7 +57,6 @@
|
||||
"bypass": ["bludgeoning", "magic"]
|
||||
},
|
||||
"source": "bestiary",
|
||||
"notes": "Stat block aligned to the KB lich entry (bestiary/lich.md): hp 111 (11d6+55 plus 15 false life), Str 10, Int 22, Init +2, fear aura 60 ft / DC 18. The spell list is the sim's own encounter-authored list (the KB's prepared list includes spells outside the data/spells registry); only the stat block was aligned.",
|
||||
"features": [
|
||||
"Fear Aura",
|
||||
"Paralyzing Touch",
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "Orc",
|
||||
"alignment": "CE",
|
||||
"level": 1,
|
||||
"size": "Medium",
|
||||
"cr": "1/3",
|
||||
@@ -21,8 +20,6 @@
|
||||
"initiative_mod": 0,
|
||||
"speed_land_ft": 30,
|
||||
"saves": { "fort": 3, "ref": 0, "will": -1 },
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"attacks": [
|
||||
{
|
||||
"name": "falchion",
|
||||
@@ -31,8 +28,7 @@
|
||||
"damage": [{ "formula": "2d4", "types": ["slashing"] }],
|
||||
"damage_bonus": 4,
|
||||
"crit_range": 18,
|
||||
"crit_mult": 2,
|
||||
"two_handed": true
|
||||
"crit_mult": 2
|
||||
},
|
||||
{
|
||||
"name": "javelin",
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
{
|
||||
"name": "Thrune Agent",
|
||||
"alignment": "LE",
|
||||
"level": 8,
|
||||
"size": "Medium",
|
||||
"creature_type": "living",
|
||||
"cr": "7",
|
||||
"xp": 3200,
|
||||
"source": "Bestiary > Thrune Agent",
|
||||
"notes": "Magus class abilities (spell combat, spellstrike, arcane pool, spell recall, knowledge pool) not emitted by default_policy; combat gear (cure moderate wounds potions x2, fireball scroll) not modeled as items. Heavy mace is +1 (enhancement folded into attack_bonus/damage_bonus); Weapon Focus (heavy mace) applies via features at runtime. Extra Arcana and Skill Focus (Intimidate) resolve to traced no-ops. Magus spells prepared: arcane sight, dispel magic, vampiric touch (3rd); bear's endurance, blur, elemental touch, invisibility, scorching ray (2nd); burning hands, magic missile, ray of enfeeblement, shield, true strike (1st).",
|
||||
"abilities": {
|
||||
"str_score": 14,
|
||||
"dex_score": 10,
|
||||
"con_score": 12,
|
||||
"int_score": 18,
|
||||
"wis_score": 8,
|
||||
"cha_score": 14
|
||||
},
|
||||
"hp_max": 63,
|
||||
"ac": {
|
||||
"total": 15,
|
||||
"touch": 11,
|
||||
"flat_footed": 15
|
||||
},
|
||||
"bab": 6,
|
||||
"initiative_mod": 0,
|
||||
"speed_land_ft": 30,
|
||||
"saves": {
|
||||
"fort": 8,
|
||||
"ref": 3,
|
||||
"will": 6
|
||||
},
|
||||
"casting_ability": "int",
|
||||
"arcane_caster": true,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {
|
||||
"1": 5,
|
||||
"2": 5,
|
||||
"3": 3
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"id": "thrune_agent:mace",
|
||||
"name": "heavy mace",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 9,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d8",
|
||||
"types": [
|
||||
"bludgeoning"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 3,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2
|
||||
},
|
||||
{
|
||||
"id": "thrune_agent:crossbow",
|
||||
"name": "light crossbow",
|
||||
"kind": "ranged",
|
||||
"attack_bonus": 6,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d8",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 19,
|
||||
"crit_mult": 2,
|
||||
"range_increment_ft": 80
|
||||
}
|
||||
],
|
||||
"cmb": 8,
|
||||
"cmd": 19,
|
||||
"features": [
|
||||
"Alertness",
|
||||
"Combat Casting",
|
||||
"Extra Arcana",
|
||||
"Skill Focus (Intimidate)",
|
||||
"Toughness",
|
||||
"Weapon Focus (heavy mace)",
|
||||
"Medium Armor Proficiency",
|
||||
"Spell Combat",
|
||||
"Improved Spell Combat",
|
||||
"Spellstrike",
|
||||
"Arcane Pool",
|
||||
"Spell Recall",
|
||||
"Knowledge Pool",
|
||||
"Magus Arcana (arcane accuracy, empowered magic, spell shield)"
|
||||
],
|
||||
"spells": [
|
||||
"Burning Hands",
|
||||
"Magic Missile",
|
||||
"Ray of Enfeeblement",
|
||||
"Shield",
|
||||
"True Strike",
|
||||
"Bear's Endurance",
|
||||
"Blur",
|
||||
"Elemental Touch",
|
||||
"Invisibility",
|
||||
"Scorching Ray",
|
||||
"Arcane Sight",
|
||||
"Dispel Magic",
|
||||
"Vampiric Touch"
|
||||
],
|
||||
"skills": {}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "Esha Randu",
|
||||
"alignment": "LG",
|
||||
"level": 4,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
@@ -26,8 +25,6 @@
|
||||
"will": 5
|
||||
},
|
||||
"casting_ability": "int",
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {},
|
||||
"resources": {},
|
||||
"attacks": [
|
||||
@@ -47,7 +44,6 @@
|
||||
"crit_range": 20,
|
||||
"crit_mult": 3,
|
||||
"reach_ft": 10,
|
||||
"reach_weapon": true,
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
@@ -104,21 +100,5 @@
|
||||
],
|
||||
"spells": [
|
||||
"Unseen Servant"
|
||||
],
|
||||
"carried_items": [
|
||||
|
||||
"Arrow",
|
||||
"Blunt Arrow",
|
||||
"Dye Arrow",
|
||||
"Smoke Arrow",
|
||||
"Tangleshot Arrow",
|
||||
"Whistling Arrow",
|
||||
"Thieves' Tools, common",
|
||||
"Clefs de la loge",
|
||||
"Badge d'éclaireur",
|
||||
"Rope",
|
||||
"Pomme",
|
||||
"La pomme de Notch",
|
||||
"Pierre de communication"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "Esha's Mount",
|
||||
"alignment": "N",
|
||||
"level": 4,
|
||||
"size": "Large",
|
||||
"abilities": {
|
||||
@@ -33,7 +32,7 @@
|
||||
"attack_bonus": 8,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"formula": "1d6",
|
||||
"types": ["bludgeoning"]
|
||||
}
|
||||
],
|
||||
@@ -41,11 +40,9 @@
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 10,
|
||||
"count": 2,
|
||||
"natural": true
|
||||
"count": 2
|
||||
}
|
||||
],
|
||||
"notes": "Light-horse mount shared with Esha's sheet: hooves are 1d4 bludgeoning (SRD Bestiary horse, light - 2 hooves 1d4), natural attacks. No bite encoded: the SRD light horse has no bite attack and the Foundry sheet lists no mount bite (unlike Jeanne's sheet, which does). Alignment inferred: SRD animal (horse) is typically neutral; no alignment on the sheet",
|
||||
"source": "fiches_personnages/esha_sheet.json (mount)",
|
||||
"features": [
|
||||
"Combat Reflexes",
|
||||
@@ -57,10 +54,7 @@
|
||||
],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {},
|
||||
"carried_items": []
|
||||
"skills": {}
|
||||
}
|
||||
|
||||
+72
-84
@@ -1,88 +1,76 @@
|
||||
{
|
||||
"name": "Harvie",
|
||||
"alignment": "N",
|
||||
"level": 2,
|
||||
"size": "Small",
|
||||
"abilities": {
|
||||
"str_score": 10,
|
||||
"dex_score": 15,
|
||||
"con_score": 12,
|
||||
"int_score": 2,
|
||||
"wis_score": 14,
|
||||
"cha_score": 6
|
||||
},
|
||||
"hp_max": 15,
|
||||
"ac": {
|
||||
"total": 14,
|
||||
"touch": 13,
|
||||
"flat_footed": 12
|
||||
},
|
||||
"bab": 1,
|
||||
"initiative_mod": 2,
|
||||
"speed_land_ft": 10,
|
||||
"speed_fly_ft": 80,
|
||||
"saves": {
|
||||
"fort": 4,
|
||||
"ref": 5,
|
||||
"will": 2
|
||||
},
|
||||
"name": "Harvie",
|
||||
"level": 2,
|
||||
"size": "Small",
|
||||
"abilities": {
|
||||
"str_score": 10,
|
||||
"dex_score": 15,
|
||||
"con_score": 12,
|
||||
"int_score": 2,
|
||||
"wis_score": 12,
|
||||
"cha_score": 6
|
||||
},
|
||||
"hp_max": 15,
|
||||
"ac": {
|
||||
"total": 14,
|
||||
"touch": 13,
|
||||
"flat_footed": 12
|
||||
},
|
||||
"bab": 1,
|
||||
"initiative_mod": 2,
|
||||
"speed_land_ft": 10,
|
||||
"speed_fly_ft": 80,
|
||||
"saves": {
|
||||
"fort": 4,
|
||||
"ref": 5,
|
||||
"will": 2
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"id": "harvie:bite",
|
||||
"name": "Bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 2,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true,
|
||||
"secondary": true
|
||||
},
|
||||
{
|
||||
"id": "harvie:talons",
|
||||
"name": "Talons",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 2,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"slashing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 2,
|
||||
"natural": true
|
||||
}
|
||||
{
|
||||
"id": "harvie:bite",
|
||||
"name": "Bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 3,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": ["piercing"]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"id": "harvie:claw",
|
||||
"name": "Claw",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 3,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d3",
|
||||
"types": ["slashing"]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
}
|
||||
],
|
||||
"source": "fiches_personnages/harvie_sheet.json",
|
||||
"notes": "Feat : 'Friendly Face' est un no-op documenté (attitude initiale des animaux +2 pas, système d'attitude non modélisé).",
|
||||
"features": [
|
||||
"Friendly Face",
|
||||
"Fey-touched",
|
||||
"Animal (race)"
|
||||
],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {},
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {},
|
||||
"carried_items": []
|
||||
"source": "fiches_personnages/harvie_sheet.json",
|
||||
"features": [
|
||||
"Friendly Face",
|
||||
"Fey-touched",
|
||||
"Animal (race)"
|
||||
],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"spell_slots": {},
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {}
|
||||
}
|
||||
|
||||
+54
-82
@@ -1,87 +1,59 @@
|
||||
{
|
||||
"name": "Ierlieth",
|
||||
"alignment": "CN",
|
||||
"level": 4,
|
||||
"size": "Tiny",
|
||||
"abilities": {
|
||||
"str_score": 8,
|
||||
"dex_score": 17,
|
||||
"con_score": 11,
|
||||
"int_score": 10,
|
||||
"wis_score": 10,
|
||||
"cha_score": 9
|
||||
},
|
||||
"hp_max": 29,
|
||||
"ac": {
|
||||
"total": 17,
|
||||
"touch": 15,
|
||||
"flat_footed": 14
|
||||
},
|
||||
"bab": 3,
|
||||
"initiative_mod": 3,
|
||||
"speed_land_ft": 15,
|
||||
"speed_fly_ft": 40,
|
||||
"saves": {
|
||||
"fort": 3,
|
||||
"ref": 6,
|
||||
"will": 3
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"id": "ierlieth:bite",
|
||||
"name": "Bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
"name": "Ierlieth",
|
||||
"level": 4,
|
||||
"size": "Tiny",
|
||||
"abilities": {
|
||||
"str_score": 8,
|
||||
"dex_score": 17,
|
||||
"con_score": 11,
|
||||
"int_score": 10,
|
||||
"wis_score": 10,
|
||||
"cha_score": 9
|
||||
},
|
||||
"hp_max": 29,
|
||||
"ac": {
|
||||
"total": 17,
|
||||
"touch": 15,
|
||||
"flat_footed": 14
|
||||
},
|
||||
"bab": 3,
|
||||
"initiative_mod": 3,
|
||||
"speed_land_ft": 15,
|
||||
"speed_fly_ft": 40,
|
||||
"saves": {
|
||||
"fort": 3,
|
||||
"ref": 6,
|
||||
"will": 3
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
"id": "ierlieth:bite",
|
||||
"name": "Bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": ["piercing"]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
}
|
||||
],
|
||||
"damage_bonus": -1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true
|
||||
},
|
||||
{
|
||||
"id": "ierlieth:tail",
|
||||
"name": "Tail",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"bludgeoning"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true,
|
||||
"secondary": true
|
||||
}
|
||||
],
|
||||
"source": "fiches_personnages/ierlieth_sheet.json",
|
||||
"features": [
|
||||
"Drake (race)",
|
||||
"Toughness",
|
||||
"Power Attack"
|
||||
],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {},
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {},
|
||||
"carried_items": []
|
||||
"source": "fiches_personnages/ierlieth_sheet.json",
|
||||
"features": [
|
||||
"Drake (race)",
|
||||
"Toughness",
|
||||
"Power Attack"
|
||||
],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"spell_slots": {},
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {}
|
||||
}
|
||||
|
||||
+3
-27
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "Jeanne",
|
||||
"alignment": "N",
|
||||
"level": 4,
|
||||
"size": "Large",
|
||||
"abilities": {
|
||||
@@ -33,7 +32,7 @@
|
||||
"attack_bonus": 8,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"formula": "1d6",
|
||||
"types": ["bludgeoning"]
|
||||
}
|
||||
],
|
||||
@@ -41,27 +40,7 @@
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 10,
|
||||
"count": 2,
|
||||
"natural": true
|
||||
},
|
||||
{
|
||||
"id": "jeanne:bite",
|
||||
"name": "Bite",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 8,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d3",
|
||||
"types": ["piercing"]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 2,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true,
|
||||
"secondary": true
|
||||
"count": 2
|
||||
}
|
||||
],
|
||||
"source": "fiches_personnages/jeanne_sheet.json",
|
||||
@@ -75,11 +54,8 @@
|
||||
],
|
||||
"spells": [],
|
||||
"casting_ability": "wis",
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {},
|
||||
"resources": {},
|
||||
"metamagic_feats": [],
|
||||
"skills": {},
|
||||
"carried_items": ["Saddle (riding)", "Feed", "Trail Rations"]
|
||||
"skills": {}
|
||||
}
|
||||
|
||||
+157
-179
@@ -1,188 +1,166 @@
|
||||
{
|
||||
"name": "Misty",
|
||||
"alignment": "NE",
|
||||
"level": 4,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
"str_score": 12,
|
||||
"dex_score": 19,
|
||||
"con_score": 14,
|
||||
"int_score": 16,
|
||||
"wis_score": 7,
|
||||
"cha_score": 18
|
||||
},
|
||||
"hp_max": 31,
|
||||
"ac": {
|
||||
"total": 20,
|
||||
"touch": 14,
|
||||
"flat_footed": 16
|
||||
},
|
||||
"bab": 3,
|
||||
"initiative_mod": 4,
|
||||
"speed_land_ft": 30,
|
||||
"saves": {
|
||||
"fort": 7,
|
||||
"ref": 9,
|
||||
"will": 3
|
||||
},
|
||||
"casting_ability": "cha",
|
||||
"arcane_caster": true,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {
|
||||
"1": 4,
|
||||
"2": 3
|
||||
},
|
||||
"resources": {
|
||||
"bardic_rounds": 12
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"name": "MWK Rapier",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 8,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 18,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
"name": "Misty",
|
||||
"level": 4,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
"str_score": 12,
|
||||
"dex_score": 19,
|
||||
"con_score": 14,
|
||||
"int_score": 16,
|
||||
"wis_score": 7,
|
||||
"cha_score": 18
|
||||
},
|
||||
{
|
||||
"name": "Dagger",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 7,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 19,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 10
|
||||
"hp_max": 31,
|
||||
"ac": {
|
||||
"total": 20,
|
||||
"touch": 14,
|
||||
"flat_footed": 16
|
||||
},
|
||||
{
|
||||
"name": "Talons (attaque naturelle)",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"slashing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true
|
||||
"bab": 3,
|
||||
"initiative_mod": 4,
|
||||
"speed_land_ft": 30,
|
||||
"saves": {
|
||||
"fort": 7,
|
||||
"ref": 9,
|
||||
"will": 3
|
||||
},
|
||||
{
|
||||
"name": "Bite (attaque naturelle)",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true
|
||||
"casting_ability": "cha",
|
||||
"spell_slots": {
|
||||
"1": 4,
|
||||
"2": 3
|
||||
},
|
||||
{
|
||||
"name": "Unarmed Strike",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
"resources": {
|
||||
"bardic_rounds": 12
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"formula": "1d3",
|
||||
"types": [
|
||||
"bludgeoning"
|
||||
]
|
||||
"name": "MWK Rapier",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 8,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 18,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"name": "Dagger",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 7,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 19,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 10
|
||||
},
|
||||
{
|
||||
"name": "Talons (attaque naturelle)",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"slashing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"name": "Bite (attaque naturelle)",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d4",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"name": "Unarmed Strike",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 4,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d3",
|
||||
"types": [
|
||||
"bludgeoning"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
}
|
||||
],
|
||||
"source": "fiches_personnages/misty_sheet.json",
|
||||
"notes": "Traits : 'Born Damned' est un no-op documenté (+2 sauvegardes vs malédictions, descripteur 'curse' absent du moteur) ; 'Axe to Grind' est un no-op documenté (+1 dégâts vs ennemi menacé seulement par soi, condition non exprimable) ; 'Scaled Skin (electricity)' est encodé dans resistances (électricité 5, SRD : remplace Fiendish Resistance, donc pas de résistance froid/feu). 'Maw or Claw' : la fiche Foundry note la morsure « 1d4 piercing estimé » (item sans stats, estimation de l'auteur, non délibérée) ; le SRD (ARG, trait tieffelin daemon-spawn) accorde une morsure 1d6 à une créature Medium - l'encodage suit le SRD (1d6) et consigne l'écart avec la fiche.",
|
||||
"features": [
|
||||
"Harmonic Spell",
|
||||
"Weapon Finesse",
|
||||
"Axe to Grind (combat)",
|
||||
"Spell Vulnerability (divination; drawback)",
|
||||
"Born Damned (race: tiefling)",
|
||||
"Gifted Adept (dispel magic; magic)",
|
||||
"Prehensile Tail (tiefling daemon-spawn)",
|
||||
"Scaled Skin (electricity) (tiefling daemon-spawn)",
|
||||
"Maw or Claw (Bite) (tiefling daemon-spawn)",
|
||||
"Plot Armor"
|
||||
],
|
||||
"spells": [
|
||||
"Prestidigitation",
|
||||
"Oath of Anonymity",
|
||||
"Detect Magic",
|
||||
"Read Magic",
|
||||
"Disrupt Undead",
|
||||
"Ray of Frost",
|
||||
"Summon Instrument",
|
||||
"Mage Hand",
|
||||
"Open/Close",
|
||||
"Arcane Mark",
|
||||
"Acid Splash",
|
||||
"Grasp",
|
||||
"Shield",
|
||||
"Cure Light Wounds",
|
||||
"Color Spray",
|
||||
"Saving Finale",
|
||||
"Vanish",
|
||||
"Shocking Grasp",
|
||||
"Burning Hands",
|
||||
"Alarm",
|
||||
"Scorching Ray",
|
||||
"Bladed Dash",
|
||||
"Mirror Image",
|
||||
"Heroism"
|
||||
],
|
||||
"resistances": {
|
||||
"electricity": 5
|
||||
},
|
||||
"carried_items": [
|
||||
|
||||
"Pouch, Spell Component",
|
||||
"Tools, Thieves'",
|
||||
"Thieves' Tools, masterwork",
|
||||
"Clef de la Loge de Sauerton",
|
||||
"+1 Mithral Arrow",
|
||||
"Bouteille de ??? à moitié vide",
|
||||
"Scroll of Detect Secret Doors",
|
||||
"Scroll of Cure Light Wounds",
|
||||
"Wand of Infernal Healing"
|
||||
],
|
||||
"source": "fiches_personnages/misty_sheet.json",
|
||||
"features": [
|
||||
"Harmonic Spell",
|
||||
"Weapon Finesse",
|
||||
"Axe to Grind (combat)",
|
||||
"Spell Vulnerability (divination; drawback)",
|
||||
"Born Damned (race: tiefling)",
|
||||
"Gifted Adept (dispel magic; magic)",
|
||||
"Prehensile Tail (tiefling daemon-spawn)",
|
||||
"Scaled Skin (electricity) (tiefling daemon-spawn)",
|
||||
"Maw or Claw (Bite) (tiefling daemon-spawn)"
|
||||
],
|
||||
"spells": [
|
||||
"Prestidigitation",
|
||||
"Oath of Anonymity",
|
||||
"Detect Magic",
|
||||
"Read Magic",
|
||||
"Disrupt Undead",
|
||||
"Ray of Frost",
|
||||
"Summon Instrument",
|
||||
"Mage Hand",
|
||||
"Open/Close",
|
||||
"Arcane Mark",
|
||||
"Acid Splash",
|
||||
"Grasp",
|
||||
"Shield",
|
||||
"Cure Light Wounds",
|
||||
"Color Spray",
|
||||
"Saving Finale",
|
||||
"Vanish",
|
||||
"Shocking Grasp",
|
||||
"Burning Hands",
|
||||
"Alarm",
|
||||
"Scorching Ray",
|
||||
"Bladed Dash",
|
||||
"Mirror Image",
|
||||
"Heroism"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "Nairda Guisenda",
|
||||
"alignment": "CN",
|
||||
"level": 4,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
@@ -26,8 +25,6 @@
|
||||
"will": 7
|
||||
},
|
||||
"casting_ability": "int",
|
||||
"arcane_caster": true,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {
|
||||
"1": 4,
|
||||
"2": 3
|
||||
@@ -117,15 +114,5 @@
|
||||
"Ice Slick",
|
||||
"Darkness",
|
||||
"Flurry of Snowballs"
|
||||
],
|
||||
"carried_items": [
|
||||
|
||||
"Spell Component Pouch",
|
||||
"Holy symbol (Wood)",
|
||||
"Arrow",
|
||||
"Lettres dans une chambre de bandits",
|
||||
"Clefs de la loge",
|
||||
"Badge des éclaireurs",
|
||||
"Potion de soin de Nairda"
|
||||
]
|
||||
}
|
||||
|
||||
+119
-136
@@ -1,143 +1,126 @@
|
||||
{
|
||||
"name": "Oni Triumvir",
|
||||
"alignment": "NG",
|
||||
"level": 4,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
"str_score": 12,
|
||||
"dex_score": 14,
|
||||
"con_score": 14,
|
||||
"int_score": 12,
|
||||
"wis_score": 18,
|
||||
"cha_score": 16
|
||||
},
|
||||
"hp_max": 36,
|
||||
"ac": {
|
||||
"total": 19,
|
||||
"touch": 18,
|
||||
"flat_footed": 17
|
||||
},
|
||||
"bab": 4,
|
||||
"initiative_mod": 2,
|
||||
"speed_land_ft": 30,
|
||||
"saves": {
|
||||
"fort": 7,
|
||||
"ref": 7,
|
||||
"will": 9
|
||||
},
|
||||
"casting_ability": "wis",
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {
|
||||
"1": 4,
|
||||
"2": 3
|
||||
},
|
||||
"resources": {
|
||||
"channel_energy": 6
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"name": "Longbow",
|
||||
"kind": "ranged",
|
||||
"attack_bonus": 6,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d8",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 3,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 100
|
||||
"name": "Oni Triumvir",
|
||||
"level": 4,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
"str_score": 12,
|
||||
"dex_score": 14,
|
||||
"con_score": 14,
|
||||
"int_score": 12,
|
||||
"wis_score": 18,
|
||||
"cha_score": 16
|
||||
},
|
||||
{
|
||||
"name": "Alchemist's Fire",
|
||||
"kind": "touch",
|
||||
"attack_bonus": 6,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"fire"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 10,
|
||||
"splash": {
|
||||
"damage": 1,
|
||||
"type": "fire"
|
||||
}
|
||||
"hp_max": 36,
|
||||
"ac": {
|
||||
"total": 19,
|
||||
"touch": 18,
|
||||
"flat_footed": 17
|
||||
},
|
||||
{
|
||||
"name": "Attaques naturelles (Shifter Claws / formes fées)",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 5,
|
||||
"damage": [
|
||||
"bab": 4,
|
||||
"initiative_mod": 2,
|
||||
"speed_land_ft": 30,
|
||||
"saves": {
|
||||
"fort": 7,
|
||||
"ref": 7,
|
||||
"will": 9
|
||||
},
|
||||
"casting_ability": "wis",
|
||||
"spell_slots": {
|
||||
"1": 4,
|
||||
"2": 3
|
||||
},
|
||||
"resources": {
|
||||
"channel_energy": 6
|
||||
},
|
||||
"attacks": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"slashing"
|
||||
]
|
||||
"name": "Longbow",
|
||||
"kind": "ranged",
|
||||
"attack_bonus": 6,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d8",
|
||||
"types": [
|
||||
"piercing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 3,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 100
|
||||
},
|
||||
{
|
||||
"name": "Alchemist's Fire",
|
||||
"kind": "touch",
|
||||
"attack_bonus": 6,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"fire"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 0,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 10
|
||||
},
|
||||
{
|
||||
"name": "Attaques naturelles (Shifter Claws / formes fées)",
|
||||
"kind": "melee",
|
||||
"attack_bonus": 5,
|
||||
"damage": [
|
||||
{
|
||||
"formula": "1d6",
|
||||
"types": [
|
||||
"slashing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1
|
||||
}
|
||||
],
|
||||
"damage_bonus": 1,
|
||||
"crit_range": 20,
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"natural": true
|
||||
}
|
||||
],
|
||||
"source": "fiches_personnages/oni_sheet.json",
|
||||
"notes": "Armes placeholder Foundry sans dégâts encodés omises : 'une Pioche' (non maîtrisée) et 'Weapon' (à remplacer par la vraie arme). Traits : 'Exalted of the Society' accorde +1 canalisation d'énergie/jour (channel_energy 6 -> 7, fusionné par le chargeur) ; 'Extremely Fashionable' est un no-op documenté (+1 Bluff/Diplomacy/Intimidate en habits fins, état vestimentaire non modélisé) ; 'Bitter' (drawback) réduit de 1 les soins reçus d'un allié (comportement moteur).",
|
||||
"features": [
|
||||
"Summon Good Monster",
|
||||
"Sacred Summons",
|
||||
"Selective Channeling",
|
||||
"Extremely Fashionable",
|
||||
"Exalted of the Society (Cleric, Pathfinder Society)",
|
||||
"Bitter",
|
||||
"Ambitious"
|
||||
],
|
||||
"spells": [
|
||||
"Guidance",
|
||||
"Detect Magic",
|
||||
"Stabilize",
|
||||
"Read Magic",
|
||||
"Detect Poison",
|
||||
"Purify Food and Drink",
|
||||
"Summon Monster I",
|
||||
"Shield of Faith",
|
||||
"Forbid Action",
|
||||
"Cure Light Wounds",
|
||||
"Hidden Diplomacy",
|
||||
"Protection from Evil",
|
||||
"Bless",
|
||||
"Summon Monster II",
|
||||
"Cure Moderate Wounds",
|
||||
"Sound Burst",
|
||||
"Suppress Charms and Compulsions",
|
||||
"Delay Poison",
|
||||
"Ironskin",
|
||||
"Restoration, Lesser"
|
||||
],
|
||||
"carried_items": [
|
||||
|
||||
"Arrow",
|
||||
"Holy symbol (Wood)",
|
||||
"Clefs de la loge",
|
||||
"Eh je suis Éclaireuse maintenant",
|
||||
"Kit, Fishing",
|
||||
"Alchemist's Fire"
|
||||
],
|
||||
"source": "fiches_personnages/oni_sheet.json",
|
||||
"notes": "Armes placeholder Foundry sans dégâts encodés omises : 'une Pioche' (non maîtrisée) et 'Weapon' (à remplacer par la vraie arme).",
|
||||
"features": [
|
||||
"Summon Good Monster",
|
||||
"Sacred Summons",
|
||||
"Selective Channeling",
|
||||
"Extremely Fashionable",
|
||||
"Exalted of the Society (Cleric, Pathfinder Society)",
|
||||
"Bitter",
|
||||
"Ambitious"
|
||||
],
|
||||
"spells": [
|
||||
"Guidance",
|
||||
"Detect Magic",
|
||||
"Stabilize",
|
||||
"Read Magic",
|
||||
"Detect Poison",
|
||||
"Purify Food and Drink",
|
||||
"Summon Monster I",
|
||||
"Shield of Faith",
|
||||
"Forbid Action",
|
||||
"Cure Light Wounds",
|
||||
"Hidden Diplomacy",
|
||||
"Protection from Evil",
|
||||
"Bless",
|
||||
"Summon Monster II",
|
||||
"Cure Moderate Wounds",
|
||||
"Sound Burst",
|
||||
"Suppress Charms and Compulsions",
|
||||
"Delay Poison",
|
||||
"Ironskin",
|
||||
"Restoration, Lesser"
|
||||
]
|
||||
}
|
||||
|
||||
+5
-38
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "Tammara Cailean",
|
||||
"alignment": "CG",
|
||||
"level": 4,
|
||||
"size": "Medium",
|
||||
"abilities": {
|
||||
@@ -26,8 +25,6 @@
|
||||
"will": 8
|
||||
},
|
||||
"casting_ability": "wis",
|
||||
"arcane_caster": false,
|
||||
"armor_spell_failure": 0,
|
||||
"spell_slots": {
|
||||
"1": 4,
|
||||
"2": 3
|
||||
@@ -56,7 +53,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Braises d'Automne (pistolet ?)",
|
||||
"kind": "touch",
|
||||
"kind": "ranged",
|
||||
"attack_bonus": 9,
|
||||
"damage": [
|
||||
{
|
||||
@@ -71,12 +68,11 @@
|
||||
"crit_mult": 4,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 20,
|
||||
"firearm": true
|
||||
"range_increment_ft": 20
|
||||
},
|
||||
{
|
||||
"name": "Adieux du Printemps (pistolet, masterwork)",
|
||||
"kind": "touch",
|
||||
"kind": "ranged",
|
||||
"attack_bonus": 10,
|
||||
"damage": [
|
||||
{
|
||||
@@ -91,8 +87,7 @@
|
||||
"crit_mult": 4,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 20,
|
||||
"firearm": true
|
||||
"range_increment_ft": 20
|
||||
},
|
||||
{
|
||||
"name": "Alchemist's Fire",
|
||||
@@ -111,11 +106,7 @@
|
||||
"crit_mult": 2,
|
||||
"reach_ft": 5,
|
||||
"count": 1,
|
||||
"range_increment_ft": 10,
|
||||
"splash": {
|
||||
"damage": 1,
|
||||
"type": "fire"
|
||||
}
|
||||
"range_increment_ft": 10
|
||||
},
|
||||
{
|
||||
"name": "Unarmed Strike",
|
||||
@@ -137,7 +128,6 @@
|
||||
}
|
||||
],
|
||||
"source": "fiches_personnages/tammara_sheet.json",
|
||||
"notes": "Traits : 'Fortified Drinker' est un no-op documenté (+2 sauvegardes vs effets mentaux après alcool, état d'ébriété non modélisé) ; 'Lonely' (drawback) applique -2 Sense Motive et -2 sauvegardes vs charme (mind_affecting remplace charme).",
|
||||
"features": [
|
||||
"Weapon Focus (Pistol)",
|
||||
"Rapid Reload (Pistol)",
|
||||
@@ -210,28 +200,5 @@
|
||||
"Delay Poison",
|
||||
"Aid",
|
||||
"Drunkard's Breath"
|
||||
],
|
||||
"carried_items": [
|
||||
|
||||
"Mess Kit",
|
||||
"Gunsmith's Kit",
|
||||
"Holy symbol (Wood)",
|
||||
"Spell component pouch",
|
||||
"Powder horn",
|
||||
"Firearm Bullet",
|
||||
"Alchemical Cartridge (Paper, Bullet Or Pellet)",
|
||||
"Black Powder (Dose)",
|
||||
"Matériaux pour munitions",
|
||||
"Rope",
|
||||
"Bouteille d'alcool (poste des bandits)",
|
||||
"Clefs de la loge (4)",
|
||||
"Black Powder (Dose) en stock",
|
||||
"Firearm Bullet en stock",
|
||||
"Alchemical Cartridge (Paper, Bullet Or Pellet) en stock",
|
||||
"Alcool de poison d'araignée ogre",
|
||||
"Badge des éclaireurs",
|
||||
"Bouteille d'alcool fort (genre plus que du désinfectant)",
|
||||
"Une médaille de Caiden Cailean",
|
||||
"Potion of Cure Light Wounds"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Abundant Ammunition",
|
||||
"level": 1,
|
||||
"school": "conjuration",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A 1st-level spell that conjures duplicate ammunition: attacks with the affected ammunition do not expend it. No combat-mechanical effect in the engine (ammunition is not tracked)."
|
||||
}
|
||||
@@ -2,27 +2,16 @@
|
||||
"name": "Acid Arrow",
|
||||
"level": 2,
|
||||
"school": "evocation",
|
||||
"components": "V, S, M, F",
|
||||
"range": "long",
|
||||
"range": "medium",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"requires_ranged_touch": true,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "2d4",
|
||||
"types": ["acid"],
|
||||
"half_on_save": false,
|
||||
"recurring": {
|
||||
"formula": "2d4",
|
||||
"types": ["acid"],
|
||||
"base_rounds": 1,
|
||||
"per_levels": 3,
|
||||
"max": 7
|
||||
}
|
||||
"half_on_save": false
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/acid-arrow.md: ranged touch attack dealing 2d4 acid damage, plus another 2d4 acid damage at the start of each of the target's turns for 1 round + 1 round per three caster levels (maximum 6 ADDITIONAL rounds at 18th level, i.e. 7 recurring rounds total). Recurring damage is reduced by energy resistance/immunity, not by DR. No save."
|
||||
"description": "An arrow of acid springs from your hand and speeds to its target, dealing 2d4 points of acid damage. No save."
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"name": "Acid Splash",
|
||||
"level": 0,
|
||||
"school": "conjuration",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"requires_ranged_touch": true,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "1d3",
|
||||
"types": ["acid"],
|
||||
"half_on_save": false
|
||||
}
|
||||
],
|
||||
"description": "You fire a small orb of acid at the target, dealing 1d3 points of acid damage (ranged touch attack, no save)."
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"name": "Aid",
|
||||
"level": 2,
|
||||
"school": "enchantment",
|
||||
"components": "V, S, DF",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "attack", "value": 1, "bonus_type": "morale" },
|
||||
{ "target": "fort", "value": 1, "bonus_type": "morale", "condition": "fear" },
|
||||
{ "target": "ref", "value": 1, "bonus_type": "morale", "condition": "fear" },
|
||||
{ "target": "will", "value": 1, "bonus_type": "morale", "condition": "fear" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/aid.md: the subject gains a +1 morale bonus on attack rolls and on saves against fear effects, plus temporary hit points equal to 1d8 + caster level (maximum 1d8+10). The save bonus is scoped to fear effects via the descriptor-conditioned modifiers (all three saves, replacing the previous unconditional Will-only approximation). The temporary hit points are deferred: CombatantState has no temp-HP track (same gap as the virtue cantrip). Duration 1 min/level approximated as 10 rounds."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Air Bubble",
|
||||
"level": 1,
|
||||
"school": "conjuration",
|
||||
"components": "S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "SRD spells/air-bubble.md: range touch - a small pocket of breathable air surrounds the touched creature's head (or a touched object) for 1 min./level. No combat-mechanical effect in the engine."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Alarm",
|
||||
"level": 1,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, F/DF",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "Wards a area (20-ft radius, 20 ft high) against intrusion for 2 hours/level, alerting you mentally. No combat-mechanical effect in the engine."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Arcane Mark",
|
||||
"level": 0,
|
||||
"school": "universal",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "Creates a permanent visible inscribed mark of your choosing on an object or surface, optionally invisible and keyed to you. Utility cantrip, no combat effect."
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": "Bane",
|
||||
"level": 1,
|
||||
"school": "enchantment",
|
||||
"components": "V, S, DF",
|
||||
"range": "medium",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"radius_ft": 50,
|
||||
"targets": "enemies",
|
||||
"centered_on_caster": true,
|
||||
"save_for_half": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "bane",
|
||||
"duration_rounds": 10,
|
||||
"save_negates": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/bane.md: enemies within a 50-ft burst centered on the caster take a -1 penalty on attack rolls and a -1 penalty on saving throws against fear effects; Will negates. Modeled with the dedicated bane condition (untyped -1 on attacks, -1 on saves conditioned on the fear descriptor) - the previous shaken (-2) approximation overcounted the penalty. Duration 1 min/level approximated as 10 rounds."
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
{
|
||||
"name": "Bear's Endurance",
|
||||
"level": 2,
|
||||
"school": "transmutation",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "fort", "value": 2, "bonus_type": "enhancement" }
|
||||
],
|
||||
"duration_rounds": 60
|
||||
},
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "hp", "value": 0, "bonus_type": "enhancement" }
|
||||
],
|
||||
"duration_rounds": 60,
|
||||
"scaling_flat": { "amount": 2, "per_levels": 1, "max": 40 }
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/bear-s-endurance.md: the subject gains a +4 enhancement bonus to Constitution - +2 to Fortitude saves and +2 hit points per Hit Die - for 10 min./level. The engine has no ability-score track, so the +4 Con is encoded as its combat consequences: an unscaled +2 Fortitude enhancement, and a separate hp modifier carrying the per-HD bonus via flat scaling (+2 per level, capped at +40 for level 20; caster level stands in for the target's Hit Dice, and the hp target is informational - the engine has no per-HD hp pool). Will negates (harmless). Duration 10 min/level approximated as 60 rounds."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Bladed Dash",
|
||||
"level": 2,
|
||||
"school": "transmutation",
|
||||
"components": "V",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "speed_ft", "value": 30, "bonus_type": "enhancement" }
|
||||
],
|
||||
"duration_rounds": 1
|
||||
}
|
||||
],
|
||||
"description": "Upon casting, you immediately move up to 30 feet in a straight line in any direction; this movement does not provoke attacks of opportunity, and you may make a single melee attack at your highest base attack bonus against any creature you are adjacent to at any point along this 30 feet (SRD bladed dash). Simplified as a +30 ft speed buff for 1 round; the free melee attack, the no-AoO movement, the straight-line constraint and the circumstance attack bonus are not modeled."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Bleed",
|
||||
"level": 0,
|
||||
"school": "necromancy",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "bleeding",
|
||||
"duration_rounds": 1,
|
||||
"save_negates": true,
|
||||
"requires_dying": true
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/bleed.md: you target one living creature that has -1 or fewer hit points; it begins dying, taking 1 point of damage per round; Will negates. Gated on the target's hit points (requires_dying): a creature at 0 hp or above is not a valid target and the spell has no effect. Modeled as the bleeding condition for 1 round with bleed_damage = 1 (the engine's bleed tick deals it at the start of the target's turn)."
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"name": "Bless",
|
||||
"level": 1,
|
||||
"school": "enchantment",
|
||||
"components": "V, S, DF",
|
||||
"range": "medium",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"radius_ft": 50,
|
||||
"targets": "allies",
|
||||
"centered_on_caster": true,
|
||||
"save_for_half": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "attack", "value": 1, "bonus_type": "morale" },
|
||||
{ "target": "will", "value": 1, "bonus_type": "morale" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "The caster and all allies within a 50-ft burst centered on the caster gain a +1 morale bonus on attack rolls and on saving throws against fear effects (modeled as Will). Duration 1 min/level approximated as 10 rounds."
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "Blindness/Deafness",
|
||||
"level": 2,
|
||||
"school": "necromancy",
|
||||
"components": "V",
|
||||
"range": "medium",
|
||||
"save": "fort",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "blinded",
|
||||
"duration_rounds": 100,
|
||||
"save_negates": true
|
||||
}
|
||||
],
|
||||
"description": "The target becomes blind or deaf (modeled as blinded) until removed by a caster of higher level. Permanent duration approximated as 100 rounds. Fortitude negates."
|
||||
}
|
||||
@@ -2,22 +2,18 @@
|
||||
"name": "Bull's Strength",
|
||||
"level": 2,
|
||||
"school": "transmutation",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"save": "fort",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "attack", "value": 2, "bonus_type": "enhancement" },
|
||||
{ "target": "damage", "value": 2, "bonus_type": "enhancement" },
|
||||
{ "target": "cmb", "value": 2, "bonus_type": "enhancement" }
|
||||
{ "target": "attack", "value": 1, "bonus_type": "enhancement" },
|
||||
{ "target": "damage", "value": 1, "bonus_type": "enhancement" }
|
||||
],
|
||||
"duration_rounds": 60
|
||||
}
|
||||
],
|
||||
"description": "The subject gains a +4 enhancement bonus to Strength, granting +2 to melee attack rolls, melee damage rolls, and combat maneuver checks (SRD bull's strength). Will negates (harmless)."
|
||||
"description": "The subject gains a +4 enhancement bonus to Strength, granting +2 attack and +2 damage (approximated as +1/+1). Fortitude negates (harmless)."
|
||||
}
|
||||
|
||||
@@ -2,27 +2,16 @@
|
||||
"name": "Burning Hands",
|
||||
"level": 1,
|
||||
"school": "evocation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"range": "touch",
|
||||
"save": "ref",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"shape": "cone",
|
||||
"radius_ft": 15,
|
||||
"save_for_half": true,
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "0",
|
||||
"types": ["fire"],
|
||||
"half_on_save": true,
|
||||
"scaling": { "dice": "1d4", "per_levels": 1, "max_dice": 5 }
|
||||
}
|
||||
]
|
||||
"type": "damage",
|
||||
"formula": "1d4+1",
|
||||
"types": ["fire"],
|
||||
"half_on_save": true
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/burning-hands.md: a 15-ft. cone of searing flame dealing 1d4 points of fire damage per caster level (maximum 5d4); Reflex half. The SRD range is 15 ft. - modeled as the closest category (close, 25 ft. at low levels)."
|
||||
"description": "A cone of searing flame shoots from your fingertips, dealing 1d4+1 points of fire damage per caster level (max 5d4+5). Reflex save for half."
|
||||
}
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "Charm Person",
|
||||
"level": 1,
|
||||
"school": "enchantment",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "fascinated",
|
||||
"duration_rounds": 100,
|
||||
"save_negates": true
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/charm-person.md: range close (25 ft. + 5 ft./2 levels) - corrected from the previous medium approximation. The charmed person regards the caster as a trusted friend; the engine has no charmed condition, so it is modeled as fascinated (the subject takes no actions). Duration 1 hour/level approximated as 100 rounds. Will negates."
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"name": "Color Spray",
|
||||
"level": 1,
|
||||
"school": "illusion",
|
||||
"components": "V, S, M",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"shape": "cone",
|
||||
"radius_ft": 15,
|
||||
"save_for_half": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "stunned",
|
||||
"duration_rounds": 1,
|
||||
"save_negates": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/color-spray.md: a 15-ft. cone of chaotic colors blinds and stuns creatures with fewer HD than your level for 1d4 rounds (approximated as 1 round of stunned; the HD tiers are not modeled). Will negates."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Comprehend Languages",
|
||||
"level": 1,
|
||||
"school": "divination",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "A 1st-level spell that lets you understand the meaning of any spoken or written language you encounter for 1 min/level. Utility spell, no combat effect."
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"name": "Create Alcool",
|
||||
"level": 0,
|
||||
"school": "conjuration",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "A cantrip (Create Alcohol, spelled as on the PC sheet) that transforms one liquid per level into an alcoholic drink of equal volume. Utility spell, no combat effect."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Create Water",
|
||||
"level": 0,
|
||||
"school": "conjuration",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "Conjures 4 gallons of clean water per level in an open space or container. Utility spell, no combat effect."
|
||||
}
|
||||
@@ -2,18 +2,14 @@
|
||||
"name": "Cure Light Wounds",
|
||||
"level": 1,
|
||||
"school": "conjuration",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "heal",
|
||||
"formula": "1d8",
|
||||
"scaling_flat": { "amount": 1, "per_levels": 1, "max": 5 }
|
||||
"formula": "1d8+1"
|
||||
}
|
||||
],
|
||||
"description": "Cures 1d8 points of damage +1 point per caster level (maximum +5). Will half (harmless); since undead are powered by negative energy, the spell deals damage to them instead (Will half, SRD cure light wounds)."
|
||||
"description": "Cures 1d8+1 points of damage. Will save negates (harmless)."
|
||||
}
|
||||
|
||||
@@ -2,18 +2,14 @@
|
||||
"name": "Cure Moderate Wounds",
|
||||
"level": 2,
|
||||
"school": "conjuration",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "heal",
|
||||
"formula": "2d8",
|
||||
"scaling_flat": { "amount": 1, "per_levels": 1, "max": 10 }
|
||||
"formula": "2d8+3"
|
||||
}
|
||||
],
|
||||
"description": "Cures 2d8 points of damage +1 point per caster level (maximum +10). Will half (harmless); since undead are powered by negative energy, the spell deals damage to them instead (Will half, SRD cure moderate wounds)."
|
||||
"description": "Cures 2d8+3 points of damage. Will save negates (harmless)."
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Dancing Lights",
|
||||
"level": 0,
|
||||
"school": "evocation",
|
||||
"components": "V, S",
|
||||
"range": "medium",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip that creates up to four flickering torch-like lights you move as desired (concentration, 1 min/level). Utility spell, no combat effect."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Darkness",
|
||||
"level": 2,
|
||||
"school": "evocation",
|
||||
"components": "V, M/DF",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"radius_ft": 20,
|
||||
"save_for_half": false,
|
||||
"effects": []
|
||||
}
|
||||
],
|
||||
"description": "All light in a 20-ft radius (spread from the touched point) becomes supernatural darkness; creatures inside lose visual sight-based advantages for 10 min/level. The engine does not model area concealment, so the burst carries no mechanical effect."
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "Daze",
|
||||
"level": 0,
|
||||
"school": "enchantment",
|
||||
"components": "V, S, M",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "dazed",
|
||||
"duration_rounds": 1,
|
||||
"save_negates": true
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/daze.md: a cantrip that clouds the mind of a humanoid creature with 4 HD or fewer, making it unable to act for 1 round. Humanoids of 5 or more HD are not affected. Will negates."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Deja Vu",
|
||||
"level": 1,
|
||||
"school": "enchantment",
|
||||
"components": "V",
|
||||
"range": "medium",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "A 1st-level spell that lets you reroll one attack roll, saving throw, or skill check made in the past round (once per casting). Not modeled by the engine's action flow, so it carries no mechanical effect."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Delay Disease",
|
||||
"level": 2,
|
||||
"school": "conjuration",
|
||||
"components": "V, S, DF",
|
||||
"range": "touch",
|
||||
"save": "fort",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "SRD spells/delay-disease.md: conjuration (healing), level 2 for nearly every divine/prime class (witch 1 for ratfolk); the engine pins the common level 2. The target becomes temporarily immune to disease for 1 day. Utility spell, no combat-mechanical effect in the engine. Fortitude negates (harmless)."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Delay Poison",
|
||||
"level": 2,
|
||||
"school": "conjuration",
|
||||
"components": "V, S, DF",
|
||||
"range": "touch",
|
||||
"save": "fort",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "You temporarily stave off incoming poison or eliminate one already in the subject's system for 1 hour/level. Utility spell, no combat-mechanical effect in the engine. Fortitude negates (harmless)."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Detect Fiendish Presence",
|
||||
"level": 0,
|
||||
"school": "divination",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip that reveals whether a creature of the outsider (evil) subtype has been in the area within 10 minutes/HD, and hints at its nature. Utility spell, no combat effect."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Detect Magic",
|
||||
"level": 0,
|
||||
"school": "divination",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip that detects magical auras in a 60-ft cone (2 rounds to identify strength and school). Utility spell, no combat effect."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Detect Poison",
|
||||
"level": 0,
|
||||
"school": "divination",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip that determines whether a creature, object, or area is poisoned, venomous, or afflicted by acid. Utility spell, no combat effect."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Disrupt Undead",
|
||||
"level": 0,
|
||||
"school": "necromancy",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"requires_ranged_touch": true,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "1d6",
|
||||
"types": ["force"],
|
||||
"half_on_save": false
|
||||
}
|
||||
],
|
||||
"description": "A cantrip: a line of crackling energy strikes one undead creature, dealing 1d6 points of damage (ranged touch attack, no save). The engine does not restrict the damage to undead targets."
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"name": "Divine Favor",
|
||||
"level": 1,
|
||||
"school": "evocation",
|
||||
"components": "V, S, DF",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "attack", "value": 1, "bonus_type": "luck" },
|
||||
{ "target": "damage", "value": 1, "bonus_type": "luck" }
|
||||
],
|
||||
"duration_rounds": 10,
|
||||
"scaling_flat": { "amount": 1, "per_levels": 3, "max": 2 }
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/divine-favor.md: evocation, level 1 (cleric/inquisitor/oracle/paladin/warpriest), range personal, duration 1 minute. You gain a +1 luck bonus on attack and weapon damage rolls, +1 for every three caster levels (at least +1, maximum +3). The bonus does not apply to spell damage - the engine's 'damage' modifier target only rides weapon damage rolls, so that clause holds by construction. Duration 1 minute = 10 rounds."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Doom",
|
||||
"level": 1,
|
||||
"school": "necromancy",
|
||||
"components": "V, S, DF",
|
||||
"range": "medium",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "shaken",
|
||||
"duration_rounds": 10,
|
||||
"duration_rounds_per_level": 10,
|
||||
"save_negates": true
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/doom.md: the subject is filled with horrible dread and becomes shaken (-2 on attacks and saves). Saving Throw Will negates - there is no partial success (the earlier '-1 on a successful save' wording was a D&D 3.5 rule that does not exist in PF1e). Duration 1 min/level (10 rounds per level)."
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": "Drunkard's Breath",
|
||||
"level": 2,
|
||||
"school": "conjuration",
|
||||
"components": "V, S, M",
|
||||
"range": "close",
|
||||
"save": "fort",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"shape": "cone",
|
||||
"radius_ft": 30,
|
||||
"save_for_half": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "nauseated",
|
||||
"duration_rounds": 4,
|
||||
"save_negates": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/drunkards-breath.md: bard 2, cleric 2, oracle 2, skald 2, warpriest 2; conjuration (creation). A cone-shaped burst emanating from your mouth functions like stinking cloud: living creatures in the area become nauseated (Fortitude negates; this is a poison effect). Spell Resistance: no. The SRD range is 30 ft. - modeled as the closest category (close). Duration 1 round/level approximated as 4 rounds (the SRD nausea lasts 1d4+1 rounds after leaving the cloud; fixed duration is the engine convention, cf. fear)."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Endure Elements",
|
||||
"level": 1,
|
||||
"school": "abjuration",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "SRD spells/endure-elements.md: range touch - the creature touched suffers no harm from hot or cold environments (from -50 to 140 degrees F) for 24 hours. Environmental protection, no combat-mechanical effect in the engine."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Enhance Water",
|
||||
"level": 1,
|
||||
"school": "transmutation",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "fort",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "one_round",
|
||||
"effects": [],
|
||||
"description": "You purify and bless 1 gallon/level of water (or one vial of holy/unholy water). Utility spell, no combat-mechanical effect in the engine."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Enhanced Diplomacy",
|
||||
"level": 0,
|
||||
"school": "divination",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "A cantrip: the subject gains a +2 competence bonus on a single Diplomacy or Intimidate check, declared before the roll (duration 1 minute or until discharged). Will negates (harmless). Social skill effect only: the engine does not model skill-check modifiers, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Face of the Devourer",
|
||||
"level": 1,
|
||||
"school": "transmutation",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "fort",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "The target's face becomes hideous: it gains a +4 circumstance bonus on Intimidate checks and, if it lacks one, a bite attack (1d6 for Medium) for 1 min/level. Fortitude negates (harmless). The skill bonus and the granted natural attack are not modeled by the engine, so the spell has no mechanical effects here."
|
||||
}
|
||||
+6
-17
@@ -2,27 +2,16 @@
|
||||
"name": "Fear",
|
||||
"level": 4,
|
||||
"school": "necromancy",
|
||||
"components": "V, S, M",
|
||||
"range": "close",
|
||||
"range": "medium",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"shape": "cone",
|
||||
"radius_ft": 30,
|
||||
"save_for_half": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "panicked",
|
||||
"duration_rounds": 4,
|
||||
"save_negates": true,
|
||||
"on_success": { "condition_name": "shaken", "duration_rounds": 1 }
|
||||
}
|
||||
]
|
||||
"type": "condition",
|
||||
"condition_name": "frightened",
|
||||
"duration_rounds": 4,
|
||||
"save_negates": true
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/fear.md: each living creature in the 30-ft. cone becomes panicked unless it succeeds on a Will save; a creature that succeeds on the save is instead shaken for 1 round (partial save). Modeled as panicked for 4 rounds on a failed save, shaken for 1 round on a successful save. The SRD range is 30 ft. - modeled as the closest category (close)."
|
||||
"description": "The affected creature becomes frightened and flees from the caster. Will negates."
|
||||
}
|
||||
|
||||
@@ -2,11 +2,9 @@
|
||||
"name": "Fireball",
|
||||
"level": 3,
|
||||
"school": "evocation",
|
||||
"components": "V, S, M",
|
||||
"range": "long",
|
||||
"save": "ref",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
@@ -15,13 +13,12 @@
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "0",
|
||||
"formula": "6d6",
|
||||
"types": ["fire"],
|
||||
"half_on_save": true,
|
||||
"scaling": { "dice": "1d6", "per_levels": 1, "max_dice": 10 }
|
||||
"half_on_save": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "A glowing bead streaks from you and bursts into a 20-foot radius explosion of fire, dealing 1d6 points of fire damage per caster level (maximum 10d6). Reflex save for half."
|
||||
"description": "A glowing bead streaks from you and bursts into a 20-foot radius explosion of fire, dealing 6d6 points of fire damage. Reflex save for half."
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": "Flurry of Snowballs",
|
||||
"level": 2,
|
||||
"school": "evocation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "ref",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"shape": "cone",
|
||||
"radius_ft": 30,
|
||||
"save_for_half": true,
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "4d6",
|
||||
"types": ["cold"],
|
||||
"half_on_save": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/flurry-of-snowballs.md: any creature in the 30-ft. cone-shaped burst takes 4d6 points of cold damage. Reflex half. The SRD range is 30 ft. - modeled as the closest category (close)."
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "Forbid Action",
|
||||
"level": 1,
|
||||
"school": "enchantment",
|
||||
"components": "V",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "dazed",
|
||||
"duration_rounds": 1,
|
||||
"save_negates": true
|
||||
}
|
||||
],
|
||||
"description": "You forbid the target a single course of action (attack, cast, communicate, draw, or move), which it avoids to the best of its ability for 1 round. Will negates. Simplification: the chosen-category restriction is approximated as dazed (the target loses its next turn); the specific forbidden action is not modeled."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Grasp",
|
||||
"level": 0,
|
||||
"school": "divination",
|
||||
"components": "V",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "immediate",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip cast as an immediate action when you fail a Climb check and would fall: you immediately retry the Climb check at a -2 penalty (increasing by 2 per successive use in the same situation); on success you don't fall. Climbing is not modeled by the engine, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"name": "Guidance",
|
||||
"level": 0,
|
||||
"school": "divination",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "one_shot",
|
||||
"track": "attack",
|
||||
"value": 1,
|
||||
"bonus_type": "competence",
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/guidance.md: a cantrip - the subject gets a +1 competence bonus on a SINGLE attack roll, saving throw, or skill check, declared before the roll (duration 1 minute or until discharged). Modeled as a one-shot +1 competence modifier on the ATTACK track: the subject's next weapon attack roll (resolve_attack) discharges it and the bonus rides that roll only, not the crit-confirm roll; spell touch-delivery attacks roll on a separate path and do not consume it. The SRD 'attack OR save OR skill' choice has no declaration channel in the engine, so the attack-roll variant is encoded (the mechanism also carries save and skill tracks). 1 minute = 10 rounds, expiring at the start of the bearer's turns like any duration-tracked effect. The bonus folds into the resolve_modifiers pool, so it stacks with other types but not with a higher competence bonus on the same roll. default_policy never casts it (cantrips have no spell slot, and the one-shot type is not a buff/heal/offensive pick)."
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"name": "Heroism",
|
||||
"level": 2,
|
||||
"school": "enchantment",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "attack", "value": 2, "bonus_type": "morale" },
|
||||
{ "target": "fort", "value": 2, "bonus_type": "morale" },
|
||||
{ "target": "ref", "value": 2, "bonus_type": "morale" },
|
||||
{ "target": "will", "value": 2, "bonus_type": "morale" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "The subject gains a +2 morale bonus on attack rolls, saving throws, and skill checks. Duration 10 min/level approximated as 10 rounds; the skill-check bonus has no engine-wide target and is not modeled. Will negates (harmless)."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Hex Vulnerability",
|
||||
"level": 1,
|
||||
"school": "necromancy",
|
||||
"components": "V, S, M",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "The target becomes susceptible to a repeat use of your harmful hexes for 1 round/level, bypassing the once-per-day targeting limit. Will negates. No combat effect: the hex-reuse permission is outside the engine's model, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Hidden Diplomacy",
|
||||
"level": 1,
|
||||
"school": "enchantment",
|
||||
"components": "V, S, M",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "As part of casting, you attempt a single Intimidate check to make the target act friendly; its memory of the threats is clouded, so its attitude does not worsen afterward. Will negates. Social effect only: no combat mechanics are modeled."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Hide from Undead",
|
||||
"level": 1,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "Undead cannot perceive warded creatures (nonintelligent undead ignore them automatically; intelligent undead get a single Will save) until the subject attacks, channels energy, or touches undead. Duration 10 min/level. Saving throw entries here cover the harmless-target save; the undead-perception effect is not modeled by the engine."
|
||||
}
|
||||
@@ -2,19 +2,16 @@
|
||||
"name": "Hold Person",
|
||||
"level": 3,
|
||||
"school": "enchantment",
|
||||
"components": "V, S, F/DF",
|
||||
"range": "medium",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "paralyzed",
|
||||
"duration_rounds": 1,
|
||||
"duration_rounds_per_level": 1,
|
||||
"duration_rounds": 3,
|
||||
"save_negates": true
|
||||
}
|
||||
],
|
||||
"description": "The subject becomes paralyzed and freezes in place. Will negates. Duration 1 round/level."
|
||||
"description": "The subject becomes paralyzed and freezes in place. Will negates."
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"name": "Ice Slick",
|
||||
"level": 2,
|
||||
"school": "evocation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "ref",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"radius_ft": 5,
|
||||
"save_for_half": true,
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "1d6",
|
||||
"types": ["cold"],
|
||||
"half_on_save": true,
|
||||
"scaling_flat": { "amount": 1, "per_levels": 1, "max": 10 }
|
||||
},
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "prone",
|
||||
"duration_rounds": 1,
|
||||
"save_negates": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/ice-slick.md: a blast of intense cold coats a 5-ft-radius burst in ice: creatures in the area take 1d6 points of cold damage + 1 point per caster level (maximum +10) and fall prone; a successful Reflex save halves the damage and avoids falling prone. The lingering slippery surface (half speed, Acrobatics checks) is not modeled."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Ill Omen",
|
||||
"level": 1,
|
||||
"school": "enchantment",
|
||||
"components": "V, S, M",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "The target is afflicted with bad luck: on its next d20 roll (one per 5 caster levels, up to five) it must roll twice and take the less favorable result; duration 1 round/level. No saving throw; spell resistance applies. The forced worst-of-two reroll mechanic is not modeled by the engine, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Inflict Light Wounds",
|
||||
"level": 1,
|
||||
"school": "necromancy",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "1d8",
|
||||
"types": ["negative"],
|
||||
"half_on_save": true,
|
||||
"scaling_flat": { "amount": 1, "per_levels": 1, "max": 5 }
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/inflict-light-wounds.md: touching a creature channels negative energy, dealing 1d8 points of damage + 1 point per caster level (maximum +5). Will half. Undead are instead cured of a like amount of damage - the engine only models the damaging side against living targets."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Ironskin",
|
||||
"level": 2,
|
||||
"school": "transmutation",
|
||||
"components": "V, S, DF/M",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "ac", "value": 4, "bonus_type": "natural" }
|
||||
],
|
||||
"duration_rounds": 60
|
||||
}
|
||||
],
|
||||
"description": "Your skin hardens like iron: you gain a +4 enhancement bonus to your natural armor bonus (rising to +7 at caster level 15; the scaling is not modeled). Duration 1 min/level approximated as 60 rounds. The ability to dismiss the spell to negate one confirmed critical or sneak attack is not modeled."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Light",
|
||||
"level": 0,
|
||||
"school": "evocation",
|
||||
"components": "V, M/DF",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip: a touched object glows like a torch, shedding normal light in a 20-foot radius (plus dim light for 20 more feet) for 10 min/level. No combat effect; illumination is not modeled by the engine."
|
||||
}
|
||||
@@ -2,27 +2,16 @@
|
||||
"name": "Lightning Bolt",
|
||||
"level": 3,
|
||||
"school": "evocation",
|
||||
"components": "V, S, M",
|
||||
"range": "medium",
|
||||
"save": "ref",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"shape": "line",
|
||||
"radius_ft": 120,
|
||||
"save_for_half": true,
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "0",
|
||||
"types": ["electricity"],
|
||||
"half_on_save": true,
|
||||
"scaling": { "dice": "1d6", "per_levels": 1, "max_dice": 10 }
|
||||
}
|
||||
]
|
||||
"type": "damage",
|
||||
"formula": "6d6",
|
||||
"types": ["electricity"],
|
||||
"half_on_save": true
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/lightning-bolt.md: a 120-ft. line dealing 1d6 points of electricity damage per caster level (maximum 10d6). Reflex half. The line starts at the caster's cell (the bolt begins at your fingertips), so the caster's own square is in the area."
|
||||
"description": "You release a powerful stroke of electrical energy, dealing 6d6 points of electricity damage. Reflex save for half."
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"name": "Mage Armor",
|
||||
"level": 1,
|
||||
"school": "conjuration",
|
||||
"components": "V, S, F",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "ac", "value": 4, "bonus_type": "armor" }
|
||||
],
|
||||
"duration_rounds": 600
|
||||
}
|
||||
],
|
||||
"description": "An invisible but tangible field of force surrounds the subject, providing a +4 armor bonus to AC (SRD mage armor: school conjuration (creation) [force], range touch, duration 1 hour/level (modeled as a fixed 600 rounds), spell resistance: no; Will negates (harmless) is not modeled - the engine only self/target-buffs willing recipients). Known simplification: the engine bakes worn armor into the AC total of the JSON and cannot see it, so this armor bonus stacks additively with that baked-in armor value instead of replacing it; two mage armors still do not stack with each other (armor is a non-stacking bonus type)."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Mage Hand",
|
||||
"level": 0,
|
||||
"school": "transmutation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip: a spectral hand lifts and moves one unattended nonmagical object weighing up to 5 lb. from up to 25 ft. away, as far as 15 feet per move action while you concentrate. No combat effect; object manipulation is not modeled by the engine."
|
||||
}
|
||||
@@ -2,19 +2,16 @@
|
||||
"name": "Magic Missile",
|
||||
"level": 1,
|
||||
"school": "evocation",
|
||||
"components": "V, S",
|
||||
"range": "medium",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "1d4+1",
|
||||
"types": ["force"],
|
||||
"half_on_save": false,
|
||||
"projectiles": { "base": 1, "per_levels": 2, "at_level": 1, "max": 5 }
|
||||
"half_on_save": false
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/magic-missile.md: unerring force missiles, 1d4+1 points of force damage each. One missile, plus one additional missile per two caster levels beyond 1st (two at 3rd, three at 5th, four at 7th, maximum five at 9th or higher). Auto-hit (no attack roll); spell resistance applies to the target."
|
||||
"description": "A missile of magical energy darts forth from your fingertip and strikes its target, dealing 1d4+1 points of force damage."
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Make Whole",
|
||||
"level": 2,
|
||||
"school": "transmutation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "long",
|
||||
"effects": [],
|
||||
"description": "Repairs 1d6 points of damage per caster level (maximum 5d6) to one object or construct creature (10-minute casting). Will negates (harmless, object). Object/construct repair is outside the engine's combat model, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Masterwork Transformation",
|
||||
"level": 2,
|
||||
"school": "transmutation",
|
||||
"components": "V, S, M",
|
||||
"range": "touch",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "long",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "After 1 hour of casting (plus masterwork-priced reagents), a non-masterwork weapon, armor, shield, tool, or skill kit becomes its masterwork equivalent. Item crafting is outside the engine's combat model, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Mending",
|
||||
"level": 0,
|
||||
"school": "transmutation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "long",
|
||||
"effects": [],
|
||||
"description": "A cantrip: after 10 minutes, the spell repairs 1d4 hit points of damage to one object (up to 1 lb./level), removing the broken condition if restored to at least half HP. Will negates (harmless, object). Object repair is outside the engine's combat model, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Message",
|
||||
"level": 0,
|
||||
"school": "transmutation",
|
||||
"components": "V, S, F",
|
||||
"range": "medium",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "A cantrip: you whisper messages and receive replies with targeted creatures within range for 10 min/level; bystanders hear nothing without a DC 25 Perception check. Communication is not modeled by the engine, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "Mirror Image",
|
||||
"level": 2,
|
||||
"school": "illusion",
|
||||
"components": "V, S",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "blurred",
|
||||
"duration_rounds": 10,
|
||||
"duration_rounds_per_level": 10,
|
||||
"save_negates": false,
|
||||
"images": {
|
||||
"dice": "1d4",
|
||||
"per_levels": 3,
|
||||
"max": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/mirror-image.md: 1d4 illusory doubles plus one per three caster levels (maximum eight total) inhabit your space. The image count is rolled at cast time and folded into the engine's concealment machinery as a dynamic miss chance of images/(images+1) on the blurred carrier condition (an attack that would hit strikes a figment instead). Duration 1 min./level scaled as 10 rounds per caster level. Simplification: the figment-destruction track (a hit or a near miss by 5 or less destroys one image; area and no-attack-roll effects ignore them) is not modeled - the miss chance persists for the whole duration."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Oath of Anonymity",
|
||||
"level": 0,
|
||||
"school": "illusion",
|
||||
"components": "V",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "A cantrip: you swear an oath of secrecy - your voice, body language and gear are magically distorted, granting a +10 bonus on Disguise checks to conceal your identity (not to impersonate a specific person) for 10 min/level. Social skill effect only: the engine does not model skill-check modifiers, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"name": "Obscuring Mist",
|
||||
"level": 1,
|
||||
"school": "conjuration",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "area",
|
||||
"radius_ft": 20,
|
||||
"save_for_half": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "condition",
|
||||
"condition_name": "blurred",
|
||||
"duration_rounds": 10,
|
||||
"save_negates": false
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "A mist cloud spreads in a 20-ft radius from you for 1 min/level (approximated as 10 rounds): a creature 5 feet away has concealment (20% miss chance), farther away total concealment. Simplification: everyone in the area (allies included) gains the blurred 20% miss chance; the distance-scaled total concealment beyond 5 ft is not modeled."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Open/Close",
|
||||
"level": 0,
|
||||
"school": "transmutation",
|
||||
"components": "V, S, F",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "A cantrip: you open or close one unsecured object or portal weighing up to 30 lb. at up to 25 ft. away (fails if a bar or lock resists). Will negates (object). Object manipulation is not modeled by the engine, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"name": "Owl's Wisdom",
|
||||
"level": 2,
|
||||
"school": "transmutation",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "will", "value": 2, "bonus_type": "enhancement" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/owl-s-wisdom.md: the subject gains a +4 enhancement bonus to Wisdom for 1 min./level. The engine has no ability-score track, so the +4 Wis is encoded as its combat-visible consequence: a +2 enhancement bonus on Will saves (half of +4, as a score modifier feeds saves at half). Wisdom-based skills and spell DCs are not modeled. Will negates (harmless). Duration 1 min/level approximated as 10 rounds."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Prestidigitation",
|
||||
"level": 0,
|
||||
"school": "universal",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "SRD spells/prestidigitation.md: a cantrip - minor magical tricks for 1 hour; lift 1 lb. of material, color/clean/soil items in a 1-ft cube, chill/warm/flavor 1 lb. of nonliving material, or create crude trinkets. It deals no damage and duplicates no other spell. The SRD range is 10 ft. - the engine has no 10-ft category, so the closest usable category (close) is kept. No combat effect; the trivial manipulations are not modeled by the engine."
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "Protection from Evil",
|
||||
"level": 1,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "ac", "value": 2, "bonus_type": "deflection", "condition": "attacker_is_evil" },
|
||||
{ "target": "fort", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_evil" },
|
||||
{ "target": "ref", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_evil" },
|
||||
{ "target": "will", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_evil" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/protection-from-evil.md: a barrier wards the subject from evil for 1 min./level. The subject gains a +2 deflection bonus to AC and a +2 resistance bonus on saves - the exact SRD wording: \"+2 deflection bonus to AC and a +2 resistance bonus on saves against attacks or effects created by evil creatures\" - so both bonuses are gated on the attacker/caster alignment (condition attacker_is_evil) and never apply against a creature that is not evil. Will negates (harmless), spell resistance no. Duration 1 min/level approximated as 10 rounds (engine convention for 1-minute durations). Not modeled: the SRD's second effect (immediate renewed saving throw with a +2 morale bonus against mental-control spells and effects, suppression for the duration, immunity to new attempts) - the engine has no mental-control tracking to suppress; and the third effect (evil summoned creatures cannot touch the warded creature) - the engine has no summoned-subtype contact restriction."
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "Protection from Evil, Communal",
|
||||
"level": 2,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "ac", "value": 2, "bonus_type": "deflection", "condition": "attacker_is_evil" },
|
||||
{ "target": "fort", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_evil" },
|
||||
{ "target": "ref", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_evil" },
|
||||
{ "target": "will", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_evil" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/protection-from-evil-communal.md: functions like protection from evil - each touched creature gains the +2 deflection bonus to AC and +2 resistance bonus on saves against attacks or effects created by evil creatures (gated on the attacker/caster alignment via condition attacker_is_evil, never applying against a non-evil source). Will negates (harmless), spell resistance no. Not modeled: the SRD duration split - \"you divide the duration in 1-minute intervals among the creatures touched\" - the engine gives every touched creature the same fixed duration as protection from evil (1 min/level approximated as 10 rounds each) instead of draining one shared pool; and the mental-control suppression clause of the base spell (see protection_from_evil.json)."
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "Protection from Law",
|
||||
"level": 1,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "ac", "value": 2, "bonus_type": "deflection", "condition": "attacker_is_lawful" },
|
||||
{ "target": "fort", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_lawful" },
|
||||
{ "target": "ref", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_lawful" },
|
||||
{ "target": "will", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_lawful" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/protection-from-law.md: functions like protection from evil, except the deflection and resistance bonuses apply against lawful creatures - \"+2 deflection bonus to AC and a +2 resistance bonus on saves against attacks or effects created by lawful creatures\" - so both bonuses are gated on the attacker/caster alignment (condition attacker_is_lawful) and never apply against a creature that is not lawful. Will negates (harmless), spell resistance no. Duration 1 min/level approximated as 10 rounds (engine convention for 1-minute durations). Not modeled: the renewed saving throw against mental control by lawful creatures and the lawful summoned creature contact restriction (same gaps as protection from evil)."
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "Protection from Law, Communal",
|
||||
"level": 2,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "ac", "value": 2, "bonus_type": "deflection", "condition": "attacker_is_lawful" },
|
||||
{ "target": "fort", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_lawful" },
|
||||
{ "target": "ref", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_lawful" },
|
||||
{ "target": "will", "value": 2, "bonus_type": "resistance", "condition": "attacker_is_lawful" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/protection-from-law-communal.md: functions like protection from law - each touched creature gains the +2 deflection bonus to AC and +2 resistance bonus on saves against attacks or effects created by lawful creatures (gated on the attacker/caster alignment via condition attacker_is_lawful, never applying against a non-lawful source). Will negates (harmless), spell resistance no. Not modeled: the SRD duration split - \"you divide the duration in 1-minute intervals among the creatures touched\" - the engine gives every touched creature the same fixed duration as protection from law (1 min/level approximated as 10 rounds each) instead of draining one shared pool; and the mental-control suppression clause of the base spell (see protection_from_law.json)."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Purify Food and Drink",
|
||||
"level": 0,
|
||||
"school": "transmutation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "SRD spells/purify-food-and-drink.md: a cantrip - cleanses 1 cu. ft./level of spoiled, rotten, diseased or poisoned food and water (no effect on creatures or magic potions). Will negates (object). The SRD range is 10 ft. - the engine has no 10-ft category, so the closest usable category (close) is kept. Non-combat utility: the engine does not model objects, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Putrefy Food and Drink",
|
||||
"level": 0,
|
||||
"school": "transmutation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "SRD spells/putrefy-food-and-drink.md: a cantrip - instantly rots 1 cu. ft./level of edible food and makes water and liquids brackish and undrinkable (can also spoil a single potion; no effect on creatures or unholy water). Will negates (object). The SRD range is 10 ft. - the engine has no 10-ft category, so the closest usable category (close) is kept. Non-combat utility: the engine does not model objects, so the spell has no mechanical effects here."
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"name": "Ray of Enfeeblement",
|
||||
"level": 1,
|
||||
"school": "necromancy",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "fort",
|
||||
"base_dc": 10,
|
||||
"requires_ranged_touch": true,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "penalty",
|
||||
"formula": "1d6",
|
||||
"scaling_flat": { "amount": 1, "per_levels": 2, "max": 5 },
|
||||
"targets": ["attack", "damage"],
|
||||
"duration_rounds_per_level": 1,
|
||||
"half_on_save": true
|
||||
}
|
||||
],
|
||||
"description": "A coruscating ray strikes the target (ranged touch attack), dealing 1d6 points of Strength damage +1 per two caster levels (maximum 1d6+5); a successful Fortitude save halves the damage. Simplification: the engine has no ability-score track, so the Strength penalty is modeled as negative untyped modifiers on the attack and damage rolls (the two combat rolls Strength feeds) for 1 round per caster level; the SRD 'cannot drop below 1' floor and the non-stacking clause are not modeled."
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "Ray of Frost",
|
||||
"level": 0,
|
||||
"school": "evocation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"requires_ranged_touch": true,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "damage",
|
||||
"formula": "1d3",
|
||||
"types": ["cold"],
|
||||
"half_on_save": false
|
||||
}
|
||||
],
|
||||
"description": "A cantrip: a ray of freezing air and ice projects from your pointing finger. You must succeed on a ranged touch attack to deal 1d3 points of cold damage to the target. No save."
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "Read Magic",
|
||||
"level": 0,
|
||||
"school": "divination",
|
||||
"components": "V, S, F",
|
||||
"range": "personal",
|
||||
"save": "none",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [],
|
||||
"description": "A cantrip: you can decipher magical inscriptions on objects that would otherwise be unintelligible, at one page per minute, and you can thereafter read that particular writing without the spell. Duration 10 min./level. No combat effect; reading magical writing is not modeled by the engine."
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"name": "Resistance",
|
||||
"level": 0,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, M/DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"effects": [
|
||||
{
|
||||
"type": "buff",
|
||||
"modifiers": [
|
||||
{ "target": "fort", "value": 1, "bonus_type": "resistance" },
|
||||
{ "target": "ref", "value": 1, "bonus_type": "resistance" },
|
||||
{ "target": "will", "value": 1, "bonus_type": "resistance" }
|
||||
],
|
||||
"duration_rounds": 10
|
||||
}
|
||||
],
|
||||
"description": "SRD spells/resistance.md: a cantrip - the subject gains a +1 resistance bonus on saving throws for 1 minute. Will negates (harmless). Modeled as a BuffEffect granting +1 resistance to fort/ref/will for 10 rounds (1 minute); the resistance bonus type does not stack with itself, so a second Resistance (or a cloak of resistance) keeps the higher value. default_policy never casts it: cantrips have no spell slot, and _find_buff_spell skips spells the caster has no slot for, so Resistance cannot preempt a leveled buff (Divine Favor) in the known-spell order."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Restoration, Lesser",
|
||||
"level": 2,
|
||||
"school": "conjuration",
|
||||
"components": "V, S",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "long",
|
||||
"effects": [],
|
||||
"description": "Casting time 3 rounds. Dispels any magical effects reducing one of the subject's ability scores or cures 1d4 points of temporary ability damage to one ability score, and eliminates any fatigue (improving exhausted to fatigued). Will negates (harmless). No combat effect encoded: the engine has no ability damage, fatigue-from-spell, or magical-effect-reduction state to restore."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Sanctuary",
|
||||
"level": 1,
|
||||
"school": "abjuration",
|
||||
"components": "V, S, DF",
|
||||
"range": "touch",
|
||||
"save": "will",
|
||||
"base_dc": 10,
|
||||
"cast_time": "standard",
|
||||
"spell_resistance": false,
|
||||
"effects": [],
|
||||
"description": "You ward a creature against attacks for 1 round/level: any opponent attempting to directly attack the warded creature must succeed on a Will save or be unable to follow through with that attack and cannot directly attack the subject for the duration. The subject cannot attack without ending the spell. Will negates. No combat effect encoded: the engine has no attack-refusal-by-save mechanic, so the protection cannot be represented."
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Saving Finale",
|
||||
"level": 1,
|
||||
"school": "evocation",
|
||||
"components": "V, S",
|
||||
"range": "close",
|
||||
"save": "will",
|
||||
"harmless": true,
|
||||
"base_dc": 10,
|
||||
"cast_time": "immediate",
|
||||
"effects": [],
|
||||
"description": "SRD spells/saving-finale.md: immediate action, requires an active bardic performance - when a creature affected by your bardic performance fails a saving throw, end the performance to let it immediately reroll the failed save and take the new result. Will negates (harmless). Deferred: rerolling an already-resolved save needs a post-save reaction hook plus a bardic-performance resource gate (the engine's saves are one-shot resolutions with no reroll window), a cross-cutting redesign. No combat effect encoded; the immediate casting time is kept for data fidelity."
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user