From eda9b77f46b5d3579577e907547413afdbaf05ef Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Wed, 29 Apr 2026 22:21:41 +0200 Subject: [PATCH] Avec initiative --- analyze_compendium.py | 330 -------- analyze_compendium2.py | 213 ----- analyze_compendium3.py | 317 ------- analyze_final.py | 306 ------- compendium-issues.json | 1794 ---------------------------------------- compendium-issues.txt | 1573 ----------------------------------- 6 files changed, 4533 deletions(-) delete mode 100644 analyze_compendium.py delete mode 100644 analyze_compendium2.py delete mode 100644 analyze_compendium3.py delete mode 100644 analyze_final.py delete mode 100644 compendium-issues.json delete mode 100644 compendium-issues.txt diff --git a/analyze_compendium.py b/analyze_compendium.py deleted file mode 100644 index ec07abe..0000000 --- a/analyze_compendium.py +++ /dev/null @@ -1,330 +0,0 @@ -#!/usr/bin/env python3 -"""Analyze all JSON files in packs-src/ for text quality issues.""" - -import json -import os -import re -import sys -from pathlib import Path -from html.parser import HTMLParser - -BASE = Path("/home/morr/work/uberwald/fvtt-chroniques-de-l-etrange") -PACKS = BASE / "packs-src" -REGLES = BASE / "regles.txt" - -# Load PDF text -pdf_lines = REGLES.read_text(encoding="utf-8").splitlines() -pdf_text = REGLES.read_text(encoding="utf-8") - -issues = [] - -# ---------- helpers ---------- - -def strip_html(html): - """Remove HTML tags and return plain text.""" - return re.sub(r'<[^>]+>', '', html or '') - -def check_unclosed_tags(html): - """Returns list of unclosed/mismatched tags.""" - open_tags = re.findall(r'<([a-zA-Z][a-zA-Z0-9]*)[^>]*>', html) - close_tags = re.findall(r'', html) - issues_found = [] - # basic: count opens vs closes for block-level tags - for tag in ['ul', 'ol', 'li', 'p', 'div', 'strong', 'em', 'b', 'i']: - opens = open_tags.count(tag) - closes = close_tags.count(tag) - if opens != closes: - issues_found.append(f"<{tag}>: {opens} open, {closes} close") - return issues_found - -def has_bad_newlines(html): - """Check for literal \\n inside HTML strings that would render as bad breaks.""" - # In JSON, \n is a newline. In HTML strings, raw newlines can be bad. - return '\n' in html - -def looks_truncated(text): - """Heuristics for truncation - text ends without proper punctuation.""" - if not text: - return False - plain = strip_html(text).strip() - if not plain: - return False - # ends without sentence-ending punctuation - if plain and plain[-1] not in '.!?»)': - return True - return False - -def looks_truncated_strict(text): - """Stricter: ends mid-word or mid-sentence.""" - if not text: - return False - plain = strip_html(text).strip() - if not plain: - return False - # ends mid-word (no space before end, no punctuation) - last_char = plain[-1] if plain else '' - if last_char.isalpha() or last_char in ',;:-(': - return True - return False - -def get_field(data, path): - """Get nested field value by dot-path.""" - parts = path.split('.') - cur = data - for p in parts: - if isinstance(cur, dict): - cur = cur.get(p) - else: - return None - if cur is None: - return None - return cur - -def search_pdf(keyword, context=300): - """Search PDF text for a keyword and return surrounding context.""" - # clean keyword for searching - kw = re.sub(r'<[^>]+>', '', keyword).strip() - if len(kw) < 10: - return None - # take last 30 chars of plain text as search key - search_key = kw[-30:].strip() - # normalize whitespace - search_key_norm = re.sub(r'\s+', ' ', search_key) - - # Try to find in PDF - idx = pdf_text.find(search_key_norm) - if idx == -1: - # try shorter - search_key_norm = re.sub(r'\s+', ' ', kw[-20:].strip()) - idx = pdf_text.find(search_key_norm) - if idx == -1: - # try even shorter - search_key_norm = re.sub(r'\s+', ' ', kw[-15:].strip()) - idx = pdf_text.find(search_key_norm) - - if idx == -1: - return None - - start = max(0, idx - 50) - end = min(len(pdf_text), idx + len(search_key_norm) + context) - return pdf_text[start:end].replace('\n', ' ') - -def get_all_html_fields(data, prefix=""): - """Recursively yield (field_path, value) for all string fields containing HTML.""" - if isinstance(data, dict): - for k, v in data.items(): - path = f"{prefix}.{k}" if prefix else k - if isinstance(v, str) and ('<' in v or len(v) > 50): - yield path, v - elif isinstance(v, (dict, list)): - yield from get_all_html_fields(v, path) - elif isinstance(data, list): - for i, v in enumerate(data): - yield from get_all_html_fields(v, f"{prefix}[{i}]") - -# ---------- fields to check ---------- - -IMPORTANT_FIELDS = [ - "system.description", - "system.effects", - "system.examples", - "system.components", - "system.notes", - "system.style", - "system.techniques.technique1.technique", - "system.techniques.technique2.technique", - "system.techniques.technique3.technique", -] - -# ---------- main scan ---------- - -json_files = sorted(PACKS.rglob("*.json")) -print(f"Scanning {len(json_files)} JSON files...", flush=True) - -for jf in json_files: - rel = str(jf.relative_to(PACKS)) - try: - data = json.loads(jf.read_text(encoding="utf-8")) - except json.JSONDecodeError as e: - issues.append({ - "file": rel, - "field": "(file)", - "issue": "json_parse_error", - "current_text": str(e), - "correct_continuation": None, - }) - continue - - item_name = data.get("name", "(unnamed)") - - # Check all relevant fields - for field in IMPORTANT_FIELDS: - val = get_field(data, field) - if not val or not isinstance(val, str): - continue - - plain = strip_html(val).strip() - - # 1. Check truncation (strict) - if looks_truncated_strict(val): - pdf_context = search_pdf(val) - issues.append({ - "file": rel, - "field": field, - "issue": "truncated", - "item_name": item_name, - "current_end": f"...{plain[-100:]}", - "current_full_preview": f"{plain[:200]}", - "correct_continuation": pdf_context, - }) - - # 2. Check bad newlines in HTML strings - if has_bad_newlines(val): - issues.append({ - "file": rel, - "field": field, - "issue": "unwanted_newlines", - "item_name": item_name, - "current_text": val[:300], - "correct_continuation": None, - }) - - # 3. Check malformed HTML - html_errors = check_unclosed_tags(val) - if html_errors: - issues.append({ - "file": rel, - "field": field, - "issue": "malformed_html", - "item_name": item_name, - "html_errors": html_errors, - "current_text": val[:300], - "correct_continuation": None, - }) - - # 4. Check system.style (plain text field, can also be truncated) - style_val = get_field(data, "system.style") - if style_val and isinstance(style_val, str): - plain_style = style_val.strip() - if plain_style and plain_style[-1] not in '.!?»)': - pdf_context = search_pdf(plain_style) - issues.append({ - "file": rel, - "field": "system.style", - "issue": "truncated", - "item_name": item_name, - "current_end": f"...{plain_style[-100:]}", - "current_full_preview": f"{plain_style[:200]}", - "correct_continuation": pdf_context, - }) - - # 5. Bleeding content: look for HTML tags in non-HTML fields - for field in ["system.style", "system.reference", "system.speciality"]: - val = get_field(data, field) - if val and isinstance(val, str) and '<' in val: - issues.append({ - "file": rel, - "field": field, - "issue": "html_in_plain_field", - "item_name": item_name, - "current_text": val[:300], - "correct_continuation": None, - }) - - # 6. Check for text outside HTML tags in description-like fields (bleeding) - for field in ["system.description", "system.effects", "system.examples", "system.components", "system.notes"]: - val = get_field(data, field) - if not val or not isinstance(val, str): - continue - # Strip all HTML and check if leading text is outside tags - # e.g., "

foo

some leaked text

bar

" - # Check if there's text before the first tag - stripped = val.strip() - if stripped and not stripped.startswith('<'): - issues.append({ - "file": rel, - "field": field, - "issue": "text_outside_html_tags", - "item_name": item_name, - "current_text": val[:300], - "correct_continuation": None, - }) - - # 7. Check technique fields for bleeding (multiple paragraphs that shouldn't be there) - for tkey in ["technique1", "technique2", "technique3"]: - tech = get_field(data, f"system.techniques.{tkey}") - if not tech: - continue - tech_text = tech.get("technique", "") - if tech_text: - plain = strip_html(tech_text).strip() - # Check for suspiciously long techniques that might have bled content - # Techniques with multiple

blocks may be fine, but flag very long ones - p_count = tech_text.count('

') - if p_count > 3: - issues.append({ - "file": rel, - "field": f"system.techniques.{tkey}.technique", - "issue": "possible_bleeding_content", - "item_name": item_name, - "paragraph_count": p_count, - "current_text": tech_text[:400], - "correct_continuation": None, - }) - -print(f"Found {len(issues)} potential issues.", flush=True) - -# ---------- output ---------- - -out_json = BASE / "compendium-issues.json" -out_txt = BASE / "compendium-issues.txt" - -with open(out_json, 'w', encoding='utf-8') as f: - json.dump(issues, f, ensure_ascii=False, indent=2) - -# Group by issue type for summary -from collections import defaultdict -by_type = defaultdict(list) -by_file = defaultdict(list) -for issue in issues: - by_type[issue['issue']].append(issue) - by_file[issue['file']].append(issue) - -with open(out_txt, 'w', encoding='utf-8') as f: - f.write("=" * 80 + "\n") - f.write("COMPENDIUM TEXT QUALITY REPORT\n") - f.write("Les Chroniques de l'Étrange — FoundryVTT\n") - f.write("=" * 80 + "\n\n") - - f.write(f"Total files scanned: {len(json_files)}\n") - f.write(f"Total issues found: {len(issues)}\n\n") - - f.write("SUMMARY BY ISSUE TYPE:\n") - for itype, ilist in sorted(by_type.items()): - f.write(f" {itype}: {len(ilist)}\n") - f.write("\n") - - f.write("=" * 80 + "\n") - f.write("DETAILED ISSUES BY FILE\n") - f.write("=" * 80 + "\n\n") - - for fpath in sorted(by_file.keys()): - f.write(f"\n--- {fpath} ---\n") - for issue in by_file[fpath]: - f.write(f" FIELD: {issue['field']}\n") - f.write(f" ISSUE: {issue['issue']}\n") - if issue.get('item_name'): - f.write(f" ITEM: {issue['item_name']}\n") - if issue.get('current_end'): - f.write(f" END: {issue['current_end']}\n") - if issue.get('current_full_preview'): - f.write(f" TEXT: {issue['current_full_preview'][:200]}\n") - if issue.get('current_text'): - f.write(f" TEXT: {issue['current_text'][:200]}\n") - if issue.get('html_errors'): - f.write(f" HTML ERRORS: {issue['html_errors']}\n") - if issue.get('correct_continuation'): - f.write(f" PDF: {issue['correct_continuation'][:300]}\n") - f.write("\n") - -print(f"Reports written to:\n {out_json}\n {out_txt}", flush=True) diff --git a/analyze_compendium2.py b/analyze_compendium2.py deleted file mode 100644 index 6b5a8a7..0000000 --- a/analyze_compendium2.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/env python3 -import json, re -from pathlib import Path -from collections import defaultdict - -BASE = Path("/home/morr/work/uberwald/fvtt-chroniques-de-l-etrange") -PACKS = BASE / "packs-src" -pdf_text = (BASE / "regles.txt").read_text(encoding="utf-8") - -WATERMARK_RE = re.compile( - r's\s*c\s*r\s*a\s*l\s*e\s*l|les\s+chroniqu|de\s+l.etrange|chr.niqu|hr\s+ng', - re.IGNORECASE) - -def strip_html(html): - return re.sub(r'<[^>]+>', '', html or '').strip() - -def has_watermark_bleed(text): - plain = strip_html(text) - return bool(WATERMARK_RE.search(plain)) - -def has_bad_newlines(text): - lines = text.split('\n') - if len(lines) <= 1: - return False - for line in lines: - s = line.strip() - if s and not re.match(r'^<[/a-zA-Z]', s) and not s.endswith('>') and len(s) > 3: - return True - return False - -def looks_truncated(text): - if not text: - return False - plain = strip_html(text).strip() - plain_clean = re.sub(r'\s+[a-z]\s+[a-z]\s+[a-z]{1,2}\s+.*$', '', plain).strip() - if not plain_clean: - plain_clean = plain - last = plain_clean[-1] if plain_clean else '' - return last.isalpha() or last in ',;:-(' - -def get_field(data, path): - parts = path.split('.') - cur = data - for p in parts: - if isinstance(cur, dict): - cur = cur.get(p) - else: - return None - if cur is None: - return None - return cur - -def pdf_search(keyword_text, context=500): - plain = strip_html(keyword_text) - plain = re.sub(r'\s+[a-z]\s+[a-z]\s+[a-z]{1,2}\s+.*$', '', plain).strip() - if len(plain) < 15: - return None - for suffix_len in [40, 30, 20, 15]: - suffix = re.sub(r'\s+', ' ', plain[-suffix_len:]).strip() - if len(suffix) < 10: - continue - idx = pdf_text.find(suffix) - if idx != -1: - snippet = pdf_text[idx:min(len(pdf_text), idx + len(suffix) + context)] - snippet = re.sub(r'\n+', ' ', snippet) - snippet = re.sub(r'\s{3,}', ' ', snippet) - return snippet[:600] - return None - -issues = [] -all_files = sorted(PACKS.rglob("*.json")) -print(f"Scanning {len(all_files)} files...", flush=True) - -HTML_FIELDS = [ - "system.description", - "system.effects", - "system.examples", - "system.components", - "system.notes", - "system.techniques.technique1.technique", - "system.techniques.technique2.technique", - "system.techniques.technique3.technique", -] -PLAIN_FIELDS = ["system.style"] - -for jf in sorted(all_files): - rel = str(jf.relative_to(PACKS)) - try: - data = json.loads(jf.read_text(encoding="utf-8")) - except Exception as e: - issues.append({"file": rel, "field": "(file)", "issue": "json_error", - "item_name": "?", "current_text": str(e)}) - continue - - name = data.get("name", "?") - - def add_issue(field, issue_type, **kwargs): - issues.append({"file": rel, "field": field, "issue": issue_type, - "item_name": name, **kwargs}) - - for field in HTML_FIELDS + PLAIN_FIELDS: - val = get_field(data, field) - if not val or not isinstance(val, str) or not val.strip(): - continue - plain = strip_html(val).strip() - - if has_watermark_bleed(val): - pdf_ctx = pdf_search(val) - add_issue(field, "bleeding_watermark", - current_text=val[:400], - plain_text=plain[:300], - pdf_context=pdf_ctx) - - elif looks_truncated(val): - is_ingredient = 'cde-ingredients' in rel - if is_ingredient and len(plain) < 30: - add_issue(field, "truncated_or_short", - current_text=plain, - note="May be legitimate (ingredient quantity)", - pdf_context=pdf_search(plain)) - else: - pdf_ctx = pdf_search(val) - add_issue(field, "truncated", - current_end=plain[-120:], - current_preview=plain[:200], - pdf_context=pdf_ctx) - - if has_bad_newlines(val): - add_issue(field, "unwanted_newlines", - current_text=val[:400], - plain_text=plain[:300]) - - for tkey in ['technique1', 'technique2', 'technique3']: - tech = get_field(data, f"system.techniques.{tkey}") - if not tech: - continue - t_text = tech.get("technique", "") - if not t_text: - continue - plain_t = strip_html(t_text) - activation_count = plain_t.count("Activation :") - if activation_count > 1: - add_issue(f"system.techniques.{tkey}.technique", - "bleeding_multiple_techniques", - activation_count=activation_count, - current_text=t_text[:500], - note=f"{activation_count} 'Activation :' markers found") - if ("Style" in plain_t or "Orientation :" in plain_t) and len(plain_t) > 300: - add_issue(f"system.techniques.{tkey}.technique", - "bleeding_style_or_orientation", - current_text=t_text[:500], - note="Contains 'Style' or 'Orientation' markers inside technique text") - -print(f"Found {len(issues)} issues.", flush=True) - -out_json = BASE / "compendium-issues.json" -out_txt = BASE / "compendium-issues.txt" - -with open(out_json, 'w', encoding='utf-8') as f: - json.dump(issues, f, ensure_ascii=False, indent=2) - -by_type = defaultdict(list) -by_file = defaultdict(list) -for iss in issues: - by_type[iss['issue']].append(iss) - by_file[iss['file']].append(iss) - -with open(out_txt, 'w', encoding='utf-8') as f: - w = f.write - w("=" * 80 + "\n") - w("COMPENDIUM TEXT QUALITY REPORT\n") - w("Les Chroniques de l'Etrange — FoundryVTT\n") - w("=" * 80 + "\n\n") - w(f"Files scanned: {len(all_files)}\n") - w(f"Files with issues: {len(by_file)}\n") - w(f"Total issues: {len(issues)}\n\n") - w("SUMMARY BY ISSUE TYPE:\n") - for itype, ilist in sorted(by_type.items(), key=lambda x: -len(x[1])): - w(f" {itype:50s} {len(ilist):3d}\n") - w("\nFILES WITH ISSUES:\n") - for fpath in sorted(by_file.keys()): - types = sorted(set(i['issue'] for i in by_file[fpath])) - w(f" {fpath} [{', '.join(types)}]\n") - w("\n") - w("=" * 80 + "\n") - w("DETAILED ISSUES\n") - w("=" * 80 + "\n") - for itype in ['bleeding_watermark', 'bleeding_multiple_techniques', - 'bleeding_style_or_orientation', 'truncated', - 'unwanted_newlines', 'truncated_or_short']: - ilist = by_type.get(itype, []) - if not ilist: - continue - w(f"\n{'─'*80}\n") - w(f"ISSUE TYPE: {itype} ({len(ilist)} occurrences)\n") - w(f"{'─'*80}\n") - for iss in ilist: - w(f"\n File: {iss['file']}\n") - w(f" Item: {iss.get('item_name','?')}\n") - w(f" Field: {iss['field']}\n") - if iss.get('note'): - w(f" Note: {iss['note']}\n") - if iss.get('current_end'): - w(f" Ends: ...{iss['current_end']}\n") - if iss.get('current_preview'): - w(f" Text: {iss['current_preview'][:200]}\n") - if iss.get('current_text'): - ct = iss['current_text'] - w(f" Text: {ct[:300]}\n") - if iss.get('pdf_context'): - w(f" PDF>>: {iss['pdf_context'][:400]}\n") - -print(f"Written: {out_json}\n {out_txt}", flush=True) diff --git a/analyze_compendium3.py b/analyze_compendium3.py deleted file mode 100644 index 92bcbc2..0000000 --- a/analyze_compendium3.py +++ /dev/null @@ -1,317 +0,0 @@ -#!/usr/bin/env python3 -"""Final comprehensive analysis including missing beginnings and garbled content.""" - -import json, re -from pathlib import Path -from collections import defaultdict - -BASE = Path("/home/morr/work/uberwald/fvtt-chroniques-de-l-etrange") -PACKS = BASE / "packs-src" -pdf_text = (BASE / "regles.txt").read_text(encoding="utf-8") - -WATERMARK_RE = re.compile( - r's\s*c\s*r\s*a\s*l\s*e\s*l|les\s+chroniqu|de\s+l.etrange|chr.niqu|hr\s+ng', - re.IGNORECASE) - -def strip_html(html): - return re.sub(r'<[^>]+>', '', html or '').strip() - -def has_watermark_bleed(text): - plain = strip_html(text) - return bool(WATERMARK_RE.search(plain)) - -def has_bad_newlines(text): - lines = text.split('\n') - if len(lines) <= 1: - return False - for line in lines: - s = line.strip() - if s and not re.match(r'^<[/a-zA-Z]', s) and not s.endswith('>') and len(s) > 3: - return True - return False - -def looks_truncated(text): - """Text appears cut off at the end.""" - if not text: - return False - plain = strip_html(text).strip() - plain_clean = re.sub(r'\s+[a-z]\s+[a-z]\s+[a-z]{1,2}\s+.*$', '', plain).strip() - if not plain_clean: - plain_clean = plain - last = plain_clean[-1] if plain_clean else '' - return last.isalpha() or last in ',;:-(' - -def looks_missing_beginning(text): - """Text starts mid-sentence (lowercase, or starts with punctuation).""" - if not text: - return False - plain = strip_html(text).strip() - if not plain: - return False - first_char = plain[0] - # Starts with lowercase letter (unlikely to be intentional) - if first_char.islower(): - return True - # Starts with a bullet/list item that makes no sense - if re.match(r'^(et|ou|de|du|des|les|la|le|un|une|à|au|aux|mais|car|si|que)\s', plain, re.IGNORECASE): - return True - return False - -def is_garbled_page_layout(text): - """Detects when text is broken into single-letter paragraphs (PDF artifact).""" - # Pattern: multiple single-letter

tags = garbled page layout - single_p = re.findall(r'

([a-zA-Z0-9])

', text) - if len(single_p) >= 5: - return True - return False - -def get_field(data, path): - parts = path.split('.') - cur = data - for p in parts: - if isinstance(cur, dict): - cur = cur.get(p) - else: - return None - if cur is None: - return None - return cur - -def pdf_search(keyword_text, context=500): - """Search PDF text after the given keyword.""" - plain = strip_html(keyword_text) - plain = re.sub(r'\s+[a-z]\s+[a-z]\s+[a-z]{1,2}\s+.*$', '', plain).strip() - if len(plain) < 15: - return None - for suffix_len in [40, 30, 20, 15]: - suffix = re.sub(r'\s+', ' ', plain[-suffix_len:]).strip() - if len(suffix) < 10: - continue - idx = pdf_text.find(suffix) - if idx != -1: - snippet = pdf_text[idx:min(len(pdf_text), idx + len(suffix) + context)] - snippet = re.sub(r'\n+', ' ', snippet) - snippet = re.sub(r'\s{3,}', ' ', snippet) - return snippet[:600] - return None - -def pdf_search_forward(keyword_text, context=500): - """Search PDF text BEFORE the start of the given text (find what precedes it).""" - plain = strip_html(keyword_text) - plain = re.sub(r'\s+', ' ', plain[:60]).strip() - if len(plain) < 15: - return None - # Search for the prefix - for prefix_len in [50, 40, 30, 20]: - prefix = re.sub(r'\s+', ' ', plain[:prefix_len]).strip() - if len(prefix) < 10: - continue - idx = pdf_text.find(prefix) - if idx != -1: - # Get text before this position - start = max(0, idx - context) - snippet = pdf_text[start:idx + len(prefix)] - snippet = re.sub(r'\n+', ' ', snippet) - snippet = re.sub(r'\s{3,}', ' ', snippet) - return snippet[-400:] - return None - -issues = [] -all_files = sorted(PACKS.rglob("*.json")) -print(f"Scanning {len(all_files)} files...", flush=True) - -HTML_FIELDS = [ - "system.description", - "system.effects", - "system.examples", - "system.components", - "system.notes", - "system.techniques.technique1.technique", - "system.techniques.technique2.technique", - "system.techniques.technique3.technique", -] -PLAIN_FIELDS = ["system.style"] - -for jf in sorted(all_files): - rel = str(jf.relative_to(PACKS)) - try: - data = json.loads(jf.read_text(encoding="utf-8")) - except Exception as e: - issues.append({"file": rel, "field": "(file)", "issue": "json_error", - "item_name": "?", "current_text": str(e)}) - continue - - name = data.get("name", "?") - - def add_issue(field, issue_type, **kwargs): - issues.append({"file": rel, "field": field, "issue": issue_type, - "item_name": name, **kwargs}) - - for field in HTML_FIELDS + PLAIN_FIELDS: - val = get_field(data, field) - if not val or not isinstance(val, str) or not val.strip(): - continue - plain = strip_html(val).strip() - - # --- Garbled page layout --- - if is_garbled_page_layout(val): - add_issue(field, "garbled_page_layout", - current_text=val[:400], - note="Text broken into single-character

tags — PDF layout artifact") - continue # other checks not useful - - # --- Watermark bleeding --- - if has_watermark_bleed(val): - pdf_ctx = pdf_search(val) - add_issue(field, "bleeding_watermark", - current_text=val[:400], - plain_text=plain[:300], - pdf_context=pdf_ctx) - - # --- Missing beginning --- - if looks_missing_beginning(val): - pdf_ctx = pdf_search_forward(val) - add_issue(field, "missing_beginning", - current_start=plain[:150], - pdf_context_before=pdf_ctx) - - # --- Truncation --- - if looks_truncated(val): - is_ingredient = 'cde-ingredients' in rel - if is_ingredient and len(plain) < 30: - add_issue(field, "truncated_or_short", - current_text=plain, - note="May be legitimate (ingredient quantity/name)") - else: - pdf_ctx = pdf_search(val) - add_issue(field, "truncated", - current_end=plain[-120:], - current_preview=plain[:200], - pdf_context=pdf_ctx) - - # --- Unwanted newlines --- - if has_bad_newlines(val): - add_issue(field, "unwanted_newlines", - current_text=val[:400], - plain_text=plain[:300]) - - # --- Technique-level checks --- - for tkey in ['technique1', 'technique2', 'technique3']: - tech = get_field(data, f"system.techniques.{tkey}") - if not tech: - continue - t_text = tech.get("technique", "") - if not t_text: - continue - plain_t = strip_html(t_text) - activation_count = plain_t.count("Activation :") - if activation_count > 1: - add_issue(f"system.techniques.{tkey}.technique", - "bleeding_multiple_techniques", - activation_count=activation_count, - current_text=t_text[:500], - note=f"{activation_count} 'Activation :' markers — multiple techniques merged") - if ("Style" in plain_t or "Orientation :" in plain_t) and len(plain_t) > 300: - add_issue(f"system.techniques.{tkey}.technique", - "bleeding_style_or_orientation", - current_text=t_text[:500], - note="Contains 'Style' or 'Orientation' markers — extra text from page layout") - -print(f"Found {len(issues)} issues.", flush=True) - -# Deduplicate (same file+field+issue_type) -seen = set() -deduped = [] -for iss in issues: - key = (iss['file'], iss['field'], iss['issue']) - if key not in seen: - seen.add(key) - deduped.append(iss) -issues = deduped -print(f"After dedup: {len(issues)} issues.", flush=True) - -out_json = BASE / "compendium-issues.json" -out_txt = BASE / "compendium-issues.txt" - -with open(out_json, 'w', encoding='utf-8') as f: - json.dump(issues, f, ensure_ascii=False, indent=2) - -by_type = defaultdict(list) -by_file = defaultdict(list) -for iss in issues: - by_type[iss['issue']].append(iss) - by_file[iss['file']].append(iss) - -PRIORITY_ORDER = [ - 'garbled_page_layout', - 'missing_beginning', - 'bleeding_watermark', - 'bleeding_multiple_techniques', - 'bleeding_style_or_orientation', - 'truncated', - 'unwanted_newlines', - 'truncated_or_short', -] - -with open(out_txt, 'w', encoding='utf-8') as f: - w = f.write - w("=" * 80 + "\n") - w("COMPENDIUM TEXT QUALITY REPORT\n") - w("Les Chroniques de l'Etrange — FoundryVTT\n") - w("=" * 80 + "\n\n") - w(f"Files scanned: {len(all_files)}\n") - w(f"Files with issues: {len(by_file)}\n") - w(f"Total issues: {len(issues)}\n\n") - - w("SUMMARY BY ISSUE TYPE:\n") - for itype in PRIORITY_ORDER: - ilist = by_type.get(itype, []) - if ilist: - w(f" {itype:50s} {len(ilist):3d}\n") - other_types = set(by_type.keys()) - set(PRIORITY_ORDER) - for itype in sorted(other_types): - ilist = by_type.get(itype, []) - if ilist: - w(f" {itype:50s} {len(ilist):3d}\n") - w("\n") - - w("FILES WITH ISSUES:\n") - for fpath in sorted(by_file.keys()): - types = sorted(set(i['issue'] for i in by_file[fpath])) - w(f" {fpath}\n [{', '.join(types)}]\n") - w("\n") - - w("=" * 80 + "\n") - w("DETAILED ISSUES (by priority)\n") - w("=" * 80 + "\n") - - for itype in PRIORITY_ORDER + sorted(set(by_type.keys()) - set(PRIORITY_ORDER)): - ilist = by_type.get(itype, []) - if not ilist: - continue - w(f"\n{'─'*80}\n") - w(f"ISSUE TYPE: {itype} ({len(ilist)} occurrences)\n") - w(f"{'─'*80}\n") - for iss in ilist: - w(f"\n File: {iss['file']}\n") - w(f" Item: {iss.get('item_name','?')}\n") - w(f" Field: {iss['field']}\n") - if iss.get('note'): - w(f" Note: {iss['note']}\n") - if iss.get('current_start'): - w(f" Starts: {iss['current_start'][:150]}\n") - if iss.get('current_end'): - w(f" Ends: ...{iss['current_end']}\n") - if iss.get('current_preview'): - w(f" Text: {iss['current_preview'][:200]}\n") - if iss.get('current_text'): - ct = iss['current_text'] - w(f" Text: {ct[:300]}\n") - if iss.get('plain_text'): - w(f" Plain: {iss['plain_text'][:200]}\n") - if iss.get('pdf_context'): - w(f" PDF>>: {iss['pdf_context'][:400]}\n") - if iss.get('pdf_context_before'): - w(f" <]+>', '', html or '').strip() - -def has_watermark_bleed(text): - plain = strip_html(text) - return bool(WATERMARK_RE.search(plain)) - -def has_bad_newlines(text): - lines = text.split('\n') - if len(lines) <= 1: - return False - for line in lines: - s = line.strip() - if s and not re.match(r'^<[/a-zA-Z]', s) and not s.endswith('>') and len(s) > 3: - return True - return False - -def looks_truncated(text): - """Text appears cut off at the end.""" - if not text: - return False - plain = strip_html(text).strip() - if not plain: - return False - # Remove watermark garbage from end before checking - plain_clean = re.sub(r'\s+[a-z]\s+[a-z]\s+[a-z]{1,2}\s+.*$', '', plain).strip() - if not plain_clean: - return False # FIX: was using original empty plain, now correctly returns False - last = plain_clean[-1] - return last.isalpha() or last in ',;:-(' - -def looks_missing_beginning(text): - """Text starts mid-sentence (truly lowercase first char only).""" - if not text: - return False - plain = strip_html(text).strip() - if not plain: - return False - # Only flag if truly starts lowercase (not French articles/prepositions) - first_char = plain[0] - return first_char.islower() - -def is_garbled_page_layout(text): - """Multiple single-letter

tags = garbled PDF artifact.""" - single_p = re.findall(r'

([a-zA-Z0-9])

', text) - return len(single_p) >= 5 - -def get_field(data, path): - parts = path.split('.') - cur = data - for p in parts: - if isinstance(cur, dict): - cur = cur.get(p) - else: - return None - if cur is None: - return None - return cur - -def pdf_search_after(keyword_text, context=500): - """Return PDF text after the given keyword.""" - plain = strip_html(keyword_text) - plain = re.sub(r'\s+[a-z]\s+[a-z]\s+[a-z]{1,2}\s+.*$', '', plain).strip() - if len(plain) < 15: - return None - for suffix_len in [40, 30, 20, 15]: - suffix = re.sub(r'\s+', ' ', plain[-suffix_len:]).strip() - if len(suffix) < 10: - continue - idx = pdf_text.find(suffix) - if idx != -1: - snippet = pdf_text[idx:min(len(pdf_text), idx + len(suffix) + context)] - snippet = re.sub(r'\n+', ' ', snippet) - snippet = re.sub(r'\s{3,}', ' ', snippet) - return snippet[:600] - return None - -def pdf_search_before(keyword_text, context=400): - """Return PDF text before the given keyword.""" - plain = strip_html(keyword_text) - plain_start = re.sub(r'\s+', ' ', plain[:60]).strip() - if len(plain_start) < 15: - return None - for prefix_len in [50, 40, 30, 20]: - prefix = re.sub(r'\s+', ' ', plain_start[:prefix_len]).strip() - if len(prefix) < 10: - continue - idx = pdf_text.find(prefix) - if idx != -1: - start = max(0, idx - context) - snippet = pdf_text[start:idx + len(prefix)] - snippet = re.sub(r'\n+', ' ', snippet) - snippet = re.sub(r'\s{3,}', ' ', snippet) - return snippet[-400:] - return None - -issues = [] -all_files = sorted(PACKS.rglob("*.json")) -print(f"Scanning {len(all_files)} files...", flush=True) - -HTML_FIELDS = [ - "system.description", - "system.effects", - "system.examples", - "system.components", - "system.notes", - "system.techniques.technique1.technique", - "system.techniques.technique2.technique", - "system.techniques.technique3.technique", -] -PLAIN_FIELDS = ["system.style"] - -for jf in sorted(all_files): - rel = str(jf.relative_to(PACKS)) - try: - data = json.loads(jf.read_text(encoding="utf-8")) - except Exception as e: - issues.append({"file": rel, "field": "(file)", "issue": "json_error", - "item_name": "?", "current_text": str(e)}) - continue - - name = data.get("name", "?") - - def add(field, issue_type, **kwargs): - issues.append({"file": rel, "field": field, "issue": issue_type, - "item_name": name, **kwargs}) - - for field in HTML_FIELDS + PLAIN_FIELDS: - val = get_field(data, field) - if not val or not isinstance(val, str) or not val.strip(): - continue - plain = strip_html(val).strip() - - # Garbled page layout (skip other checks) - if is_garbled_page_layout(val): - add(field, "garbled_page_layout", - current_text=val[:400], - note="Text broken into single-character

tags — PDF layout artifact") - continue - - # Watermark bleeding - if has_watermark_bleed(val): - add(field, "bleeding_watermark", - current_text=val[:400], - plain_text=plain[:300], - pdf_context=pdf_search_after(val)) - - # Missing beginning (only truly lowercase-starting) - if looks_missing_beginning(val): - add(field, "missing_beginning", - current_start=plain[:150], - pdf_context_before=pdf_search_before(val)) - - # Truncation - if looks_truncated(val): - # Skip empty ingredient placeholders - is_ingredient = 'cde-ingredients' in rel - if is_ingredient: - # Only flag if there's actually short meaningful text - if plain and len(plain) < 30: - add(field, "empty_or_short_ingredient", - current_text=plain, - note="Short ingredient description — check if intentional") - else: - add(field, "truncated", - current_end=plain[-120:], - current_preview=plain[:200], - pdf_context=pdf_search_after(val)) - - # Unwanted newlines - if has_bad_newlines(val): - add(field, "unwanted_newlines", - current_text=val[:400], - plain_text=plain[:200]) - - # Technique cross-checks - for tkey in ['technique1', 'technique2', 'technique3']: - tech = get_field(data, f"system.techniques.{tkey}") - if not tech: - continue - t_text = tech.get("technique", "") - if not t_text: - continue - plain_t = strip_html(t_text) - activation_count = plain_t.count("Activation :") - if activation_count > 1: - add(f"system.techniques.{tkey}.technique", - "bleeding_multiple_techniques", - activation_count=activation_count, - current_text=t_text[:500], - note=f"{activation_count} 'Activation :' markers — multiple techniques merged") - if ("Style" in plain_t or "Orientation :" in plain_t) and len(plain_t) > 300: - already = any(i['file'] == rel and i['field'] == f"system.techniques.{tkey}.technique" - and i['issue'] == 'bleeding_style_or_orientation' for i in issues) - if not already: - add(f"system.techniques.{tkey}.technique", - "bleeding_style_or_orientation", - current_text=t_text[:500], - note="Contains 'Style' or 'Orientation' — extra text from PDF page layout") - -print(f"Found {len(issues)} issues.", flush=True) - -out_json = BASE / "compendium-issues.json" -out_txt = BASE / "compendium-issues.txt" - -with open(out_json, 'w', encoding='utf-8') as f: - json.dump(issues, f, ensure_ascii=False, indent=2) - -by_type = defaultdict(list) -by_file = defaultdict(list) -for iss in issues: - by_type[iss['issue']].append(iss) - by_file[iss['file']].append(iss) - -PRIORITY_ORDER = [ - 'garbled_page_layout', - 'missing_beginning', - 'bleeding_watermark', - 'bleeding_multiple_techniques', - 'bleeding_style_or_orientation', - 'truncated', - 'unwanted_newlines', - 'empty_or_short_ingredient', -] - -with open(out_txt, 'w', encoding='utf-8') as f: - w = f.write - w("=" * 80 + "\n") - w("COMPENDIUM TEXT QUALITY REPORT\n") - w("Les Chroniques de l'Etrange — FoundryVTT\n") - w("=" * 80 + "\n\n") - w(f"Files scanned: {len(all_files)}\n") - w(f"Files with issues: {len(by_file)}\n") - w(f"Total issues: {len(issues)}\n\n") - - w("SUMMARY BY ISSUE TYPE:\n") - for itype in PRIORITY_ORDER: - ilist = by_type.get(itype, []) - if ilist: - desc = { - 'garbled_page_layout': 'text broken into single-char HTML tags (PDF artifact)', - 'missing_beginning': 'field starts mid-word (lowercase start = truncated at front)', - 'bleeding_watermark': '"Les Chroniques de l\'Étrange" watermark fragments in text', - 'bleeding_multiple_techniques': 'multiple techniques merged into one field', - 'bleeding_style_or_orientation': 'Style/Orientation text bled into technique field', - 'truncated': 'field ends mid-sentence without proper punctuation', - 'unwanted_newlines': 'raw newlines inside HTML string values', - 'empty_or_short_ingredient': 'ingredient has empty or very short description', - }.get(itype, '') - w(f" {itype:45s} {len(ilist):3d} — {desc}\n") - - w("\nFILES WITH ISSUES:\n") - for fpath in sorted(by_file.keys()): - types = sorted(set(i['issue'] for i in by_file[fpath])) - w(f" {fpath}\n [{', '.join(types)}]\n") - - w("\n") - w("=" * 80 + "\n") - w("DETAILED ISSUES (by priority)\n") - w("=" * 80 + "\n") - - for itype in PRIORITY_ORDER: - ilist = by_type.get(itype, []) - if not ilist: - continue - w(f"\n{'─'*80}\n") - w(f"ISSUE TYPE: {itype} ({len(ilist)} occurrences)\n") - w(f"{'─'*80}\n") - for iss in ilist: - w(f"\n File: {iss['file']}\n") - w(f" Item: {iss.get('item_name','?')}\n") - w(f" Field: {iss['field']}\n") - if iss.get('note'): - w(f" Note: {iss['note']}\n") - if iss.get('current_start'): - w(f" Starts: {iss['current_start'][:160]}\n") - if iss.get('current_end'): - w(f" Ends: ...{iss['current_end']}\n") - if iss.get('current_preview'): - w(f" Text: {iss['current_preview'][:200]}\n") - if iss.get('current_text'): - ct = iss['current_text'] - w(f" Text: {ct[:300]}\n") - if iss.get('plain_text'): - w(f" Plain: {iss['plain_text'][:200]}\n") - if iss.get('pdf_context'): - w(f" PDF>>: {iss['pdf_context'][:400]}\n") - if iss.get('pdf_context_before'): - w(f" <Le corps résistant et la position immuable du pratiquant le rendent difficile à blesser. Si le personnage choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur de Métal (ou d’Aptitude martiale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1). martiale dans le cas d’un PNJ). S’il décide d’utiliser ce Style ", - "plain_text": "Le corps résistant et la position immuable du pratiquant le rendent difficile à blesser. Si le personnage choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur de Métal (ou d’Aptitude martiale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu", - "pdf_context": null - }, - { - "file": "cde-kungfus/forme_des_couteaux_papillon.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Forme des Couteaux papillon", - "current_end": "placer son score normal d’Initiative par le double de sa valeur de Feu (ou d’Aptitude sociale pour un PNJ). les chroniqu", - "current_preview": "Le corps résistant et la position immuable du pratiquant le rendent difficile à blesser. Si le personnage choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa va", - "pdf_context": null - }, - { - "file": "cde-kungfus/forme_des_couteaux_papillon.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Forme des Couteaux papillon", - "current_end": "re au contact et l’arme est projetée à distance courte. Si le personnage dépense 2 dés-fastes à cet effet, l’arme est pr", - "current_preview": "Profitant de manier deux armes courtes, le pratiquant capture celle de son adversaire et l’en prive. Sur une défense réussie, le personnage désarme son adversaire au contact et l’arme est projetée à d", - "pdf_context": "2 dés-fastes à cet effet, l’arme est pro- pour imposer des dés-néfastes (à raison de 1 jetée à distance médiane. pour 1) à la prochaine action de son adversaire. L’alcool mauvais La résolution vainc l’indécision Activation : Dégâts infligés Activation : Action d’attaque Abandonnant un instant sa gestuelle souple Quand il passe à l’attaque, le pratiquant ex- " - }, - { - "file": "cde-kungfus/forme_des_couteaux_papillon.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Forme des Couteaux papillon", - "current_end": "ensif. Le personnage gagne 1 dé supplémentaire à ses jets d’attaque (ou augmente de 1 la valeur de l’Aptitude Techniques", - "current_preview": "Usant de deux armes maniées conjointement, la Forme des Couteaux papillon offre à son pratiquant un avantage offensif. Le personnage gagne 1 dé supplémentaire à ses jets d’attaque (ou augmente de 1 la", - "pdf_context": null - }, - { - "file": "cde-kungfus/forme_des_couteaux_papillon.json", - "field": "system.techniques.technique2.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Forme des Couteaux papillon", - "current_text": "

Le corps résistant et la position immuable du pratiquant le rendent difficile à blesser. Si le personnage choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur de Métal (ou d’Aptitude martiale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1). martiale dans le cas d’un PNJ). S’il décide d’utiliser ce Style au moment où est déterminée l’Initiative, le personnage peut décider de remplacer son score normal d", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/kung_fu_de_linvulnerabilite.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Kung-fu de l'Invulnérabilité", - "current_end": "médiane. Les dégâts à mains nues du personnage sont égaux à sa valeur de Bois (ou d’Aptitude spirituelle pour un PNJ) au", - "current_preview": "Ancrant son centre de gravité de façon à se rendre inamovible, le pratiquant porte des coups capables de repousser ses adversaires à distance. Si cette attaque réussit, la cible est projetée à distanc", - "pdf_context": "pour un PNJ) au lieu de 1 sa valeur de Bois (ou d’Aptitude spirituelle pour pour cette attaque. un PNJ) au lieu de 1 pour cette attaque. Le Wing Chun (Wing Ceon) La Boxe de l’Ivresse (Zeoi Kyun) Orientation : Yin Orientation : Yin Aspect : Métal Aspect : Eau Compétence : Kung-fu Compétence : Kung-fu " - }, - { - "file": "cde-kungfus/kung_fu_de_linvulnerabilite.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Kung-fu de l'Invulnérabilité", - "current_end": "x papillon Orientation : Yin Aspect : Métal Compétence : Kung-fu Spécialité : Poignard Wing Chun, employant une paire de", - "current_preview": "Concentré et résistant, le pratiquant contrôle la douleur. Quelle que soit son action, lorsque le personnage fait son jet, il ignore 1 dé de malus dû à la perte de Zing et/ou de San. S’il dépense 2 dé", - "pdf_context": "g Chun, employant une paire de couteaux Spécialité : Épée papillon. Ces armes, inspirées par les sabres La voie du Faîte suprême de l’Épée est ensei- d’appontage de l’ethnie hakka, firent leur appa- gnée depuis le dix-septième siècle. Elle privilé- rition parmi les bateliers de Hong Kong à la fin gie les souples épées à double tranchant, plus de la dynastie Ming. légères que les sabres et dont le maniement Cette technique demande une grande coordi- " - }, - { - "file": "cde-kungfus/kung_fu_de_linvulnerabilite.json", - "field": "system.techniques.technique2.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Kung-fu de l'Invulnérabilité", - "current_text": "

Concentré et résistant, le pratiquant contrôle la douleur. Quelle que soit son action, lorsque le personnage fait son jet, il ignore 1 dé de malus dû à la perte de Zing et/ou de San. S’il dépense 2 dés-fastes à cet effet, il ignore alors 2 dés de malus dus à la perte de Zing et/ou de San. S’il s’agit d’un PNJ, il récupère 1 point de Vitalité. Forme des Couteaux papillon Orientation : Yin Aspect : Métal Compétence : Kung-fu Spécialité : Poignard Wing Chun, employant une paire de

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/la_boxe_de_la_famille_hong_hung_gar.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "La Boxe de la famille Hong (Hung Gar)", - "current_end": "u personnage sont égaux à sa valeur de Métal (ou d’Aptitude martiale pour un PNJ) au lieu de 1 pour cette attaque. niq e", - "current_preview": "Les coups portés avec les doigts positionnés en « gueule de tigre » lacèrent la chair et brisent les os. Les dégâts à mains nues du personnage sont égaux à sa valeur de Métal (ou d’Aptitude martiale p", - "pdf_context": null - }, - { - "file": "cde-kungfus/la_boxe_de_la_famille_hong_hung_gar.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "La Boxe de la famille Hong (Hung Gar)", - "current_end": " La cible perd 2 points de Hei (l’éventuelle répartition en Yin et Yang est au choix du personnage touché) en plus des d", - "current_preview": "Avec ses doigts repliés en « bec de grue », le pratiquant frappe les points vitaux de son adversaire. La cible perd 2 points de Hei (l’éventuelle répartition en Yin et Yang est au choix du personnage ", - "pdf_context": "rsonnage touché) en plus des dégâts infligés. Activation : Dés-fastes Le pratiquant cherche à tout prix à garder L’animal acculé mord le chasseur l’Initiative pour ne laisser aucune opportunité Activation : Dés-fastes à son adversaire. Le personnage peut dépenser Les parades du Hung Gar sont presque aussi les dés-fastes de son action d’attaque (qu’elle " - }, - { - "file": "cde-kungfus/la_boxe_de_la_famille_hong_hung_gar.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "La Boxe de la famille Hong (Hung Gar)", - "current_end": "ois Compétence : Kung-fu Spécialité : Mains Nues Création du célèbre Bruce Lee, le Jeet Kune Do est un art martial hérit", - "current_preview": "Les parades du Hung Gar sont presque aussi dévastatrices que ses attaques. Le personnage peut dépenser les dés-fastes de son action de défense réussie pour infliger immédiatement des dégâts à son adve", - "pdf_context": "un art martial héritier du Wing Chun mais de la reprenant des éléments issus de bien d’autres techniques. Officiellement, il n’existe qu’une in- Orientation : Yang fime poignée d’écoles de Jeet Kune Do – car son Aspect : Bois créateur ne voulait pas en faire un art martial Compétence : Kung-fu de masse – et aucune n’est basée à Hong Kong. Spécialité : Mains Nues Cependant, cela n’a pas empêché de nombreux " - }, - { - "file": "cde-kungfus/la_boxe_de_la_famille_hong_hung_gar.json", - "field": "system.style", - "issue": "truncated", - "item_name": "La Boxe de la famille Hong (Hung Gar)", - "current_end": "e de 1 la valeur de l’Aptitude martiale dans le cas d’un PNJ) et inflige 1 dégât supplémentaire à mains nues. Techniques", - "current_preview": "Le Hung Gar est un art martial qui privilégie l’agressivité et la puissance. Le personnage gagne 1 dé supplémentaire sur chacun de ses jets d’attaque (ou augmente de 1 la valeur de l’Aptitude martiale", - "pdf_context": null - }, - { - "file": "cde-kungfus/la_boxe_de_la_famille_hong_hung_gar.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "La Boxe de la famille Hong (Hung Gar)", - "current_text": "

Les parades du Hung Gar sont presque aussi dévastatrices que ses attaques. Le personnage peut dépenser les dés-fastes de son action de défense réussie pour infliger immédiatement des dégâts à son adversaire (à raison de 1 pour 1). Jeet Kune Do (Jie; Quan mandarin Zit Kyun Dou en cantonais) Orientation : Yang Aspect : Bois Compétence : Kung-fu Spécialité : Mains Nues Création du célèbre Bruce Lee, le Jeet Kune Do est un art martial hérit

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/la_boxe_de_la_forme_et_de_la_pensee.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "La Boxe de la Forme et de la Pensée", - "current_end": "utilise sa valeur de Bois (ou d’Aptitude spirituelle pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de l", - "current_preview": "Immobile comme une statue, le pratiquant reste ramassé afin de guetter l’occasion de porter un coup fulgurant. S’il choisit de ne pas utiliser d’action de défense contre une attaque, le personnage uti", - "pdf_context": "difficulté pour le toucher (au lieu de la difficulté les chroniques pied sautés et des frappes allongées permettant normale de 1). de l’étrange d’atteindre l’adversaire, même quand celui-ci se croit hors de portée. La BoxeGar de) la famille Hong Style " - }, - { - "file": "cde-kungfus/la_boxe_de_la_forme_et_de_la_pensee.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "La Boxe de la Forme et de la Pensée", - "current_end": "ect : Terre Compétence : Kung-fu Spécialité : Mains Nues Cette dénomination correspond à la lutte chinoise moderne, tell", - "current_preview": "Usant de mouvements de hanches et d’épaules pour gêner son adversaire, le pratiquant le force à négliger sa garde. Le personnage peut dépenser les dés-fastes de son action d’attaque ou de défense (réu", - "pdf_context": "inoise moderne, telle que codifiée en 1928, mais les techniques et clefs les plus anciennes remontent à plusieurs millénaires. Cet art martial est particu- lièrement pratiqué par les populations mongoles. Le Seot Gaau repose sur les fauchages, projec- tions, saisies rapides, etc. Dans sa forme sportive officielle, cette technique interdit les coups di- rects ainsi que les manœuvres visant à briser un membre – mais de nombreux combats clandestins se révèlent bien plus sanglants, toutes les tech- niques classique" - }, - { - "file": "cde-kungfus/la_boxe_de_la_forme_et_de_la_pensee.json", - "field": "system.style", - "issue": "truncated", - "item_name": "La Boxe de la Forme et de la Pensée", - "current_end": " son adversaire. Une action de déplacement coûte 1 cran d’initiative (au lieu de 2) au personnage. La pointe de la lance", - "current_preview": "Telle la fameuse arme traditionnelle dont s’inspire cette boxe, le pratiquant fuse à grande vitesse pour arriver à portée de son adversaire. Une action de déplacement coûte 1 cran d’initiative (au lie", - "pdf_context": "a pointe de la lance Activation : Dégâts infligés Frappant de l’estoc de sa main ouverte sur les points vitaux, le pratiquant inflige une dou- leur cuisante à son opposant. Les dégâts à mains nues du personnage sont égaux à sa valeur d’Eau (ou d’Aptitude mentale pour un PNJ) au lieu de 1 pour cette attaque. le système de combat La résistance du bois Activation : Réaction Immobile comme une statue, le pratiquant reste ramassé afin de gue" - }, - { - "file": "cde-kungfus/la_boxe_de_la_forme_et_de_la_pensee.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "La Boxe de la Forme et de la Pensée", - "current_text": "

Usant de mouvements de hanches et d’épaules pour gêner son adversaire, le pratiquant le force à négliger sa garde. Le personnage peut dépenser les dés-fastes de son action d’attaque ou de défense (réussie ou non) pour infliger des dés-néfastes à la prochaine action de son adversaire (à raison de 1 pour 1). Le Seot Gaau Orientation : Yang ou Yin Aspect : Terre Compétence : Kung-fu Spécialité : Mains Nues Cette dénomination correspond à la lutte chinoise moderne, tell

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/la_boxe_de_livresse_zeoi_kyun.json", - "field": "system.techniques.technique1.technique", - "issue": "bleeding_watermark", - "item_name": "La Boxe de l'Ivresse (Zeoi Kyun)", - "current_text": "

Les coups assénés à un rythme soutenu par le pratiquant épuisent son adversaire. La cible perd 2 points de Hei (l’éventuelle répartition en Yin et Yang est au choix du personnage touché) en plus des dégâts infligés. de l’étrange Techniques niq e hr ng s c ra le l’ét Style Le déséquilibre du pratiquant est la clé de la Boxe de l’Ivresse. Le personnage élimine gratuitement 2 dés-néfastes sur ses ", - "plain_text": "Les coups assénés à un rythme soutenu par le pratiquant épuisent son adversaire. La cible perd 2 points de Hei (l’éventuelle répartition en Yin et Yang est au choix du personnage touché) en plus des dégâts infligés. de l’étrange Techniques niq e hr ng s c ra le l’ét Style Le déséquilibre du pratiqua", - "pdf_context": null - }, - { - "file": "cde-kungfus/la_boxe_de_livresse_zeoi_kyun.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "La Boxe de l'Ivresse (Zeoi Kyun)", - "current_end": "la clé de la Boxe de l’Ivresse. Le personnage élimine gratuitement 2 dés-néfastes sur ses actions d’attaque, qu’elles so", - "current_preview": "Les coups assénés à un rythme soutenu par le pratiquant épuisent son adversaire. La cible perd 2 points de Hei (l’éventuelle répartition en Yin et Yang est au choix du personnage touché) en plus des d", - "pdf_context": null - }, - { - "file": "cde-kungfus/la_boxe_de_livresse_zeoi_kyun.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "La Boxe de l'Ivresse (Zeoi Kyun)", - "current_end": "ction d’attaque pour faire perdre des crans d’initiative à sa cible (à raison de 1 pour 1, maximum 3). L’attaque inflige", - "current_preview": "Lui-même en déséquilibre perpétuel, le pratiquant jette facilement au sol son opposant et le force ainsi à perdre du temps à se relever. Lors d’une attaque réussie, le personnage fait tomber son adver", - "pdf_context": "attaque inflige ensuite norma- sa prochaine action un nombre de dés-néfastes lement ses dégâts. égal à la valeur de Feu (ou d’Aptitude sociale pour un PNJ) du personnage. Si l’adversaire Assiéger la forteresse déclare qu’il se défend, les dés-néfastes restant Activation : Dés-fastes après un éventuel jet de dés peuvent être dé- Le pratiquant sait où viser pour gêner les pensés pour infliger immédiatement des dégâts mouvements de son adversaire. Le personnage suppl" - }, - { - "file": "cde-kungfus/la_boxe_de_livresse_zeoi_kyun.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "La Boxe de l'Ivresse (Zeoi Kyun)", - "current_end": "rme son adversaire et l’arme est projetée à distance courte. Si le personnage dépense 2 dés-fastes à cet effet, l’arme e", - "current_preview": "Lorsqu’il affronte un combattant armé, le pratiquant prend bien garde à le priver de cet atout. Lors d’une défense au contact réussie, le personnage désarme son adversaire et l’arme est projetée à dis", - "pdf_context": "pense 2 dés-fastes à cet effet, l’arme est pro- pour imposer des dés-néfastes (à raison de 1 jetée à distance médiane. pour 1) à la prochaine action de son adversaire. L’alcool mauvais La résolution vainc l’indécision Activation : Dégâts infligés Activation : Action d’attaque Abandonnant un instant sa gestuelle souple Quand il passe à l’attaque, le pratiquant ex- " - }, - { - "file": "cde-kungfus/la_boxe_de_livresse_zeoi_kyun.json", - "field": "system.style", - "issue": "truncated", - "item_name": "La Boxe de l'Ivresse (Zeoi Kyun)", - "current_end": "ques réussies, les dés-fastes dépensés par le personnage pour augmenter ses dégâts comptent double. le système de combat", - "current_preview": "Malgré les apparences, le Wing Chun se révèle un art martial violent et offensif. Sur chacune de ses attaques réussies, les dés-fastes dépensés par le personnage pour augmenter ses dégâts comptent dou", - "pdf_context": "le système de combat dans Hong Kong abrégé : PJ pour personnage-joueur) qui sera – Les Chroniques de l’Étrange est digne des son alter ego dans l’univers de Hong Kong – Les meilleurs films de kung-fu. Une mécanique de Chroniques de l’Étrange – c’est lui qui mènera crans d’initiative permet de découper le temps les enquêtes et vivra les aventures pleines de qui s’écoule dans l’univers de jeu et de suivre mystères et de magie de cet univers. " - }, - { - "file": "cde-kungfus/la_boxe_de_livresse_zeoi_kyun.json", - "field": "system.techniques.technique1.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "La Boxe de l'Ivresse (Zeoi Kyun)", - "current_text": "

Les coups assénés à un rythme soutenu par le pratiquant épuisent son adversaire. La cible perd 2 points de Hei (l’éventuelle répartition en Yin et Yang est au choix du personnage touché) en plus des dégâts infligés. de l’étrange Techniques niq e hr ng s c ra le l’ét Style Le déséquilibre du pratiquant est la clé de la Boxe de l’Ivresse. Le personnage élimine gratuitement 2 dés-néfastes sur ses actions d’attaque, qu’elles so

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/la_boxe_longue_coeng_kyun.json", - "field": "system.description", - "issue": "truncated", - "item_name": "La Boxe longue (Coeng Kyun)", - "current_end": "lacement gratuite (donc sans dépenser de crans d’initiative supplémentaires). Il peut alors se déplacer puis attaquer, m", - "current_preview": "Bien qu’on en connaisse surtout la version moderne, qui relève davantage d’une discipline sportive – le kung-fu pratiqué en compétition –, le Coeng Kyun est à l’origine un art martial externe conçu pa", - "pdf_context": "peut alors se déplacer puis attaquer, mais pas l’inverse. Style Le Hung Gar est un art martial qui privilé- Le plongeon de l’aigle gie l’agressivité et la puissance. Le personnage Activation : Dégâts infligés gagne 1 dé supplémentaire sur chacun de ses Les coups de pied sautés du pratiquant se ré- jets d’attaque (ou augmente de 1 la valeur de vèlent redoutablement" - }, - { - "file": "cde-kungfus/la_boxe_longue_coeng_kyun.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "La Boxe longue (Coeng Kyun)", - "current_end": " de déplacement gratuite (donc sans dépenser de crans d’initiative supplémentaires). Il peut alors se déplacer puis atta", - "current_preview": "Le pratiquant entre dans la garde de son adversaire en un éclair quand il passe à l’attaque. Le personnage ajoute à son action d’attaque une action de déplacement gratuite (donc sans dépenser de crans", - "pdf_context": "ut alors se déplacer puis attaquer, mais pas l’inverse. Style Le Hung Gar est un art martial qui privilé- Le plongeon de l’aigle gie l’agressivité et la puissance. Le personnage Activation : Dégâts infligés gagne 1 dé supplémentaire sur chacun de ses Les coups de pied sautés du pratiquant se ré- jets d’attaque (ou augmente de 1 la valeur de vèlent redouta" - }, - { - "file": "cde-kungfus/la_boxe_longue_coeng_kyun.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "La Boxe longue (Coeng Kyun)", - "current_end": "astateurs. Les dégâts à mains nues du personnage sont égaux à sa valeur de Terre (ou d’Aptitude physique pour un PNJ) au", - "current_preview": "Les coups de pied sautés du pratiquant se révèlent redoutablement dévastateurs. Les dégâts à mains nues du personnage sont égaux à sa valeur de Terre (ou d’Aptitude physique pour un PNJ) au", - "pdf_context": "itude physique pour un PNJ) au lieu de 1 sa valeur de Bois (ou d’Aptitude spirituelle pour pour cette attaque. un PNJ) au lieu de 1 pour cette attaque. Le Wing Chun (Wing Ceon) La Boxe de l’Ivresse (Zeoi Kyun) Orientation : Yin Orientation : Yin Aspect : Métal Aspect : Eau Compétence : Kung-fu Compétence : Kung-fu " - }, - { - "file": "cde-kungfus/la_boxe_longue_coeng_kyun.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "La Boxe longue (Coeng Kyun)", - "current_end": "eu Compétence : Kung-fu Spécialité : Mains Nues Le Hung Gar, natif de la province du Guangdong, est très populaire aussi", - "current_preview": "Tout comme il sait se rapprocher pour attaquer, le pratiquant sait se mettre hors d’atteinte des coups de son adversaire en adoptant une garde à la fois solide et gracieuse. S’il choisit de ne pas uti", - "pdf_context": "dong, est très populaire aussi bien en après que l’action de défense est résolue. Chine qu’à l’étranger. On le surnomme égale- ment la Boxe du Tigre et de la Grue – bien qu’il Techniques adopte des postures typiques d’autres animaux (léopard, dragon, serpent). Cette boxe était Le bond du fauve notamment pratiquée par le gran" - }, - { - "file": "cde-kungfus/la_boxe_longue_coeng_kyun.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "La Boxe longue (Coeng Kyun)", - "current_text": "

Tout comme il sait se rapprocher pour attaquer, le pratiquant sait se mettre hors d’atteinte des coups de son adversaire en adoptant une garde à la fois solide et gracieuse. S’il choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur de Feu (ou d’Aptitude sociale pour un PNJ) pour fixer la BoxeGar de) la famille Hong (Hung Orientation : Yang Aspect : Feu Compétence : Kung-fu Spécialité : Mains Nues Le Hung Gar, natif de la province du Guangdong, est", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/la_lance_du_general_yue_fei.json", - "field": "system.description", - "issue": "bleeding_watermark", - "item_name": "La Lance du Général Yue Fei", - "current_text": "

Héros de la dynastie Song, Yue Fei possède la réputation d’être l’un des plus grands guerriers de toute l’histoire de la Chine. De nombreux styles font remonter leurs origines à ce vaillant général. Lancier particulièrement doué, il est au moins certain que la Lance loyale du général Yue Fei soit due à son génie martial. Cette voie met à profit la totalité de la lance pour ses techniques. Les a", - "plain_text": "Héros de la dynastie Song, Yue Fei possède la réputation d’être l’un des plus grands guerriers de toute l’histoire de la Chine. De nombreux styles font remonter leurs origines à ce vaillant général. Lancier particulièrement doué, il est au moins certain que la Lance loyale du général Yue Fei soit du", - "pdf_context": "typique de la Chine impériale. 279 s ue o niq e hr ng s c ra le l’ét de Style PNJ) avant d’avoir à recharger. De plus, ses dé- Le pratiquant met à profit l’avantage que gâts à l’arc sont toujours augmentés de 1. lui procure la longueur de sa lance. Le person- nage peut p" - }, - { - "file": "cde-kungfus/la_lance_du_general_yue_fei.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "La Lance du Général Yue Fei", - "current_end": "ommages à ses adversaires. Lors d’une attaque réussie, les dés-fastes dépensés par le personnage pour augmenter ses dégâ", - "current_preview": "La lance du général Yue Fei était aussi puissante que loyale, capable d’infliger de sérieux dommages à ses adversaires. Lors d’une attaque réussie, les dés-fastes dépensés par le personnage pour augme", - "pdf_context": "onnage pour augmenter ses dégâts comptent Activation : Action d’attaque double. Crachant la foudre sur ses cibles, le prati- quant décoche ses flèches avec une grande cé- Tenir le cavalier à distance lérité. Cette action d’attaque du personnage lui Activation : Action de défense coûte 2 crans d’initiative (au li" - }, - { - "file": "cde-kungfus/la_lance_du_general_yue_fei.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "La Lance du Général Yue Fei", - "current_end": "er loin de soi. Le personnage ajoute au résultat de son jet de défense autant de dés-fastes que sa valeur d’Eau (ou d’Ap", - "current_preview": "La lance est l’arme idéale pour repousser ses ennemis et les garder loin de soi. Le personnage ajoute au résultat de son jet de défense autant de dés-fastes que sa valeur d’Eau (ou d’Ap", - "pdf_context": "dés-fastes que sa valeur d’Eau (ou d’Aptitude Concentré à l’extrême, le pratiquant parvient mentale pour un PNJ). à décocher ses flèches même dans un environne- ment peu favorable. Le personnage peut annu- Retenir l’avalanche ler, sur le résultat d’un jet d’attaque, un nombre Activation : Action de défense de dés-néfastes égal à sa val" - }, - { - "file": "cde-kungfus/la_lance_du_general_yue_fei.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "La Lance du Général Yue Fei", - "current_end": "ois Compétence : Combat à distance Spécialité : Arc Ce style particulier de tir à l’arc doit sa création à un jeune chas", - "current_preview": "D’une solidité à toute épreuve, la lance bloque et repousse les opposants du pratiquant. Si l’action de défense du personnage est réussie, son agresseur est projeté à distance courte. S’il dépense 2 d", - "pdf_context": "tion à un jeune chasseur de la dynastie Song. Le L’objectif des Mille Frelons consiste à atta- cœur de cette voie est l’idée qu’un archer doit quer au moyen de ces armes de façon rapide, être en mesure d’atteindre sa cible en dépit des peu importe les conditions et la position. Au circonstances extérieures défavorables – telles cours de l’entraînement, le pratiquant apprend qu’un orage grondant. à projeter se" - }, - { - "file": "cde-kungfus/la_lance_du_general_yue_fei.json", - "field": "system.style", - "issue": "truncated", - "item_name": "La Lance du Général Yue Fei", - "current_end": "gueur de sa lance. Le personnage peut porter une attaque à distance courte comme s’il se trouvait au contact. Techniques", - "current_preview": "Le pratiquant met à profit l’avantage que lui procure la longueur de sa lance. Le personnage peut porter une attaque à distance courte comme s’il se trouvait au contact. Techniques", - "pdf_context": null - }, - { - "file": "cde-kungfus/la_lance_du_general_yue_fei.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "La Lance du Général Yue Fei", - "current_text": "

D’une solidité à toute épreuve, la lance bloque et repousse les opposants du pratiquant. Si l’action de défense du personnage est réussie, son agresseur est projeté à distance courte. S’il dépense 2 dés-fastes à cet effet, l’agresseur est projeté à distance médiane. Les Éclairs de Leoi Gung Orientation : Yang Aspect : Bois Compétence : Combat à distance Spécialité : Arc Ce style particulier de tir à l’arc doit sa création à un jeune chas

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/la_paume_des_huit_trigrammes_baatgwaa_zoeng.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "La Paume des Huit Trigrammes (Baatgwaa Zoeng)", - "current_end": "ement face à son adversaire, le pratiquant l’oblige à s’épuiser pour l’atteindre. Une attaque contre le personnage coûte", - "current_preview": "Constamment en mouvement face à son adversaire, le pratiquant l’oblige à s’épuiser pour l’atteindre. Une attaque contre le personnage coûte", - "pdf_context": "ersonnage coûte valeur de Métal (ou d’Aptitude martiale pour un 2 crans d’initiative (au lieu de 3). 280 Techniques attaques du personnage passe de distance mé- les chroniques diane à distance longue, et les dégâts de ses de l’étrange L’essaim furieux " - }, - { - "file": "cde-kungfus/la_paume_des_huit_trigrammes_baatgwaa_zoeng.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "La Paume des Huit Trigrammes (Baatgwaa Zoeng)", - "current_end": "te 2 crans d’initiative (au lieu de 3). La main du dragon Activation : Action d’attaque\nDès qu’il se trouve dans la posi", - "current_preview": "Constamment en mouvement face à son\nadversaire, le pratiquant l’oblige à s’épuiser\npour l’atteindre. Une attaque contre le personnage coûte 1 cran d’initiative supplémentaire à\nl’agresseur.\nActivation", - "pdf_context": "s qu’il se trouve dans la position idéale, lieu de la difficulté normale de 1). le pratiquant porte un coup de la main ouverte en délivrant toute sa puissance. Si cette attaque Le double coup de paume réussit, les dés-fastes dépensés par le person- Activation : Dégâts infligés nage pour augmenter ses dégâts comptent Le pratiquant effectue une double frappe afin double. De plus, les dégâts à mains nues du de maximiser l’impact de ses attaques. Les dé- personnage " - }, - { - "file": "cde-kungfus/la_paume_des_huit_trigrammes_baatgwaa_zoeng.json", - "field": "system.techniques.technique2.technique", - "issue": "unwanted_newlines", - "item_name": "La Paume des Huit Trigrammes (Baatgwaa Zoeng)", - "current_text": "

Constamment en mouvement face à son\nadversaire, le pratiquant l’oblige à s’épuiser\npour l’atteindre. Une attaque contre le personnage coûte 1 cran d’initiative supplémentaire à\nl’agresseur.\nActivation : Action d’attaque\nCherchant inlassablement à obtenir une position privilégiée, le pratiquant délivre des frappes\nrapides et précises. Cette action d’attaque du personnage lui coûte 2 crans d’init", - "plain_text": "Constamment en mouvement face à son\nadversaire, le pratiquant l’oblige à s’épuiser\npour l’atteindre. Une attaque contre le personnage coûte 1 cran d’initiative supplémentaire à\nl’agresseur.\nActivation" - }, - { - "file": "cde-kungfus/la_paume_des_huit_trigrammes_baatgwaa_zoeng.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "La Paume des Huit Trigrammes (Baatgwaa Zoeng)", - "current_end": "De plus, les dégâts à mains nues du personnage sont égaux à sa valeur de Terre (ou d’Aptitude physique pour un PNJ) au l", - "current_preview": "Dès qu’il se trouve dans la position idéale, le pratiquant porte un coup de la main ouverte en délivrant toute sa puissance. Si cette attaque réussit, les dés-fastes dépensés par le personnage pour au", - "pdf_context": "ude physique pour un PNJ) au lieu de 1 sa valeur de Bois (ou d’Aptitude spirituelle pour pour cette attaque. un PNJ) au lieu de 1 pour cette attaque. Le Wing Chun (Wing Ceon) La Boxe de l’Ivresse (Zeoi Kyun) Orientation : Yin Orientation : Yin Aspect : Métal Aspect : Eau Compétence : Kung-fu Compétence : Kung-fu S" - }, - { - "file": "cde-kungfus/la_paume_des_huit_trigrammes_baatgwaa_zoeng.json", - "field": "system.style", - "issue": "truncated", - "item_name": "La Paume des Huit Trigrammes (Baatgwaa Zoeng)", - "current_end": "mmes. Une action de déplacement coûte 1 cran d’initiative (au lieu de 2) au personnage. Techniques Contourner l’obstacle", - "current_preview": "Une grande mobilité est le principal atout du pratiquant de la Paume des Huit Trigrammes. Une action de déplacement coûte 1 cran d’initiative (au lieu de 2) au personnage. Techniques Contourner l’obst", - "pdf_context": "ontourner l’obstacle Les mains collantes Activation : Réaction Activation : Dégâts infligés Constamment en mouvement face à son Les coups assénés à un rythme soutenu par adversaire, le pratiquant l’oblige à s’épuiser le pratiquant épuisent son adversaire. La cible pour l’atteindre. Une attaque contre le person- perd 2 points de Hei (l’éventuelle répartition en nage coûte 1 cran d’initiative supplément" - }, - { - "file": "cde-kungfus/la_paume_des_huit_trigrammes_baatgwaa_zoeng.json", - "field": "system.techniques.technique2.technique", - "issue": "bleeding_multiple_techniques", - "item_name": "La Paume des Huit Trigrammes (Baatgwaa Zoeng)", - "activation_count": 2, - "current_text": "

Constamment en mouvement face à son\nadversaire, le pratiquant l’oblige à s’épuiser\npour l’atteindre. Une attaque contre le personnage coûte 1 cran d’initiative supplémentaire à\nl’agresseur.\nActivation : Action d’attaque\nCherchant inlassablement à obtenir une position privilégiée, le pratiquant délivre des frappes\nrapides et précises. Cette action d’attaque du personnage lui coûte 2 crans d’initiative (au lieu de 3). La main du dragon Activation : Action d’attaque\nDès qu’il se trouve dans la p", - "note": "2 'Activation :' markers — multiple techniques merged" - }, - { - "file": "cde-kungfus/le_double_peau.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Le Double-peau", - "current_end": "aque en ciblant deux adversaires différents tous deux situés au contact. Les deux attaques sont résolues séparément mais", - "current_preview": "Un bâton possède deux extrémités et le pratiquant sait les utiliser alternativement pour frapper. Cette action d’attaque coûte 5 crans d’initiative (au lieu de 3). Le personnage réalise 2 jets d’attaq", - "pdf_context": "lues séparément mais ont lieu simultanément. Activation : Réaction Quand il fait face à l’épée souple, l’adver- Briser le crâne du tigre saire n’arrive que difficilement à en suivre les Activation : Dés-fastes mouvements et peine à se protéger. Face au per- Un coup de bâton asséné en profitant de sa sonnage, une action de défense coûte 2 crans longueur et de sa solidité permet au pratiquant d’initiative (au lieu de " - }, - { - "file": "cde-kungfus/le_double_peau.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Le Double-peau", - "current_end": "grand fauve sur le coup ! Lors d’une attaque réussie, les dés-fastes dépensés par le personnage pour augmenter ses dégât", - "current_preview": "Un coup de bâton asséné en profitant de sa longueur et de sa solidité permet au pratiquant d’occasionner des dommages considérables – assez pour tuer un grand fauve sur le coup ! Lors d’une attaque ré", - "pdf_context": "nnage pour augmenter ses dégâts comptent Activation : Action d’attaque double. Crachant la foudre sur ses cibles, le prati- quant décoche ses flèches avec une grande cé- Tenir le cavalier à distance lérité. Cette action d’attaque du personnage lui Activation : Action de défense coûte 2 crans d’initiative (au lie" - }, - { - "file": "cde-kungfus/le_double_peau.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Le Double-peau", - "current_end": "eu Compétence : Kung-fu Spécialité : Bâton Le nom de ce style évoque les multiples avantages offerts par le bâton à troi", - "current_preview": "Sa taille et sa légèreté font du bâton une arme de défense efficace. S’il choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur d’Eau (ou d’Aptitude mental", - "pdf_context": "es offerts par le bâton à trois sections source de la Double-peau de Tigre l’aurait nom- (saam zit gwan) inventé par le fondateur de la mée ainsi après avoir tué deux de ces animaux dynastie Song. Le bâton à trois sections (aussi qui l’avaient attaqué alors qu’il n’avait qu’un nommé tri-bâton ou triple bâton) offre une simple bâton pour se défendre. Sa découverte grande polyvalence offensive et défensive, mais fut intégrée dans l’enseignement du m" - }, - { - "file": "cde-kungfus/le_double_peau.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Le Double-peau", - "current_end": "ntre les mains du pratiquant. Le personnage gagne 1 dé-faste gratuit sur ses actions d’attaque et de défense. Techniques", - "current_preview": "La souplesse d’utilisation du bâton rend cette arme redoutable entre les mains du pratiquant. Le personnage gagne 1 dé-faste gratuit sur ses actions d’attaque et de défense. Techniques", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_double_peau.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Le Double-peau", - "current_text": "

Sa taille et sa légèreté font du bâton une arme de défense efficace. S’il choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur d’Eau (ou d’Aptitude mentale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1). Les Trois Joyaux Orientation : Yang Aspect : Feu Compétence : Kung-fu Spécialité : Bâton Le nom de ce style évoque les multiples avantages offerts par le bâton à troi

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/le_faite_supreme_de_lepee_taaigik_gim.json", - "field": "system.description", - "issue": "bleeding_watermark", - "item_name": "Le Faîte suprême de l'Épée (Taaigik Gim)", - "current_text": "

La voie du Faîte suprême de l’Épée est enseignée depuis le dix-septième siècle. Elle privilégie les souples épées à double tranchant, plus légères que les sabres et dont le maniement demande une grande précision – mais se révèle d’une redoutable efficacité. Le Taaigik Gim s’appuie sur le contrôle des énergies internes et des coups plus vifs, précis et légers que la majeure partie des techniques", - "plain_text": "La voie du Faîte suprême de l’Épée est enseignée depuis le dix-septième siècle. Elle privilégie les souples épées à double tranchant, plus légères que les sabres et dont le maniement demande une grande précision – mais se révèle d’une redoutable efficacité. Le Taaigik Gim s’appuie sur le contrôle de", - "pdf_context": "ers que la majeure partie des techniques Usant de deux armes maniées conjointement, de combat avec des lames. la Forme des Couteaux papillon offre à son pratiquant un avantage offensif. Le personnage gagne 1 dé supplémentaire à ses jets d’attaque (ou augmente de 1 la valeur de l’Aptitude 277 s ue o niq e hr ng s c ra le l’ét de Style " - }, - { - "file": "cde-kungfus/le_faite_supreme_de_lepee_taaigik_gim.json", - "field": "system.description", - "issue": "truncated", - "item_name": "Le Faîte suprême de l'Épée (Taaigik Gim)", - "current_end": "trôle des énergies internes et des coups plus vifs, précis et légers que la majeure partie des techniques s c ra le l’ét", - "current_preview": "La voie du Faîte suprême de l’Épée est enseignée depuis le dix-septième siècle. Elle privilégie les souples épées à double tranchant, plus légères que les sabres et dont le maniement demande une grand", - "pdf_context": "ers que la majeure partie des techniques Usant de deux armes maniées conjointement, de combat avec des lames. la Forme des Couteaux papillon offre à son pratiquant un avantage offensif. Le personnage gagne 1 dé supplémentaire à ses jets d’attaque (ou augmente de 1 la valeur de l’Aptitude 277 s ue o niq e hr ng s c ra le l’ét de Style " - }, - { - "file": "cde-kungfus/le_faite_supreme_de_lepee_taaigik_gim.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Le Faîte suprême de l'Épée (Taaigik Gim)", - "current_end": "sie pour faire perdre des points de Hei à son adversaire (à raison de 1 pour 1 ; l’éventuelle répartition en Yin et Yang", - "current_preview": "Il est épuisant d’attaquer le pratiquant, dont la légèreté semble le soustraire à tous les assauts. Le personnage peut dépenser les désfastes de son action de défense réussie pour faire perdre des poi", - "pdf_context": "lle répartition en Yin et Yang est au choix du Briser le rythme personnage touché) en plus des dégâts infligés. Activation : Dés-fastes Le pratiquant cherche à tout prix à garder L’animal acculé mord le chasseur l’Initiative pour ne laisser aucune opportunité Activation : Dés-fastes à son adversaire. Le personnage peut dépenser Les parades du Hung Gar so" - }, - { - "file": "cde-kungfus/le_faite_supreme_de_lepee_taaigik_gim.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Le Faîte suprême de l'Épée (Taaigik Gim)", - "current_end": "ement à en suivre les mouvements et peine à se protéger. Face au personnage, une action de défense coûte 2 crans d’initi", - "current_preview": "Quand il fait face à l’épée souple, l’adversaire n’arrive que difficilement à en suivre les mouvements et peine à se protéger. Face au personnage, une action de défense coûte 2 crans d’initi", - "pdf_context": "oûte 2 crans d’initiative (au lieu de 3). S’il choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa va- La main du dragon leur de Terre (ou d’Aptitude physique pour un Activation : Action d’attaque PNJ) pour fixer la difficulté pour le toucher (au Dès qu’il se trouve dans la position idéale, lieu de la difficulté normale de 1). le pratiquant " - }, - { - "file": "cde-kungfus/le_faite_supreme_de_lepee_taaigik_gim.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Le Faîte suprême de l'Épée (Taaigik Gim)", - "current_end": "Bois Compétence : Kung-fu Spécialité : Bâton La tradition enseigne que cet art martial fut développé au début du sixième", - "current_preview": "Concentré et résistant, le pratiquant contrôle la douleur. Quelle que soit son action, lorsque le personnage fait son jet, il ignore 1 dé de malus dû à la perte de Zing et/ou de San. S’il dépense 2 dé", - "pdf_context": "développé au début du sixième siècle par l’un Spécialité : Bâton des premiers disciples de Buto, le patriarche fon- Le nom de ce style évoque les multiples dateur du monastère de Shaolin. Le moine à la avantages offerts par le bâton à trois sections source de la Double-peau de Tigre l’aurait nom- (saam zit gwan) inventé par le fondateur de la mée ainsi après avoir tué deux de ces animaux dynastie Song. Le bâton à trois sections (aussi " - }, - { - "file": "cde-kungfus/le_faite_supreme_de_lepee_taaigik_gim.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Le Faîte suprême de l'Épée (Taaigik Gim)", - "current_end": "s personnages adverses se voient automatiquement infliger 2 désnéfastes sur leur action visant à le désarmer. Techniques", - "current_preview": "L’épée souple est une arme défensive d’une extrême efficacité, s’enroulant autour des coups adverses pour les dévier. Le personnage gagne 1 dé supplémentaire à ses jets de défense (ou augmente de 1 la", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_faite_supreme_de_lepee_taaigik_gim.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Le Faîte suprême de l'Épée (Taaigik Gim)", - "current_text": "

Concentré et résistant, le pratiquant contrôle la douleur. Quelle que soit son action, lorsque le personnage fait son jet, il ignore 1 dé de malus dû à la perte de Zing et/ou de San. S’il dépense 2 dés-fastes à cet effet, il ignore alors 2 dés de malus dus à la perte de Zing et/ou de San. S’il s’agit d’un PNJ, il récupère 1 point de Vitalité. de de Tigre la Bâton Double-peau Orientation : Yang Aspect : Bois Compétence : Kung-fu Spécialité : Bâton La tradition enseigne que cet art martial fut ", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/le_faite_supreme_taaigik_kyun.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Le Faîte suprême (Taaigik Kyun)", - "current_end": "sa valeur d’Eau (ou d’Aptitude mentale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté n", - "current_preview": "Le pratiquant se dérobe aux attaques de son adversaire avec la fluidité d’un cours d’eau. S’il choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur d’Eau ", - "pdf_context": "er (au lieu de la difficulté normale de 1). Activation : Dés-fastes Restant au contact de son opposant, le pra- La main de fer tiquant utilise ses lames pour parer les coups Activation : Action d’attaque – occasionnant diverses blessures. Le person- Ancrant son centre de gravité de façon à se nage peut dépenser les dés-fastes de son action rendre inamovible, le pratiquant porte des coups " - }, - { - "file": "cde-kungfus/le_faite_supreme_taaigik_kyun.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Le Faîte suprême (Taaigik Kyun)", - "current_end": "és-fastes de son action de défense réussie pour imposer des dés-néfastes (à raison de 1 pour 1) à la prochaine action de", - "current_preview": "Esquivant les attaques de façon à déstabiliser son opposant, le pratiquant le place ainsi en position de faiblesse. Le personnage peut dépenser les dés-fastes de son action de défense réussie pour imp", - "pdf_context": "ur 1) à la prochaine action de son adversaire. L’alcool mauvais La résolution vainc l’indécision Activation : Dégâts infligés Activation : Action d’attaque Abandonnant un instant sa gestuelle souple Quand il passe à l’attaque, le pratiquant ex- au moment d’attaquer, le pratiquant rigidifie ploite les failles de son adversaire. Si l’adver- brièvement son corps afin de porter " - }, - { - "file": "cde-kungfus/le_faite_supreme_taaigik_kyun.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Le Faîte suprême (Taaigik Kyun)", - "current_end": "eu Compétence : Kung-fu Spécialité : Mains Nues Bien qu’on en connaisse surtout la version moderne, qui relève davantage", - "current_preview": "Quand il passe à l’attaque, le pratiquant exploite les failles de son adversaire. Si l’adversaire se défend et qu’il obtient des dés-néfastes, ceux-ci peuvent être dépensés par le personnage pour infl", - "pdf_context": "moderne, qui relève davantage d’une discipline légier les enchaînements, l’équilibre et l’énergie sportive – le kung-fu pratiqué en compétition –, interne, mais les élèves avancés en apprennent le Coeng Kyun est à l’origine un art martial ex- toutes les potentialités martiales. terne conçu par l’ethnie musulmane des Hui, Le Taaigik Kyun, dans sa forme sans armes, dans le nord de la Chine. est très réactif et fait appel aux e" - }, - { - "file": "cde-kungfus/le_faite_supreme_taaigik_kyun.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Le Faîte suprême (Taaigik Kyun)", - "current_end": "e de 1 la valeur de l’Aptitude martiale dans le cas d’un PNJ) et inflige 1 dégât supplémentaire à mains nues. Techniques", - "current_preview": "Le Taaigik Kyun est un art martial qui privilégie les parades et les esquives. Le personnage gagne 1 dé supplémentaire sur chacun de ses jets de défense (ou augmente de 1 la valeur de l’Aptitude marti", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_faite_supreme_taaigik_kyun.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Le Faîte suprême (Taaigik Kyun)", - "current_text": "

Quand il passe à l’attaque, le pratiquant exploite les failles de son adversaire. Si l’adversaire se défend et qu’il obtient des dés-néfastes, ceux-ci peuvent être dépensés par le personnage pour infliger des dégâts supplémentaires (à raison de 1 pour 1) lors de cette attaque. De plus, les dégâts à mains nues du personnage sont égaux à sa valeur de Métal (ou d’Aptitude martiale pour un PNJ) au lieu de 1 pour cette attaque. BoxeKyun longue (Coeng Orientation : Yang Aspect : Feu Compétence : Ku", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/le_gun_fu.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Le Gun-fu", - "current_end": "ut annuler sur son action de défense (qu’elle soit réussie ou non) un nombre de dés-néfastes égal à sa valeur de Feu (ou", - "current_preview": "Ne restant jamais immobile dans une fusillade, le pratiquant n’offre pas une cible facile ! Le personnage peut annuler sur son action de défense (qu’elle soit réussie ou non) un nombre de dés-néfastes", - "pdf_context": "dés-néfastes égal à sa valeur de Feu (ou martiale. d’Aptitude sociale pour un PNJ). Techniques Rester conscient Activation : Action d’attaque ou de défense Tir précis Pris dans une fusillade, le pratiquant se Activation : Action d’attaque concentre sur sa survie malgré les blessures Le Gun Kata enseigne à viser en une frac- éventuelles. Quelle que soit son" - }, - { - "file": "cde-kungfus/le_gun_fu.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Le Gun-fu", - "current_end": "dés-fastes à cet effet, il ignore alors 2 dés de malus dus à la perte de Zing et/ou de San. S’il s’agit d’un PNJ, il réc", - "current_preview": "Pris dans une fusillade, le pratiquant se concentre sur sa survie malgré les blessures éventuelles. Quelle que soit son action, lorsque le personnage fait son jet, il ignore 1 dé de malus dû à la pert", - "pdf_context": "git d’un PNJ, il récupère 1 point de Vitalité. tesse fulgurante. Cette action d’attaque du personnage lui coûte 2 crans d’initiative (au lieu de 3). La Forme des Couteaux papillon L’Épée (TaaigikduGim Faîte Orientation : Yin " - }, - { - "file": "cde-kungfus/le_gun_fu.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Le Gun-fu", - "current_end": "tal Compétence : Combat à distance Spécialité : Pistolet, Fusil Le Gun Kata est une technique de tir conçue pour maximis", - "current_preview": "Vidant ses chargeurs dans un déluge de plomb, le pratiquant s’assure d’occasionner le maximum de dommages. Le personnage inflige des dégâts supplémentaires égaux à sa valeur de Métal (ou d’Aptitude ma", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_gun_fu.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Le Gun-fu", - "current_end": "sse de distance longue à distance extrême, et les dégâts des armes à feu sont augmentés de 1 à portée courte. Techniques", - "current_preview": "Sa célérité et ses angles de tir improbables permettent au pratiquant de toucher des cibles qui semblent hors d’atteinte. La portée des attaques du personnage passe de distance longue à distance extrê", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_gun_fu.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Le Gun-fu", - "current_text": "

Vidant ses chargeurs dans un déluge de plomb, le pratiquant s’assure d’occasionner le maximum de dommages. Le personnage inflige des dégâts supplémentaires égaux à sa valeur de Métal (ou d’Aptitude martiale pour un PNJ) sur une attaque réussie. Le Gun Kata Orientation : Yin Aspect : Métal Compétence : Combat à distance Spécialité : Pistolet, Fusil Le Gun Kata est une technique de tir conçue pour maximis

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/le_gun_kata.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Le Gun Kata", - "current_end": "en une partie du système de jeu qu’une porte ouverte vers de multiples occasions d’impliquer plus étroitement les PJ dan", - "current_preview": "Le Gun Kata enseigne à viser en une fraction de seconde avant d’appuyer sur la détente. Le personnage ajoute au résultat de son jet d’attaque (qu’il soit réussi ou non) autant de dés-fastes que sa val", - "pdf_context": "ment les PJ dans le contexte de Hong Kong. 283 a g i e la m 1 0 p i tre cha La magie que maîtrisent les fat si est l’un des aspects essentiels de Hong Kong – Les Chroniques de l’Étrange – dont l’univers baigne dans l’occulte et le surnaturel. Ce chapitre détaille les règles qui gouvernent l’usage des diverses magies dont peuven" - }, - { - "file": "cde-kungfus/le_gun_kata.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Le Gun Kata", - "current_end": " dans le chasse-mouches sans cesser ma danse martiale – devenant en quelque sorte un aimant à énergie Yin. » — La Résurr", - "current_preview": "Le pratiquant tire de façon à avantager ses alliés. Lorsqu’il utilise l’action d’Aide, le personnage octroie 3 dés supplémentaires à lancer au lieu de 2 (ou donne un + 3 à l’Aptitude adaptée pour un P", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_jeet_kune_do_zit_kyun_dou.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Le Jeet Kune Do (Zit Kyun Dou)", - "current_end": " dés-fastes de son action d’attaque (qu’elle soit réussie ou non) pour faire perdre des crans d’initiative à sa cible (à", - "current_preview": "Le pratiquant cherche à tout prix à garder l’Initiative pour ne laisser aucune opportunité à son adversaire. Le personnage peut dépenser les dés-fastes de son action d’attaque (qu’elle soit réussie ou", - "pdf_context": "dre des crans d’initiative à sa cible (à raison Les incessantes piqûres de 1 pour 1, maximum 3). Activation : Dés-fastes Devant sans cesse esquiver les dards du Décider de la retraite pratiquant, son adversaire perd l’Initiative. Le Activation : Action de défense personnage peut dépenser les dés-fastes de son Garder la bonne distance avec son adversaire action d’attaque (qu’elle soit réussie ou non) est essentiel pour le pratiquant afin de tirer le pour faire " - }, - { - "file": "cde-kungfus/le_jeet_kune_do_zit_kyun_dou.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Le Jeet Kune Do (Zit Kyun Dou)", - "current_end": "ois Compétence : Kung-fu Spécialité : Mains Nues La Boxe de la Forme et de la Pensée aurait vu le jour dans le nord de l", - "current_preview": "Le Jeet Kune Do se base sur une totale adaptabilité et réactivité du pratiquant. Quelle que soit son action, le personnage peut annuler sur le résultat du jet un nombre de dés-néfastes égal à sa valeu", - "pdf_context": "ur dans le nord de la Chine, durant les server l’essentiel du Jeet Kune Do en dehors des dernières décennies de la dynastie Ming. Son « lignées officielles ». fondateur s’est appuyé sur les célèbres tech- Le Jeet Kune Do est un art martial très niques de combat à la lance du général Yue Fei réactif, qui repose sur l’interception des coups pour développer un art du combat à mains nues adverses s’accompagnant de contre-" - }, - { - "file": "cde-kungfus/le_jeet_kune_do_zit_kyun_dou.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Le Jeet Kune Do (Zit Kyun Dou)", - "current_end": "upplémentaire au résultat de ses jets d’attaque et de défense et inflige 1 dégât supplémentaire à mains nues. Techniques", - "current_preview": "Bruce Lee a fait du Jeet Kune Do un art martial des plus adaptables. Le personnage obtient automatiquement 1 dé-faste supplémentaire au résultat de ses jets d’attaque et de défense et inflige 1 dégât ", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_jeet_kune_do_zit_kyun_dou.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Le Jeet Kune Do (Zit Kyun Dou)", - "current_text": "

Le Jeet Kune Do se base sur une totale adaptabilité et réactivité du pratiquant. Quelle que soit son action, le personnage peut annuler sur le résultat du jet un nombre de dés-néfastes égal à sa valeur d’Eau (ou d’Aptitude mentale pour un PNJ). BoxePensée de la(Jingji FormeKyun et ) de la Orientation : Yang Aspect : Bois Compétence : Kung-fu Spécialité : Mains Nues La Boxe de la Forme et de la Pensée aurait vu le jour dans le nord de l

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/le_seot_gaau.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Le Seot Gaau", - "current_end": "gâts infligés. Les dégâts à mains nues du personnage sont égaux à sa valeur d’Eau (ou d’Aptitude mentale pour un PNJ) au", - "current_preview": "Les clés et torsions appliquées par le pratiquant se révèlent particulièrement douloureuses et handicapantes. Si cette attaque réussit, la cible perd 2 points de Hei (l’éventuelle répartition en Yin e", - "pdf_context": "u (ou d’Aptitude mentale pour un PNJ) au lieu de 1 pour cette attaque. le système de combat La résistance du bois Activation : Réaction Immobile comme une statue, le pratiquant reste ramassé afin de guetter l’occasion de porter un coup fulgurant. S’il choisit de ne pas utiliser d’action de défense contre une attaque, le personnage utilise sa valeur de Bois (ou d’Ap- titude spirituelle pour un PNJ) pour fixer la dif- ficulté pour le toucher (au lieu de la difficult" - }, - { - "file": "cde-kungfus/le_seot_gaau.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Le Seot Gaau", - "current_end": "sonnage est réussie, son agresseur est projeté à distance courte. S’il dépense 2 dés-fastes à cet effet, l’agresseur est", - "current_preview": "Le pratiquant profite des attaques de son adversaire pour le saisir et lui porter une prise vigoureuse. Si l’action de défense du personnage est réussie, son agresseur est projeté à distance courte. S", - "pdf_context": "dés-fastes à cet effet, l’agresseur est projeté à distance médiane. Orientation : Yang Aspect : Feu Compétence : Combat à distance Les Éclairs de Leoi Gung Spécialité : Arme de jet Le nom de cet art martial se réfère aux armes O" - }, - { - "file": "cde-kungfus/le_seot_gaau.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Le Seot Gaau", - "current_end": "ect : Terre Compétence : Kung-fu Spécialité : Mains Nues Style à l’histoire mal connue, on dit que la pratique du Kung-f", - "current_preview": "Le pratiquant parvient à bloquer brièvement un adversaire de façon à permettre à un allié de lui porter une attaque. Lorsqu’il utilise l’action d’Aide, le personnage octroie autant de dés supplémentai", - "pdf_context": "tique du Kung-fu de l’Invulnérabilité re- sonnage sont égaux à sa valeur d’Eau (ou d’Aptitude monterait à l’époque de la dynastie Song. Très mentale pour un PNJ) au lieu de 1 pour cette attaque. populaire parmi les pratiquants de toutes les époques, il en existe d’innombrables variantes Éloigner le danger aux noms ronflants, mais ses principes de base Activati" - }, - { - "file": "cde-kungfus/le_seot_gaau.json", - "field": "system.style", - "issue": "bleeding_watermark", - "item_name": "Le Seot Gaau", - "current_text": "L’objectif du Seot Gaau est de gêner les mouvements de l’opposant par l’application de clés, d’immobilisations, de saisies… Le personnage obtient automatiquement 2 dés-fastes supplémentaires sur ses actions de défense, qu’elles soient réussies ou non. s ue niq e o hr ng s c ra le l’ét de", - "plain_text": "L’objectif du Seot Gaau est de gêner les mouvements de l’opposant par l’application de clés, d’immobilisations, de saisies… Le personnage obtient automatiquement 2 dés-fastes supplémentaires sur ses actions de défense, qu’elles soient réussies ou non. s ue niq e o hr ng s c ra le l’ét de", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_seot_gaau.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Le Seot Gaau", - "current_end": "fastes supplémentaires sur ses actions de défense, qu’elles soient réussies ou non. s ue niq e o hr ng s c ra le l’ét de", - "current_preview": "L’objectif du Seot Gaau est de gêner les mouvements de l’opposant par l’application de clés, d’immobilisations, de saisies… Le personnage obtient automatiquement 2 dés-fastes supplémentaires sur ses a", - "pdf_context": null - }, - { - "file": "cde-kungfus/le_seot_gaau.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Le Seot Gaau", - "current_text": "

Le pratiquant parvient à bloquer brièvement un adversaire de façon à permettre à un allié de lui porter une attaque. Lorsqu’il utilise l’action d’Aide, le personnage octroie autant de dés supplémentaires à lancer que sa valeur de Feu (ou d’Aptitude sociale pour un PNJ) au lieu de 2 (ou ajoute ce bonus à l’Aptitude martiale pour un PNJ au lieu de + 2) au personnage qu’il assiste. Ce bonus est obtenu uniquement sur la prochaine attaque visant la cible immobilisée. Kung-fu de l’Invulnérabilité O", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/les_eclairs_de_leoi_gung.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Les Éclairs de Leoi Gung", - "current_end": "age ajoute au résultat de son jet d’attaque (qu’il soit réussi ou non) autant de dés-fastes que sa valeur de Feu (ou d’A", - "current_preview": "Lorsqu’il décoche sa flèche, le pratiquant est certain de frapper sa cible. Le personnage ajoute au résultat de son jet d’attaque (qu’il soit réussi ou non) autant de dés-fastes que sa valeur de Feu (", - "pdf_context": "aleur de Feu (ou d’Aptitude sociale pour un nage pour infliger des dégâts supplémentaires PNJ) au lieu de 1 pour cette attaque. (à raison de 1 pour 1) lors de cette attaque. De plus, les dégâts à mains nues du personnage sont égaux à sa valeur de Métal (ou d’Aptitude La Boxe du Faîte ) suprême " - }, - { - "file": "cde-kungfus/les_eclairs_de_leoi_gung.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Les Éclairs de Leoi Gung", - "current_end": "tiquant décoche ses flèches avec une grande célérité. Cette action d’attaque du personnage lui coûte 2 crans d’initiativ", - "current_preview": "Crachant la foudre sur ses cibles, le pratiquant décoche ses flèches avec une grande célérité. Cette action d’attaque du personnage lui coûte 2 crans d’initiativ", - "pdf_context": "personnage lui coûte 2 crans d’initiative (au lieu de 3). La Forme des Couteaux papillon L’Épée (TaaigikduGim Faîte Orientation : Yin ) suprême Aspect : Métal Compétence : Kung-fu Orientation : Yin Spécialité : Poi" - }, - { - "file": "cde-kungfus/les_eclairs_de_leoi_gung.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Les Éclairs de Leoi Gung", - "current_end": "eu Compétence : Combat à distance Spécialité : Arme de jet Le nom de cet art martial se réfère aux armes de jet – tels l", - "current_preview": "Concentré à l’extrême, le pratiquant parvient à décocher ses flèches même dans un environnement peu favorable. Le personnage peut annuler, sur le résultat d’un jet d’attaque, un nombre de dés-néfastes", - "pdf_context": "de jet – tels les dards, pointes, étoiles en fer Aspect : Bois ou billes de plomb. Il s’agissait à l’origine d’une Compétence : Combat à distance technique d’assassin, de tels projectiles pouvant Spécialité : Arc aisément se dissimuler dans les plis d’un vête- Ce style particulier de tir à l’arc doit sa créa- ment et s’enduire de poison. tion à un jeu" - }, - { - "file": "cde-kungfus/les_eclairs_de_leoi_gung.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Les Éclairs de Leoi Gung", - "current_end": "de martiale pour un PNJ) avant d’avoir à recharger. De plus, ses dégâts à l’arc sont toujours augmentés de 1. Techniques", - "current_preview": "Le pratiquant sait enchaîner les tirs avec célérité, en gardant plusieurs flèches à la main. Le personnage peut tirer autant de fois que sa valeur de Métal (ou d’Aptitude martiale pour un PNJ) avant d", - "pdf_context": null - }, - { - "file": "cde-kungfus/les_eclairs_de_leoi_gung.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Les Éclairs de Leoi Gung", - "current_text": "

Concentré à l’extrême, le pratiquant parvient à décocher ses flèches même dans un environnement peu favorable. Le personnage peut annuler, sur le résultat d’un jet d’attaque, un nombre de dés-néfastes égal à sa valeur de Terre (ou d’Aptitude physique), qu’il soit réussi ou non. Les Mille Frelons Orientation : Yang Aspect : Feu Compétence : Combat à distance Spécialité : Arme de jet Le nom de cet art martial se réfère aux armes de jet – tels l

", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/les_mille_frelons.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Les Mille Frelons", - "current_end": "u’elle soit réussie ou non) pour faire perdre des crans d’initiative à sa cible (à raison de 1 pour 1, maximum 3). Les P", - "current_preview": "Devant sans cesse esquiver les dards du pratiquant, son adversaire perd l’Initiative. Le personnage peut dépenser les dés-fastes de son action d’attaque (qu’elle soit réussie ou non) pour faire perdre", - "pdf_context": null - }, - { - "file": "cde-kungfus/les_mille_frelons.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Les Mille Frelons", - "current_end": "dépense 2 dés-fastes à cet effet, l’arme est projetée à distance médiane. L’attaque inflige ensuite normalement ses dégâ", - "current_preview": "Le pratiquant prend ses précautions en privant l’adversaire de ses avantages par un lancer précis. Sur une attaque réussie jusqu’à distance longue, le personnage désarme son adversaire et l’arme est p", - "pdf_context": "e ensuite normalement ses dégâts. pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1). La lame s’envole Activation : Action de défense L’équilibre contre le déséquilibre Lorsqu’il affronte un combattant armé, le Activation : Dés-fastes pratiquant prend bien garde à le priver de cet Esquivant les attaques de f" - }, - { - "file": "cde-kungfus/les_poignards_volants.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Les Poignards volants", - "current_end": "istance longue, et les dégâts de ses\nattaques aux poignards sont augmentés de 1. \n Techniques Activation : Dés-fastes\nLe", - "current_preview": "Sachant comment dissimuler et projeter ses\narmes dans toutes les situations, le pratiquant\nest toujours en position d’attaquer. Même ligoté,\nimmobilisé, fouillé et privé de ses armes ou encore aveuglé", - "pdf_context": null - }, - { - "file": "cde-kungfus/les_poignards_volants.json", - "field": "system.techniques.technique2.technique", - "issue": "unwanted_newlines", - "item_name": "Les Poignards volants", - "current_text": "

Sachant comment dissimuler et projeter ses\narmes dans toutes les situations, le pratiquant\nest toujours en position d’attaquer. Même ligoté,\nimmobilisé, fouillé et privé de ses armes ou encore aveuglé, il peut activer cette Technique en\ndépensant 1 point de Hei normalement et ainsi\neffectuer tout de même une action d’attaque. attaques du personnage passe de distance médiane à distance longue, e", - "plain_text": "Sachant comment dissimuler et projeter ses\narmes dans toutes les situations, le pratiquant\nest toujours en position d’attaquer. Même ligoté,\nimmobilisé, fouillé et privé de ses armes ou encore aveuglé" - }, - { - "file": "cde-kungfus/les_poignards_volants.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Les Poignards volants", - "current_end": "chette\nTrès répandu au sein des triades dès leurs\norigines, cet art martial vise à faire d’un poignard ou d’une hachette", - "current_preview": "Garder la bonne distance avec son adversaire\nest essentiel pour le pratiquant afin de tirer le\nmeilleur parti de ses armes. Le personnage obtient immédiatement après son action de défense\nune action d", - "pdf_context": "rd ou d’une hachette, une arme de jet redou- tablement efficace. Des techniques de jonglerie inspirées des artistes itinérants posèrent les bases de cette technique qui se répandit alors dans le milieu criminel chinois. De par leur poids, poignards et hachettes disposent d’une force d’impact redoutable. Le but des Poignards volants est d’optimiser cette caractéristique afin de transformer ces armes en projectiles mortels, tout en gardant une bonne précision. Style Le pratiquant des Poignards volants utili" - }, - { - "file": "cde-kungfus/les_poignards_volants.json", - "field": "system.techniques.technique3.technique", - "issue": "unwanted_newlines", - "item_name": "Les Poignards volants", - "current_text": "

Garder la bonne distance avec son adversaire\nest essentiel pour le pratiquant afin de tirer le\nmeilleur parti de ses armes. Le personnage obtient immédiatement après son action de défense\nune action de déplacement gratuite (donc sans\ndépenser de crans d’initiative supplémentaires). Orientation : Yin ou Yang\nAspect : Terre\nCompétence : Combat à distance\nSpécialité : Poignard, Hachette\nTrès répan", - "plain_text": "Garder la bonne distance avec son adversaire\nest essentiel pour le pratiquant afin de tirer le\nmeilleur parti de ses armes. Le personnage obtient immédiatement après son action de défense\nune action d" - }, - { - "file": "cde-kungfus/les_poignards_volants.json", - "field": "system.style", - "issue": "bleeding_watermark", - "item_name": "Les Poignards volants", - "current_text": "Le pratiquant des Poignards volants utilise sa puissance pour frapper ses cibles même quand celles-ci semblent hors d’atteinte. La portée des s ue niq e o hr ng s c ra le l’ét de Le Gun-fu Orientation : Yin Aspect : Eau Compétence : Combat à distance Spécialité : Pistolet, Fusil En l’espace d’une génération, il était inévitable que les amateurs des films d’action de", - "plain_text": "Le pratiquant des Poignards volants utilise sa puissance pour frapper ses cibles même quand celles-ci semblent hors d’atteinte. La portée des s ue niq e o hr ng s c ra le l’ét de Le Gun-fu Orientation : Yin Aspect : Eau Compétence : Combat à distance Spécialité : Pistolet, Fusil En l’espace d’une gé", - "pdf_context": null - }, - { - "file": "cde-kungfus/les_poignards_volants.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Les Poignards volants", - "current_end": "ce Spécialité : Pistolet, Fusil En l’espace d’une génération, il était inévitable que les amateurs des films d’action de", - "current_preview": "Le pratiquant des Poignards volants utilise sa puissance pour frapper ses cibles même quand celles-ci semblent hors d’atteinte. La portée des s ue niq e o hr ng s c ra le l’ét de Le Gun-fu Orientation", - "pdf_context": null - }, - { - "file": "cde-kungfus/les_poignards_volants.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Les Poignards volants", - "current_text": "

Garder la bonne distance avec son adversaire\nest essentiel pour le pratiquant afin de tirer le\nmeilleur parti de ses armes. Le personnage obtient immédiatement après son action de défense\nune action de déplacement gratuite (donc sans\ndépenser de crans d’initiative supplémentaires). Orientation : Yin ou Yang\nAspect : Terre\nCompétence : Combat à distance\nSpécialité : Poignard, Hachette\nTrès répandu au sein des triades dès leurs\norigines, cet art martial vise à faire d’un poignard ou d’une hache", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/les_trois_joyaux.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Les Trois Joyaux", - "current_end": "sultat de son jet de défense (qu’il soit réussi ou non) autant de dés-fastes que sa valeur de Terre (ou d’Aptitude physi", - "current_preview": "Imprévisible, la trajectoire du triple-bâton surprend l’adversaire même durant son attaque – on ne s’en approche qu’à ses risques et périls ! Le personnage ajoute au résultat de son jet de défense (qu", - "pdf_context": "de Terre (ou d’Aptitude physique pour un Activation : Action d’attaque PNJ) pour fixer la difficulté pour le toucher (au Dès qu’il se trouve dans la position idéale, lieu de la difficulté normale de 1). le pratiquant porte un coup de la main ouverte en délivrant toute sa puissance. Si cette attaque Le double coup de paume réussit, les dés-fastes dépensés par le person- Activation : Dégâts infligés nage pour augmenter ses dégâts comptent Le prat" - }, - { - "file": "cde-kungfus/les_trois_joyaux.json", - "field": "system.techniques.technique2.technique", - "issue": "truncated", - "item_name": "Les Trois Joyaux", - "current_end": "te. Si le personnage dépense 2 dés-fastes à cet effet, l’arme est projetée à distance médiane. L’attaque inflige ensuite", - "current_preview": "Le pratiquant utilise les sections de son triple-bâton pour piéger l’arme de son opposant et l’en délester. Sur une attaque à portée contact réussie, le personnage désarme son adversaire et l’arme est", - "pdf_context": "tance médiane. L’attaque inflige ensuite norma- sa prochaine action un nombre de dés-néfastes lement ses dégâts. égal à la valeur de Feu (ou d’Aptitude sociale pour un PNJ) du personnage. Si l’adversaire Assiéger la forteresse déclare qu’il se défend, les dés-néfastes restant Activation : Dés-fastes après un éventuel jet de dés peuvent être dé- Le pratiquant sait où viser pour gêner les pensés pour infliger immédiatement des dégâts mouvements de son adversaire. Le personnage supplémentair" - }, - { - "file": "cde-kungfus/les_trois_joyaux.json", - "field": "system.techniques.technique3.technique", - "issue": "truncated", - "item_name": "Les Trois Joyaux", - "current_end": "ect : Terre Compétence : Kung-fu Spécialité : Lance Héros de la dynastie Song, Yue Fei possède la réputation d’être l’un", - "current_preview": "Utilisé tel un fouet, le triple-bâton heurte cruellement les chevilles de l’opposant et l’envoie ainsi à terre. Sur une attaque réussie, le personnage fait tomber son adversaire et peut dépenser les d", - "pdf_context": "putation d’être l’un des plus grands guerriers physique pour un PNJ). de toute l’histoire de la Chine. De nombreux styles font remonter leurs origines à ce vaillant Le serpent se joue des griffes général. Lancier particulièrement doué, il est au Activation : Action d’attaque moins certain que la Lance loyale du général Yue Le pratiquant utilise les sections de son Fei soit due à" - }, - { - "file": "cde-kungfus/les_trois_joyaux.json", - "field": "system.style", - "issue": "truncated", - "item_name": "Les Trois Joyaux", - "current_end": "e-bâton est une arme de défense aussi solide qu’une armure de fer. Le personnage obtient une protection de 2. Techniques", - "current_preview": "Le triple-bâton est une arme de défense aussi solide qu’une armure de fer. Le personnage obtient une protection de 2. Techniques", - "pdf_context": null - }, - { - "file": "cde-kungfus/les_trois_joyaux.json", - "field": "system.techniques.technique3.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Les Trois Joyaux", - "current_text": "

Utilisé tel un fouet, le triple-bâton heurte cruellement les chevilles de l’opposant et l’envoie ainsi à terre. Sur une attaque réussie, le personnage fait tomber son adversaire et peut dépenser les dés-fastes obtenus à son action d’attaque pour faire perdre des crans d’initiative à sa cible (à raison de 1 pour 1, maximum 3). L’attaque inflige ensuite normalement ses dégâts. loyale du Lance Général Yue Fei Orientation : Yin ou Yang Aspect : Terre Compétence : Kung-fu Spécialité : Lance Héros ", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-kungfus/wing_chun_wing_ceon.json", - "field": "system.description", - "issue": "truncated", - "item_name": "Wing Chun (Wing Ceon)", - "current_end": " vitesse et la masse de son propre corps en utilisant la force de l’adversaire contre lui. Les coups offensifs du Wing C", - "current_preview": "Originaire du sud de la Chine et rendu très populaire au vingtième siècle par les films de Hong Kong, le Wing Chun existe sous de nombreuses formes. D’après la légende, c’est une nonne de Shaolin qui ", - "pdf_context": "Les coups offensifs du Wing Chun accordent En réalité, ce style repose entièrement sur les une importance accrue aux techniques de mains notions de mobilité et d’imprévisibilité. Il vise dans la grande majorité des courants connus. à déstabiliser l’adversaire, en prétendant effec- tuer des attaques ou des gardes maladroites. Style Ainsi, en dépit des apparences, il s’agit d’un art Ma" - }, - { - "file": "cde-kungfus/wing_chun_wing_ceon.json", - "field": "system.techniques.technique1.technique", - "issue": "bleeding_watermark", - "item_name": "Wing Chun (Wing Ceon)", - "current_text": "

Les coups assénés à un rythme soutenu par\nle pratiquant épuisent son adversaire. La cible\nperd 2 points de Hei (l’éventuelle répartition en\nYin et Yang est au choix du personnage touché)\nen plus des dégâts infligés. \n Techniques s\n\n\n\nhr ng\ns c ra\nle l’ét\nde Style\nLe déséquilibre du pratiquant est la clé de la\nBoxe de l’Ivresse. Le personnage élimine gratuitement 2 dés-néfastes sur ses actions ", - "plain_text": "Les coups assénés à un rythme soutenu par\nle pratiquant épuisent son adversaire. La cible\nperd 2 points de Hei (l’éventuelle répartition en\nYin et Yang est au choix du personnage touché)\nen plus des dégâts infligés. \n Techniques s\n\n\n\nhr ng\ns c ra\nle l’ét\nde Style\nLe déséquilibre du pratiquant est l", - "pdf_context": null - }, - { - "file": "cde-kungfus/wing_chun_wing_ceon.json", - "field": "system.techniques.technique1.technique", - "issue": "truncated", - "item_name": "Wing Chun (Wing Ceon)", - "current_end": "s sur ses actions d’attaque,\nqu’elles soient réussies ou non. Techniques Chuter du ciel Activation : Dés-fastes\nLui-même", - "current_preview": "Les coups assénés à un rythme soutenu par\nle pratiquant épuisent son adversaire. La cible\nperd 2 points de Hei (l’éventuelle répartition en\nYin et Yang est au choix du personnage touché)\nen plus des d", - "pdf_context": null - }, - { - "file": "cde-kungfus/wing_chun_wing_ceon.json", - "field": "system.techniques.technique1.technique", - "issue": "unwanted_newlines", - "item_name": "Wing Chun (Wing Ceon)", - "current_text": "

Les coups assénés à un rythme soutenu par\nle pratiquant épuisent son adversaire. La cible\nperd 2 points de Hei (l’éventuelle répartition en\nYin et Yang est au choix du personnage touché)\nen plus des dégâts infligés. \n Techniques s\n\n\n\nhr ng\ns c ra\nle l’ét\nde Style\nLe déséquilibre du pratiquant est la clé de la\nBoxe de l’Ivresse. Le personnage élimine gratuitement 2 dés-néfastes sur ses actions ", - "plain_text": "Les coups assénés à un rythme soutenu par\nle pratiquant épuisent son adversaire. La cible\nperd 2 points de Hei (l’éventuelle répartition en\nYin et Yang est au choix du personnage touché)\nen plus des d" - }, - { - "file": "cde-kungfus/wing_chun_wing_ceon.json", - "field": "system.techniques.technique1.technique", - "issue": "bleeding_style_or_orientation", - "item_name": "Wing Chun (Wing Ceon)", - "current_text": "

Les coups assénés à un rythme soutenu par\nle pratiquant épuisent son adversaire. La cible\nperd 2 points de Hei (l’éventuelle répartition en\nYin et Yang est au choix du personnage touché)\nen plus des dégâts infligés. \n Techniques s\n\n\n\nhr ng\ns c ra\nle l’ét\nde Style\nLe déséquilibre du pratiquant est la clé de la\nBoxe de l’Ivresse. Le personnage élimine gratuitement 2 dés-néfastes sur ses actions d’attaque,\nqu’elles soient réussies ou non. Techniques Chuter du ciel Activation : Dés-fastes\nLui-mê", - "note": "Contains 'Style' or 'Orientation' — extra text from PDF page layout" - }, - { - "file": "cde-spells/alchemy_acupuncture.json", - "field": "system.description", - "issue": "missing_beginning", - "item_name": "Acupuncture", - "current_start": "de l’impact sur le scénario – à la discrétion du MJ). • Rétablir l’équilibre (3 points) : diminue de 1 point la valeur d’une source de dégâts physique", - "pdf_context_before": null - }, - { - "file": "cde-spells/alchemy_acupuncture.json", - "field": "system.effects", - "issue": "missing_beginning", - "item_name": "Acupuncture", - "current_start": "n’est pas aisé de s’affecter soi-mêmeavec les sorts de cette Spécialité, quicible habituellement d’autres personnages (PJ ou PNJ). Si un fat si souhai", - "pdf_context_before": "ints vitaux et mé- dans un même sort en payant le coût indiqué entre ridiens d’énergie, aiguilles (or, argent, parenthèses. Ainsi, il devient possible de soigner etc.) une maladie en diminuant la valeur de la source 怪 Effets : de dégâts récurrents d’une valeur de 2, la rédui- • Il n’est pas aisé de s’affecter s" - }, - { - "file": "cde-spells/alchemy_acupuncture.json", - "field": "system.effects", - "issue": "truncated", - "item_name": "Acupuncture", - "current_end": "es怪 Temps de réalisation (accéléré) : boire unélixir déjà préparé, ceux-ci sont stockableset transférables怪 Flash-back :", - "current_preview": "n’est pas aisé de s’affecter soi-mêmeavec les sorts de cette Spécialité, quicible habituellement d’autres personnages (PJ ou PNJ). Si un fat si souhaitel’utiliser sur lui-même, la difficulté dujet de ", - "pdf_context": null - }, - { - "file": "cde-spells/alchemy_arsenal.json", - "field": "system.description", - "issue": "missing_beginning", - "item_name": "Arsenal", - "current_start": "aucun dé à lancer (ou si son Aptitude physique est réduite à 0 dans le cas d’un PNJ), elle ne peut pas agir et se trouve totalement paralysée même si ", - "pdf_context_before": "émentaire au-delà du nombre de dés à lancer lors d’actions premier) (+ 2 points pour affecter jusqu’à particulières (liées à un Aspect ou une 3 cibles proches, + 2 points supplémentaires Compétence) – comme le ferait une pour affecter 5 cibles) – si la cible n’a plus potion gelant des parties du corps de aucun dé à lancer (ou si son Aptitude ph" - }, - { - "file": "cde-spells/alchemy_arsenal.json", - "field": "system.effects", - "issue": "bleeding_watermark", - "item_name": "Arsenal", - "current_text": "

Effet « Trois Trésors » transcrit les

dégâts physiques que provoque l’arme.

provoquée par l’arme en imposant

des dés-néfastes ou en diminuant le

nombre de dés à lancer lors d’actions

particulières (liées à un Aspect ou une

Compétence) – comme le ferait une

potion gelant des parties du corps de

la", - "plain_text": "Effet « Trois Trésors » transcrit lesdégâts physiques que provoque l’arme.L’Effet « malus » traduit une gêneprovoquée par l’arme en imposantdes dés-néfastes ou en diminuant lenombre de dés à lancer lors d’actionsparticulières (liées à un Aspect ou uneCompétence) – comme le ferait unepotion gelant de", - "pdf_context": "Les effets de ces préparations sont toujours en lien avec les cinq éléments de la tradition taoïste. Voici une liste non-exhaustive de philtres 怪 Élément associé : Bois utiles, avec leur coût en Puissance : 怪 Hei : Yang • Philtre de poings d’acier (3 points) : permet 怪 Temps de réalisation (rituel) : 4 heures au bénéficiaire d’occasionner 1 dégât supplé- " - }, - { - "file": "cde-spells/alchemy_arsenal.json", - "field": "system.effects", - "issue": "truncated", - "item_name": "Arsenal", - "current_end": "ses poings de fer, devenir translucide, se contorsionner comme desbranches flexibles, etc.Les effets de ces préparations", - "current_preview": "Effet « Trois Trésors » transcrit lesdégâts physiques que provoque l’arme.L’Effet « malus » traduit une gêneprovoquée par l’arme en imposantdes dés-néfastes ou en diminuant lenombre de dés à lancer lo", - "pdf_context": "Les effets de ces préparations sont toujours en lien avec les cinq éléments de la tradition taoïste. Voici une liste non-exhaustive de philtres 怪 Élément associé : Bois utiles, avec leur coût en Puissance : 怪 Hei : Yang • Philtre de poings d’acier (3 points) : permet 怪 Temps de réalisation (rituel) : 4 heures au bénéficiaire d’occasionner 1 dégât supplé- " - }, - { - "file": "cde-spells/alchemy_arsenal.json", - "field": "system.components", - "issue": "truncated", - "item_name": "Arsenal", - "current_end": ", plomb, etc.)Objets : livre de recettes, instrumentsd’alchimie (fioles, tubes, balance, pilon,etc.) anciens ou modernes", - "current_preview": "Mots : prière à Sannung, prière à LeoiDungban, prière à Gwaan DaiGestes : gestes rituels de concoction despréparations magiquesÉtat d’esprit : concentration, penséesmartialesConsommables : herbes (urt", - "pdf_context": "anciens ou modernes 303 s ue o niq e hr ng s c ra le l’ét de 怪 Effets : • Élixir de bénédiction du métal (4 points) : le • L’Effet « Trois Trésors » indique le Zing, bénéficiaire gagne 1 dé-faste gratuit à tous ses le San ou le Hei (un panachage est pos- " - }, - { - "file": "cde-spells/alchemy_elixirs.json", - "field": "system.effects", - "issue": "missing_beginning", - "item_name": "Élixirs", - "current_start": "fet « Trois Trésors » indique le Zing,le San ou le Hei (un panachage est possible) que la personne avalant la potionrécupère de façon immédiate.L’Effe", - "pdf_context_before": " tier, etc.) anciens ou modernes 303 s ue o niq e hr ng s c ra le l’ét de 怪 Effets : • Élixir de bénédiction du métal (4 points) : le • L’Effet « Trois Trésors » indique" - }, - { - "file": "cde-spells/alchemy_elixirs.json", - "field": "system.examples", - "issue": "truncated", - "item_name": "Élixirs", - "current_end": ") : 4 heures怪 Temps de réalisation (accéléré) : utiliser unpoison déjà préparé, ceux-ci sont stockableset transférables怪", - "current_preview": "Voici une liste non exhaustive de potionsutiles, avec leur coût en Puissance :Potion de soin physique (2 points) : le bénéficiaire récupère 1 point de Zing (+ 2 pointspar point de Zing supplémentaire ", - "pdf_context": null - }, - { - "file": "cde-spells/alchemy_elixirs.json", - "field": "system.components", - "issue": "bleeding_watermark", - "item_name": "Élixirs", - "current_text": "

Dungban, citation du Wong Ting Ging

élixirs

expérimentale

etc.), minéraux (cinabre, jade, etc.), alcool