Compare commits

..

18 Commits

Author SHA1 Message Date
uberwald 9617005a5c Finalisation du système
Release Creation / build (release) Successful in 1m24s
2026-05-06 22:37:40 +02:00
uberwald 73a3381d2a Import des persos du système précédent 2026-05-06 21:31:03 +02:00
uberwald fbfb265570 Sync compendiums 2026-05-06 20:27:40 +02:00
uberwald eda9b77f46 Avec initiative
Release Creation / build (release) Successful in 1m10s
2026-04-29 22:21:41 +02:00
uberwald 64ab54daf3 Avec initiative 2026-04-29 22:20:47 +02:00
uberwald 0e1594773b Actualiser README.md 2026-04-27 21:43:53 +02:00
uberwald 7f5beb401e Correction compendiums 2026-04-27 21:38:40 +02:00
uberwald a606d62904 Prepare for release' 2026-04-27 21:34:15 +02:00
uberwald bc49286f91 Correction compendiums 2026-04-27 21:30:33 +02:00
uberwald 1e252ff6f2 Correction compendiums 2026-04-27 17:49:00 +02:00
uberwald d12a7debdf Fix release process
Release Creation / build (release) Successful in 1m19s
2026-04-23 20:46:22 +02:00
uberwald 30d9e4e4df Fix release process 2026-04-23 20:46:13 +02:00
uberwald 606b38e022 fix: Track package-lock.json to enable npm ci in CI/CD
Release Creation / build (release) Successful in 1m20s
Retire package-lock.json du .gitignore afin que npm ci puisse
fonctionner dans le workflow de release Gitea.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-01 09:19:35 +02:00
uberwald 4d9fa45ab6 AJout workflow
Release Creation / build (release) Failing after 2m18s
2026-04-01 09:05:20 +02:00
uberwald 8a4e0ba0e4 ci: Make pack compilation explicit in release workflow
Remplace npm run build:full par 3 étapes séparées et nommées :
- Install dependencies (npm ci)
- Compile compendium packs (npm run pack:compile)
- Build CSS and JavaScript (npm run build)

Les compendiums sont désormais générés à la volée depuis packs-src/
à chaque release, indépendamment de l'état commité de packs/.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-01 08:51:39 +02:00
uberwald 93df69a43e ci: Add Gitea release workflow
Adapté depuis fvtt-te-deum, avec :
- Étape npm ci + npm run build:full (compilation CSS et packs)
- Zip incluant css/ fonts/ images/ lang/ packs/ src/ templates/
- Substitution version/manifest/download dans system.json
- Publication sur le serveur FoundryVTT (compatibility 13)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-01 08:46:49 +02:00
uberwald 6a5819b905 Ajout des compendiums et cleanup des images 2026-04-01 08:41:40 +02:00
uberwald 389d4b8008 feat: Add per-type NPC icons + update compendium icons
6 new SVG icons in images/icons/, one per NPC type:
- icon-npc-esprit-animal.svg (amber) — paw print + yin-yang
- icon-npc-fantome.svg (cyan) — ghost silhouette + 鬼 character
- icon-npc-demon.svg (red) — horned demon face
- icon-npc-jiugwaai.svg (emerald) — hybrid creature + 怪 character
- icon-npc-dieu.svg (gold) — divine halo + lotus
- icon-npc-mortel.svg (steel blue) — human silhouette + talisman

All 49 NPC JSON files updated with type-specific icon paths.
Pack cde-npcs recompiled.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-31 23:12:27 +02:00
238 changed files with 10210 additions and 453 deletions
+78
View File
@@ -0,0 +1,78 @@
name: Release Creation
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
- uses: https://github.com/RouxAntoine/checkout@v3.5.4
# Get part of the tag after the `v`
- name: Extract tag version number
id: get_version
uses: https://github.com/battila7/get-version-action@v2
- name: Setup Node.js
uses: https://github.com/actions/setup-node@v3
with:
node-version: "20"
- name: Install dependencies
run: npm ci
# Génération à la volée des compendiums (packs-src/ → packs/ LevelDB)
- name: Compile compendium packs
run: npm run pack:compile
# Compilation CSS (LESS → css/) et bundle JavaScript (src/ → dist/)
- name: Build CSS and JavaScript
run: npm run build
# Substitute the Manifest and Download URLs in the system.json
- name: Substitute Manifest and Download Links For Versioned Ones
id: sub_manifest_link_version
uses: https://github.com/microsoft/variable-substitution@v1
with:
files: "system.json"
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/${{gitea.repository}}
manifest: https://www.uberwald.me/gitea/uberwald/fvtt-chroniques-de-l-etrange/releases/download/latest/system.json
download: https://www.uberwald.me/gitea/uberwald/fvtt-chroniques-de-l-etrange/releases/download/${{github.event.release.tag_name}}/fvtt-chroniques-de-l-etrange.zip
# Create a zip file with all files required by the system
- run: |
apt update -y
apt install -y zip
- run: zip -r ./fvtt-chroniques-de-l-etrange.zip system.json README.md CHANGELOG.md LICENSE.txt css/ fonts/ images/ lang/ packs/ src/ templates/
- name: Setup Go
uses: https://github.com/actions/setup-go@v4
with:
go-version: ">=1.20.1"
- name: Upload release assets
id: use-go-action
uses: https://gitea.com/actions/release-action@main
with:
files: |-
./fvtt-chroniques-de-l-etrange.zip
system.json
api_key: "${{secrets.ALLOW_PUSH_RELEASE}}"
#- name: Publish to Foundry server
# uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
# with:
# #token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
# id: 'fvtt-chroniques-de-l-etrange'
# version: ${{github.event.release.tag_name}}
# manifest: 'https://www.uberwald.me/gitea/public/fvtt-chroniques-de-l-etrange/releases/download/latest/system.json'
# notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-chroniques-de-l-etrange.zip'
# compatibility-minimum: '13'
# compatibility-verified: '13'
+2 -1
View File
@@ -5,8 +5,9 @@
# Node Modules
node_modules/
package-lock.json
chroniquesdeletrange.lock
*.pdf
*.github/
regles.txt
regles.txt
+11 -2
View File
@@ -1,3 +1,12 @@
# Les Chroniques de l'étrange pour FoundryVTT
# Chroniques de l'étrange — Système FoundryVTT
Système [Foundry VTT](https://foundryvtt.com) pour **Chroniques de l'Etrange**, le jeu de rôle d'[Antre Monde Éditions](https://antremonde.fr).
Copyright 2025-2026 Antre Monde Editions All rights reserved
Chroniques de l'ETrange is a game written by Romain d'Huissier and Cédric Lameire. The authors retain their moral rights to this work in both print and digital formats.
This system for FoundryVTT has been approved and authorized by Antre-Monde Edition
---
Implémentation du JDR Les Chroniques de l'Etrange de Antre-Monde éditions.
+657 -1
View File
@@ -177,6 +177,11 @@
flex: 1 1 110px;
max-width: 200px;
}
.cde-stat-cell--wide {
flex: 1 1 100%;
max-width: 100%;
min-width: 0;
}
.cde-stat-label {
font-size: 10px;
font-family: "Averia", sans-serif;
@@ -205,6 +210,23 @@
.cde-stat-cell input:focus {
border-bottom-color: #00d4d4;
}
.cde-stat-cell textarea {
width: 100%;
background: transparent;
border: 1px solid #1a2436;
border-radius: 2px;
color: #e2e8f4;
font-size: 13px;
font-family: inherit;
padding: 4px 6px;
outline: none;
resize: vertical;
transition: border-color 0.15s;
line-height: 1.5;
}
.cde-stat-cell textarea:focus {
border-color: #ff3d5a;
}
.cde-stat-cell select {
width: 100%;
border: none;
@@ -385,7 +407,6 @@ section.npc .cde-neon-tabs .item.active {
display: none;
flex-direction: column;
gap: 12px;
min-height: 100%;
}
.cde-tab-body .tab.active {
display: flex;
@@ -1254,6 +1275,12 @@ section.npc .cde-neon-tabs .item.active {
width: auto;
height: auto;
opacity: 0.6;
cursor: zoom-in;
transition: opacity 0.2s ease, box-shadow 0.2s ease;
}
.cde-loksyu-standalone .cde-loksyu-visual-row .cde-lok-visual:hover {
opacity: 0.9;
box-shadow: 0 0 10px #263853;
}
.cde-loksyu-standalone .cde-lok-footer {
display: flex;
@@ -3080,6 +3107,12 @@ strong.ellipsis {
max-height: 180px;
opacity: 0.45;
border-radius: 4px;
cursor: zoom-in;
transition: opacity 0.2s ease, box-shadow 0.2s ease;
}
.cde-nghang-diagram img:hover {
opacity: 0.85;
box-shadow: 0 0 12px #263853;
}
.img-die-sm {
width: 27px !important;
@@ -3800,3 +3833,626 @@ ol.item-list li.item .item-controls a.item-control:hover {
color: #ff3d5a;
text-shadow: 0 0 5px rgba(255, 61, 90, 0.4);
}
/* ============================================================
ROUE D'INITIATIVE — CDEWheelApp
============================================================ */
.cde-wheel-app {
color: #e2e8f4;
background: #080c14;
font-family: "Averia", "Averia Regular", sans-serif;
}
.cde-wheel-app .window-content {
padding: 0;
overflow: hidden;
}
/* Two-column layout: SVG wheel left, panel right */
.cde-wheel-layout {
display: flex;
height: 100%;
min-height: 520px;
}
/* ---- Left: SVG wheel ---- */
.cde-wheel-svg-container {
flex: 0 0 480px;
width: 480px;
padding: 12px 12px 6px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: #0d1520;
border-right: 1px solid #1a2436;
}
.cde-wheel-svg-container svg {
flex: 1 1 auto;
width: 100%;
max-width: 456px;
max-height: 456px;
overflow: visible;
}
.cde-wheel-svg-container .cde-wheel-legend {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 0 2px;
font-size: 11px;
color: rgba(255, 255, 255, 0.55);
flex-shrink: 0;
}
.cde-wheel-svg-container .cde-wheel-legend-dot {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.cde-wheel-svg-container .cde-wheel-segment {
stroke: #080c14;
stroke-width: 1.5;
transition: opacity 0.2s;
}
.cde-wheel-svg-container .cde-wheel-cran-label {
font-family: "Averia Regular", sans-serif;
font-size: 12px;
fill: rgba(255, 255, 255, 0.55);
text-anchor: middle;
dominant-baseline: central;
pointer-events: none;
user-select: none;
}
.cde-wheel-svg-container .cde-wheel-fighter-circle {
stroke-width: 2;
cursor: pointer;
transition: r 0.2s, stroke-width 0.2s;
}
.cde-wheel-svg-container .cde-wheel-fighter-circle:hover {
stroke-width: 3;
}
.cde-wheel-svg-container .cde-wheel-fighter-circle.is-active {
r: 18;
stroke-width: 3;
filter: drop-shadow(0 0 5px rgba(255, 255, 255, 0.7));
}
.cde-wheel-svg-container .cde-wheel-fighter-circle.is-turn {
stroke-dasharray: 3 2;
animation: cde-spin 4s linear infinite;
}
.cde-wheel-svg-container .cde-wheel-fighter-initial {
font-size: 13px;
font-weight: 700;
fill: #fff;
text-anchor: middle;
dominant-baseline: central;
pointer-events: none;
}
/* ---- Right: panel ---- */
.cde-wheel-panel {
flex: 1 1 auto;
display: flex;
flex-direction: column;
overflow: hidden;
padding: 0;
min-width: 0;
}
.cde-wheel-section-title {
padding: 7px 12px 6px;
border-bottom: 1px solid #1a2436;
background: #0d1520;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
color: #7d94b8;
border-left: 3px solid #4a9eff;
flex-shrink: 0;
}
.cde-wheel-section-title em {
font-style: normal;
color: #e2e8f4;
text-transform: none;
letter-spacing: 0;
font-size: 11px;
}
/* Combatant list */
.cde-wheel-combatants {
flex: 0 0 auto;
max-height: 130px;
overflow-y: auto;
border-bottom: 1px solid #1a2436;
}
.cde-wheel-combatant {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px 6px 9px;
cursor: pointer;
border-bottom: 1px solid rgba(26, 36, 54, 0.5);
border-left: 3px solid transparent;
transition: background 0.15s, border-color 0.15s;
}
.cde-wheel-combatant:last-child {
border-bottom: none;
}
.cde-wheel-combatant:hover {
background: #101622;
}
.cde-wheel-combatant.cde-wheel-combatant--selected {
background: rgba(74, 158, 255, 0.1);
border-left-color: #4a9eff;
}
.cde-wheel-combatant.cde-wheel-combatant--selected .cde-wheel-combatant-name {
color: #e2e8f4;
font-weight: 600;
}
.cde-wheel-combatant.cde-wheel-combatant--active .cde-wheel-active-marker {
color: #f0c040;
filter: drop-shadow(0 0 3px #f0c040);
}
.cde-wheel-combatant-img {
width: 30px;
height: 30px;
border-radius: 50%;
object-fit: cover;
border: 1.5px solid #263853;
flex-shrink: 0;
}
.cde-wheel-combatant-name {
flex: 1 1 auto;
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #7d94b8;
}
.cde-wheel-combatant-cran {
font-size: 11px;
font-weight: 700;
font-variant-numeric: tabular-nums;
flex-shrink: 0;
min-width: 22px;
text-align: center;
padding: 2px 6px;
border-radius: 12px;
line-height: 1.3;
}
.cde-wheel-active-marker {
font-size: 10px;
color: #7d94b8;
flex-shrink: 0;
}
/* Action area */
.cde-wheel-actions {
flex: 1 1 auto;
display: flex;
flex-direction: column;
overflow-y: auto;
padding: 8px 10px 10px;
gap: 6px;
}
.cde-wheel-actions.cde-wheel-actions--hint {
justify-content: center;
align-items: center;
}
.cde-wheel-hint {
color: #7d94b8;
font-size: 12px;
text-align: center;
font-style: italic;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.cde-wheel-hint i {
font-size: 22px;
opacity: 0.4;
}
.cde-wheel-action-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 5px;
}
.cde-wheel-action-btn {
display: flex;
align-items: center;
justify-content: space-between;
gap: 4px;
background: #101622;
border: 1px solid #263853;
border-radius: 5px;
color: #7d94b8;
font-size: 11px;
padding: 5px 7px;
cursor: pointer;
text-align: left;
transition: background 0.15s, border-color 0.15s, color 0.15s, box-shadow 0.15s;
font-family: inherit;
}
.cde-wheel-action-btn:hover {
color: #e2e8f4;
background: #1a2436;
border-color: #263853;
}
.cde-wheel-action-btn .cde-wheel-action-name {
flex: 1 1 auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cde-wheel-action-btn .cde-wheel-action-cost {
flex-shrink: 0;
font-weight: 700;
font-size: 10px;
padding: 1px 5px;
border-radius: 10px;
background: #263853;
color: #7d94b8;
line-height: 1.4;
}
.cde-wheel-action-btn[data-cost="1"]:hover {
box-shadow: 0 0 6px rgba(74, 158, 255, 0.22);
}
.cde-wheel-action-btn[data-cost="1"] .cde-wheel-action-cost {
background: #1a3d6a;
color: #6aadff;
}
.cde-wheel-action-btn[data-cost="2"]:hover {
box-shadow: 0 0 6px rgba(212, 160, 80, 0.25);
}
.cde-wheel-action-btn[data-cost="2"] .cde-wheel-action-cost {
background: #4a3200;
color: #d4a050;
}
.cde-wheel-action-btn[data-cost="3"]:hover {
box-shadow: 0 0 6px rgba(224, 96, 48, 0.28);
}
.cde-wheel-action-btn[data-cost="3"] .cde-wheel-action-cost {
background: #4a1800;
color: #e07840;
}
.cde-wheel-action-btn[data-cost="6"] {
border-color: rgba(204, 32, 64, 0.4);
}
.cde-wheel-action-btn[data-cost="6"]:hover {
box-shadow: 0 0 6px rgba(204, 32, 64, 0.35);
}
.cde-wheel-action-btn[data-cost="6"] .cde-wheel-action-cost {
background: #4a0814;
color: #e03050;
}
/* Special action buttons */
.cde-wheel-special-actions {
display: flex;
gap: 6px;
margin-top: 2px;
}
.cde-wheel-btn-roll,
.cde-wheel-btn-surprise {
flex: 1 1 0;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
border-radius: 5px;
font-size: 11px;
font-weight: 600;
padding: 7px 8px;
cursor: pointer;
font-family: inherit;
transition: background 0.15s, box-shadow 0.15s;
border: 1px solid;
}
.cde-wheel-btn-roll {
background: rgba(192, 138, 0, 0.14);
border-color: rgba(192, 138, 0, 0.5);
color: #e0b030;
}
.cde-wheel-btn-roll:hover {
background: rgba(192, 138, 0, 0.26);
box-shadow: 0 0 8px rgba(192, 138, 0, 0.4);
}
.cde-wheel-btn-surprise {
background: rgba(255, 61, 90, 0.12);
border-color: rgba(255, 61, 90, 0.45);
color: #ff3d5a;
}
.cde-wheel-btn-surprise:hover {
background: rgba(255, 61, 90, 0.24);
box-shadow: 0 0 8px rgba(255, 61, 90, 0.35);
}
/* No-combat empty state */
.cde-wheel-no-combat {
flex: 1 1 auto;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #7d94b8;
gap: 8px;
padding: 20px;
text-align: center;
font-size: 12px;
}
.cde-wheel-no-combat i {
font-size: 28px;
opacity: 0.4;
}
/* Spin animation for active-turn token */
@keyframes cde-spin {
from {
transform-origin: var(--fx) var(--fy);
transform: rotate(0deg);
}
to {
transform-origin: var(--fx) var(--fy);
transform: rotate(360deg);
}
}
/* ===================================================================
Migration App
=================================================================== */
.cde-migration-app .window-content {
padding: 0;
overflow-y: auto;
}
.cde-migration-body {
display: flex;
flex-direction: column;
gap: 12px;
padding: 16px;
}
/* Drop zone */
.cde-migration-drop-zone {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 28px 20px;
border: 2px dashed #1a2436;
border-radius: 8px;
background: rgba(13, 21, 32, 0.6);
text-align: center;
transition: border-color 0.15s, background 0.15s;
cursor: pointer;
}
.cde-migration-drop-zone.is-dragover {
border-color: #4a9eff;
background: rgba(74, 158, 255, 0.15);
}
.cde-migration-drop-icon {
font-size: 36px;
color: #4a9eff;
opacity: 0.7;
}
.cde-migration-drop-hint {
margin: 0;
font-size: 12px;
color: #7d94b8;
}
.cde-migration-file-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border: 1px solid #4a9eff;
border-radius: 4px;
color: #4a9eff;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s;
}
.cde-migration-file-btn:hover {
background: rgba(74, 158, 255, 0.2);
}
/* Preview section */
.cde-migration-preview {
border: 1px solid #1a2436;
border-radius: 6px;
overflow: hidden;
}
.cde-migration-preview-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
background: rgba(13, 21, 32, 0.8);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #7d94b8;
}
.cde-migration-clear-btn {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border: 1px solid #1a2436;
border-radius: 4px;
font-size: 11px;
color: #7d94b8;
background: none;
cursor: pointer;
transition: color 0.15s, border-color 0.15s;
}
.cde-migration-clear-btn:hover {
color: #e04444;
border-color: #e04444;
}
/* Preview table */
.cde-migration-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
.cde-migration-table th {
padding: 5px 8px;
background: rgba(13, 21, 32, 0.9);
color: #7d94b8;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
text-align: left;
border-bottom: 1px solid #1a2436;
}
.cde-migration-table td {
padding: 5px 8px;
border-bottom: 1px solid rgba(26, 36, 54, 0.4);
vertical-align: middle;
}
.cde-migration-table tr:last-child td {
border-bottom: none;
}
.cde-migration-thumb {
width: 28px;
height: 28px;
border-radius: 3px;
object-fit: cover;
}
.cde-migration-name {
font-weight: 600;
color: #e2e8f4;
}
.cde-migration-items-count {
text-align: center;
color: #7d94b8;
}
.cde-migration-srcfile {
font-size: 10px;
color: #7d94b8;
max-width: 130px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Type badge */
.cde-migration-type-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 10px;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
}
.cde-migration-type-badge.cde-migration-type-character {
background: rgba(74, 158, 255, 0.2);
color: #4a9eff;
border: 1px solid rgba(74, 158, 255, 0.4);
}
.cde-migration-type-badge.cde-migration-type-npc {
background: rgba(156, 77, 204, 0.2);
color: #c97ae0;
border: 1px solid rgba(156, 77, 204, 0.4);
}
/* Errors */
.cde-migration-errors {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.cde-migration-errors li {
display: flex;
align-items: flex-start;
gap: 6px;
padding: 6px 10px;
border: 1px solid rgba(224, 68, 68, 0.6);
border-radius: 4px;
background: rgba(224, 68, 68, 0.1);
color: #e07070;
font-size: 11px;
}
.cde-migration-errors li i {
margin-top: 2px;
flex-shrink: 0;
}
/* Bottom action bar */
.cde-migration-actions {
display: flex;
justify-content: center;
padding-top: 4px;
}
.cde-migration-import-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 9px 24px;
border: none;
border-radius: 6px;
background: #4a9eff;
color: #fff;
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: filter 0.15s;
}
.cde-migration-import-btn:hover {
filter: brightness(1.15);
}
.cde-migration-hint {
margin: 0;
font-size: 12px;
color: #7d94b8;
text-align: center;
}
.cde-welcome-message {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 12px 16px;
background: #101622;
border: 1px solid #263853;
border-radius: 8px;
text-align: center;
}
.cde-welcome-logo {
width: 120px;
height: auto;
object-fit: contain;
filter: drop-shadow(0 0 8px rgba(74, 158, 255, 0.4));
}
.cde-welcome-title {
margin: 0;
font-size: 15px;
font-weight: 700;
color: #4a9eff;
text-shadow: 0 0 8px rgba(74, 158, 255, 0.5);
}
.cde-welcome-links {
margin: 0;
font-size: 12px;
color: #7d94b8;
}
.cde-welcome-links a {
color: #00d4d4;
text-decoration: none;
border-bottom: 1px solid rgba(0, 212, 212, 0.4);
}
.cde-welcome-links a:hover {
color: #fff;
border-bottom-color: #fff;
}
.cde-welcome-help-btn {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: 4px;
padding: 7px 18px;
background: #4a9eff;
border: none;
border-radius: 6px;
color: #fff;
font-size: 12px;
font-weight: 700;
cursor: pointer;
transition: filter 0.15s;
}
.cde-welcome-help-btn:hover {
filter: brightness(1.2);
}
+740 -1
View File
@@ -208,6 +208,12 @@
min-width: 110px;
flex: 1 1 110px;
max-width: 200px;
&--wide {
flex: 1 1 100%;
max-width: 100%;
min-width: 0;
}
}
.cde-stat-label {
@@ -240,6 +246,23 @@
&:focus { border-bottom-color: @cde-item; }
}
.cde-stat-cell textarea {
width: 100%;
background: transparent;
border: 1px solid @cde-border;
border-radius: 2px;
color: @cde-text;
font-size: 13px;
font-family: inherit;
padding: 4px 6px;
outline: none;
resize: vertical;
transition: border-color 0.15s;
line-height: 1.5;
&:focus { border-color: @cde-kungfu; }
}
.cde-stat-cell select {
width: 100%;
border: none;
@@ -369,7 +392,6 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
display: none;
flex-direction: column;
gap: @cde-gap;
min-height: 100%;
}
.tab.active {
@@ -1289,6 +1311,13 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
width: auto;
height: auto;
opacity: 0.6;
cursor: zoom-in;
transition: opacity 0.2s ease, box-shadow 0.2s ease;
&:hover {
opacity: 0.9;
box-shadow: 0 0 10px @cde-border-hi;
}
}
}
@@ -3131,6 +3160,13 @@ strong.ellipsis {
max-height: 180px;
opacity: 0.45;
border-radius: 4px;
cursor: zoom-in;
transition: opacity 0.2s ease, box-shadow 0.2s ease;
&:hover {
opacity: 0.85;
box-shadow: 0 0 12px @cde-border-hi;
}
}
}
@@ -3915,3 +3951,706 @@ ol.item-list {
text-shadow: 0 0 5px fade(@cde-kungfu, 40%);
}
}
/* ============================================================
ROUE D'INITIATIVE — CDEWheelApp
============================================================ */
// Wu Xing segment colours (match JS constants)
@wu-metal: #b8c4cc;
@wu-water: #3a7bd5;
@wu-earth: #c8a84b;
@wu-fire: #d94f3d;
@wu-wood: #4a9b5a;
@wu-reference: #2c1f6b;
.cde-wheel-app {
color: @cde-text;
background: @cde-bg;
font-family: "Averia", "Averia Regular", sans-serif;
.window-content {
padding: 0;
overflow: hidden;
}
}
/* Two-column layout: SVG wheel left, panel right */
.cde-wheel-layout {
display: flex;
height: 100%;
min-height: 520px;
}
/* ---- Left: SVG wheel ---- */
.cde-wheel-svg-container {
flex: 0 0 480px;
width: 480px;
padding: 12px 12px 6px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: @cde-surface2;
border-right: 1px solid @cde-border;
svg {
flex: 1 1 auto;
width: 100%;
max-width: 456px;
max-height: 456px;
overflow: visible;
}
.cde-wheel-legend {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 0 2px;
font-size: 11px;
color: rgba(255,255,255,0.55);
flex-shrink: 0;
}
.cde-wheel-legend-dot {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.cde-wheel-segment {
stroke: @cde-bg;
stroke-width: 1.5;
transition: opacity 0.2s;
}
.cde-wheel-cran-label {
font-family: "Averia Regular", sans-serif;
font-size: 12px;
fill: rgba(255,255,255,0.55);
text-anchor: middle;
dominant-baseline: central;
pointer-events: none;
user-select: none;
}
// Combatant token circle on the wheel
.cde-wheel-fighter-circle {
stroke-width: 2;
cursor: pointer;
transition: r 0.2s, stroke-width 0.2s;
&:hover {
stroke-width: 3;
}
&.is-active {
r: 18;
stroke-width: 3;
filter: drop-shadow(0 0 5px rgba(255, 255, 255, 0.7));
}
&.is-turn {
stroke-dasharray: 3 2;
animation: cde-spin 4s linear infinite;
}
}
.cde-wheel-fighter-initial {
font-size: 13px;
font-weight: 700;
fill: #fff;
text-anchor: middle;
dominant-baseline: central;
pointer-events: none;
}
}
/* ---- Right: panel ---- */
.cde-wheel-panel {
flex: 1 1 auto;
display: flex;
flex-direction: column;
overflow: hidden;
padding: 0;
min-width: 0;
}
.cde-wheel-section-title {
padding: 7px 12px 6px;
border-bottom: 1px solid @cde-border;
background: @cde-surface2;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
color: @cde-muted;
border-left: 3px solid @cde-spell;
flex-shrink: 0;
em {
font-style: normal;
color: @cde-text;
text-transform: none;
letter-spacing: 0;
font-size: 11px;
}
}
/* Combatant list */
.cde-wheel-combatants {
flex: 0 0 auto;
max-height: 130px;
overflow-y: auto;
border-bottom: 1px solid @cde-border;
}
.cde-wheel-combatant {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px 6px 9px;
cursor: pointer;
border-bottom: 1px solid fade(@cde-border, 50%);
border-left: 3px solid transparent;
transition: background 0.15s, border-color 0.15s;
&:last-child { border-bottom: none; }
&:hover {
background: @cde-surface;
}
&.cde-wheel-combatant--selected {
background: fade(@cde-spell, 10%);
border-left-color: @cde-spell;
.cde-wheel-combatant-name {
color: @cde-text;
font-weight: 600;
}
}
&.cde-wheel-combatant--active {
.cde-wheel-active-marker {
color: #f0c040;
filter: drop-shadow(0 0 3px #f0c040);
}
}
}
.cde-wheel-combatant-img {
width: 30px;
height: 30px;
border-radius: 50%;
object-fit: cover;
border: 1.5px solid @cde-border-hi;
flex-shrink: 0;
}
.cde-wheel-combatant-name {
flex: 1 1 auto;
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: @cde-muted;
}
.cde-wheel-combatant-cran {
font-size: 11px;
font-weight: 700;
font-variant-numeric: tabular-nums;
flex-shrink: 0;
min-width: 22px;
text-align: center;
padding: 2px 6px;
border-radius: 12px;
line-height: 1.3;
}
.cde-wheel-active-marker {
font-size: 10px;
color: @cde-muted;
flex-shrink: 0;
}
/* Action area */
.cde-wheel-actions {
flex: 1 1 auto;
display: flex;
flex-direction: column;
overflow-y: auto;
padding: 8px 10px 10px;
gap: 6px;
&.cde-wheel-actions--hint {
justify-content: center;
align-items: center;
}
}
.cde-wheel-hint {
color: @cde-muted;
font-size: 12px;
text-align: center;
font-style: italic;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
i {
font-size: 22px;
opacity: 0.4;
}
}
.cde-wheel-action-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 5px;
}
.cde-wheel-action-btn {
display: flex;
align-items: center;
justify-content: space-between;
gap: 4px;
background: @cde-surface;
border: 1px solid @cde-border-hi;
border-radius: @cde-radius-sm;
color: @cde-muted;
font-size: 11px;
padding: 5px 7px;
cursor: pointer;
text-align: left;
transition: background 0.15s, border-color 0.15s, color 0.15s, box-shadow 0.15s;
font-family: inherit;
&:hover {
color: @cde-text;
background: @cde-border;
border-color: @cde-border-hi;
}
.cde-wheel-action-name {
flex: 1 1 auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cde-wheel-action-cost {
flex-shrink: 0;
font-weight: 700;
font-size: 10px;
padding: 1px 5px;
border-radius: 10px;
background: @cde-border-hi;
color: @cde-muted;
line-height: 1.4;
}
&[data-cost="1"] {
&:hover { box-shadow: 0 0 6px fade(@cde-spell, 22%); }
.cde-wheel-action-cost { background: #1a3d6a; color: #6aadff; }
}
&[data-cost="2"] {
&:hover { box-shadow: 0 0 6px fade(#d4a050, 25%); }
.cde-wheel-action-cost { background: #4a3200; color: #d4a050; }
}
&[data-cost="3"] {
&:hover { box-shadow: 0 0 6px fade(#e06030, 28%); }
.cde-wheel-action-cost { background: #4a1800; color: #e07840; }
}
&[data-cost="6"] {
border-color: fade(#cc2040, 40%);
&:hover { box-shadow: 0 0 6px fade(#cc2040, 35%); }
.cde-wheel-action-cost { background: #4a0814; color: #e03050; }
}
}
/* Special action buttons */
.cde-wheel-special-actions {
display: flex;
gap: 6px;
margin-top: 2px;
}
.cde-wheel-btn-roll,
.cde-wheel-btn-surprise {
flex: 1 1 0;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
border-radius: @cde-radius-sm;
font-size: 11px;
font-weight: 600;
padding: 7px 8px;
cursor: pointer;
font-family: inherit;
transition: background 0.15s, box-shadow 0.15s;
border: 1px solid;
}
.cde-wheel-btn-roll {
background: fade(#c08a00, 14%);
border-color: fade(#c08a00, 50%);
color: #e0b030;
&:hover {
background: fade(#c08a00, 26%);
box-shadow: 0 0 8px fade(#c08a00, 40%);
}
}
.cde-wheel-btn-surprise {
background: fade(@cde-kungfu, 12%);
border-color: fade(@cde-kungfu, 45%);
color: @cde-kungfu;
&:hover {
background: fade(@cde-kungfu, 24%);
box-shadow: 0 0 8px fade(@cde-kungfu, 35%);
}
}
/* No-combat empty state */
.cde-wheel-no-combat {
flex: 1 1 auto;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: @cde-muted;
gap: 8px;
padding: 20px;
text-align: center;
font-size: 12px;
i {
font-size: 28px;
opacity: 0.4;
}
}
/* Spin animation for active-turn token */
@keyframes cde-spin {
from { transform-origin: var(--fx) var(--fy); transform: rotate(0deg); }
to { transform-origin: var(--fx) var(--fy); transform: rotate(360deg); }
}
/* ===================================================================
Migration App
=================================================================== */
.cde-migration-app {
.window-content {
padding: 0;
overflow-y: auto;
}
}
.cde-migration-body {
display: flex;
flex-direction: column;
gap: 12px;
padding: 16px;
}
/* Drop zone */
.cde-migration-drop-zone {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 28px 20px;
border: 2px dashed @cde-border;
border-radius: 8px;
background: fadeout(@cde-surface2, 40%);
text-align: center;
transition: border-color 0.15s, background 0.15s;
cursor: pointer;
&.is-dragover {
border-color: @cde-spell;
background: fadeout(@cde-spell, 85%);
}
}
.cde-migration-drop-icon {
font-size: 36px;
color: @cde-spell;
opacity: 0.7;
}
.cde-migration-drop-hint {
margin: 0;
font-size: 12px;
color: @cde-muted;
}
.cde-migration-file-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border: 1px solid @cde-spell;
border-radius: 4px;
color: @cde-spell;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s;
&:hover {
background: fadeout(@cde-spell, 80%);
}
}
/* Preview section */
.cde-migration-preview {
border: 1px solid @cde-border;
border-radius: 6px;
overflow: hidden;
}
.cde-migration-preview-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
background: fadeout(@cde-surface2, 20%);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: @cde-muted;
}
.cde-migration-clear-btn {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border: 1px solid @cde-border;
border-radius: 4px;
font-size: 11px;
color: @cde-muted;
background: none;
cursor: pointer;
transition: color 0.15s, border-color 0.15s;
&:hover {
color: #e04444;
border-color: #e04444;
}
}
/* Preview table */
.cde-migration-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
th {
padding: 5px 8px;
background: fadeout(@cde-surface2, 10%);
color: @cde-muted;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
text-align: left;
border-bottom: 1px solid @cde-border;
}
td {
padding: 5px 8px;
border-bottom: 1px solid fadeout(@cde-border, 60%);
vertical-align: middle;
}
tr:last-child td {
border-bottom: none;
}
}
.cde-migration-thumb {
width: 28px;
height: 28px;
border-radius: 3px;
object-fit: cover;
}
.cde-migration-name {
font-weight: 600;
color: @cde-text;
}
.cde-migration-items-count {
text-align: center;
color: @cde-muted;
}
.cde-migration-srcfile {
font-size: 10px;
color: @cde-muted;
max-width: 130px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Type badge */
.cde-migration-type-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 10px;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
&.cde-migration-type-character {
background: fadeout(@cde-spell, 80%);
color: @cde-spell;
border: 1px solid fadeout(@cde-spell, 60%);
}
&.cde-migration-type-npc {
background: fadeout(#9c4dcc, 80%);
color: #c97ae0;
border: 1px solid fadeout(#9c4dcc, 60%);
}
}
/* Errors */
.cde-migration-errors {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 4px;
li {
display: flex;
align-items: flex-start;
gap: 6px;
padding: 6px 10px;
border: 1px solid fadeout(#e04444, 40%);
border-radius: 4px;
background: fadeout(#e04444, 90%);
color: #e07070;
font-size: 11px;
i { margin-top: 2px; flex-shrink: 0; }
}
}
/* Bottom action bar */
.cde-migration-actions {
display: flex;
justify-content: center;
padding-top: 4px;
}
.cde-migration-import-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 9px 24px;
border: none;
border-radius: 6px;
background: @cde-spell;
color: #fff;
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: filter 0.15s;
&:hover {
filter: brightness(1.15);
}
}
.cde-migration-hint {
margin: 0;
font-size: 12px;
color: @cde-muted;
text-align: center;
}
// ============================================================
// Welcome message
// ============================================================
.cde-welcome-message {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 12px 16px;
background: @cde-surface;
border: 1px solid @cde-border-hi;
border-radius: 8px;
text-align: center;
}
.cde-welcome-logo {
width: 120px;
height: auto;
object-fit: contain;
filter: drop-shadow(0 0 8px fade(@cde-spell, 40%));
}
.cde-welcome-title {
margin: 0;
font-size: 15px;
font-weight: 700;
color: @cde-spell;
text-shadow: 0 0 8px fade(@cde-spell, 50%);
}
.cde-welcome-links {
margin: 0;
font-size: 12px;
color: @cde-muted;
a {
color: @cde-item;
text-decoration: none;
border-bottom: 1px solid fade(@cde-item, 40%);
&:hover {
color: #fff;
border-bottom-color: #fff;
}
}
}
.cde-welcome-help-btn {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: 4px;
padding: 7px 18px;
background: @cde-spell;
border: none;
border-radius: 6px;
color: #fff;
font-size: 12px;
font-weight: 700;
cursor: pointer;
transition: filter 0.15s;
&:hover {
filter: brightness(1.2);
}
}
+783 -4
View File
@@ -130,11 +130,460 @@ var TEMPLATE_PARTIALS = [
"systems/fvtt-chroniques-de-l-etrange/templates/actor/parts/cde-npc-kungfus.html",
"systems/fvtt-chroniques-de-l-etrange/templates/actor/parts/cde-npc-items.html",
"systems/fvtt-chroniques-de-l-etrange/templates/apps/cde-loksyu-app.html",
"systems/fvtt-chroniques-de-l-etrange/templates/apps/cde-tinji-app.html"
"systems/fvtt-chroniques-de-l-etrange/templates/apps/cde-tinji-app.html",
"systems/fvtt-chroniques-de-l-etrange/templates/apps/cde-wheel-app.html"
];
// src/migration/migrator.js
var ELEMENT_LABEL_TO_KEY = {
"m\xE9tal": "metal",
"metal": "metal",
"eau": "eau",
"terre": "terre",
"feu": "feu",
"bois": "bois"
};
function elementKey(label = "") {
return ELEMENT_LABEL_TO_KEY[label.toLowerCase().trim()] ?? "metal";
}
function heiKey(label = "") {
const l = label.toLowerCase().trim();
if (l === "yin/yang" || l === "yinyang") return "yinyang";
if (l === "yang") return "yang";
return "yin";
}
var SPECIALITY_TO_DISCIPLINE = {
// internalcinnabar
"essence": "internalcinnabar",
"esprit": "internalcinnabar",
"mind": "internalcinnabar",
"purification": "internalcinnabar",
"manipulation": "internalcinnabar",
"aura": "internalcinnabar",
// alchemy
"acupuncture": "alchemy",
"\xE9lixirs": "alchemy",
"elixirs": "alchemy",
"poisons": "alchemy",
"arsenal": "alchemy",
"potions": "alchemy",
// masteryoftheway
"mal\xE9diction": "masteryoftheway",
"malediction": "masteryoftheway",
"transfiguration": "masteryoftheway",
"n\xE9cromancie": "masteryoftheway",
"necromancie": "masteryoftheway",
"contr\xF4le climatique": "masteryoftheway",
"controle climatique": "masteryoftheway",
"magie d'or": "masteryoftheway",
"magie dor": "masteryoftheway",
// exorcism
"invocation": "exorcism",
"pistage": "exorcism",
"tra\xE7age": "exorcism",
"tracage": "exorcism",
"protection": "exorcism",
"ch\xE2timent": "exorcism",
"chatiment": "exorcism",
"domination": "exorcism",
// geomancy
"neutralisation": "geomancy",
"divination": "geomancy",
"pri\xE8re terrestre": "geomancy",
"priere terrestre": "geomancy",
"pri\xE8re c\xE9leste": "geomancy",
"priere celeste": "geomancy",
"g\xE9omancie": "geomancy",
"geomancie": "geomancy",
"feng shui": "geomancy",
"fungseoi": "geomancy"
};
function inferDiscipline(specialityName = "", itemName = "") {
const key = specialityName.toLowerCase().trim();
if (SPECIALITY_TO_DISCIPLINE[key]) return SPECIALITY_TO_DISCIPLINE[key];
const name = itemName.toLowerCase();
if (name.includes("exorcis")) return "exorcism";
if (name.includes("g\xE9omanci") || name.includes("geomanci")) return "geomancy";
if (name.includes("alchimi")) return "alchemy";
if (name.includes("cinnabre") || name.includes("interne")) return "internalcinnabar";
if (name.includes("ma\xEEtrise") || name.includes("maitrise") || name.includes("tao")) return "masteryoftheway";
return "internalcinnabar";
}
function mapActivation(oldActivation = "") {
const s = oldActivation.toLowerCase();
if (s.includes("inflig\xE9s") || s.includes("infliges")) return "damage-inflicted";
if (s.includes("re\xE7us") || s.includes("recus")) return "damage-received";
if (s.includes("r\xE9action") || s.includes("reaction")) return "reaction";
if (s.includes("d\xE9s-fastes") || s.includes("des-fastes") || s.includes("fastes")) return "dice";
if (s.includes("aide")) return "action-aid";
if (s.includes("attaque") && s.includes("d\xE9fense")) return "action-attack-defense";
if (s.includes("attaque") && s.includes("defense")) return "action-attack-defense";
if (s.includes("attaque")) return "action-attack";
if (s.includes("d\xE9fense") || s.includes("defense")) return "action-defense";
return "action-attack";
}
var DEFAULT_ACTOR_IMG = "icons/svg/mystery-man.svg";
var DEFAULT_ITEM_IMG = "icons/svg/item-bag.svg";
function migrateEquipmentItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "item",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
quantity: Number(s.quantity ?? 1),
weight: Number(s.weight ?? 0),
notes: s.notes ?? ""
}
};
}
function migrateKungfuItem(oldItem) {
const s = oldItem.system ?? {};
const techs = s.techniques ?? {};
const migratedTechs = {};
for (const key of ["technique1", "technique2", "technique3"]) {
const t = techs[key] ?? {};
migratedTechs[key] = {
check: Boolean(t.check),
name: t.name ?? "",
activation: mapActivation(t.activation ?? ""),
technique: t.technique ?? ""
};
}
return {
name: oldItem.name,
type: "kungfu",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
orientation: s.orientation || "yin",
aspect: s.aspect || "metal",
skill: s.skill || "kungfu",
speciality: s.speciality ?? "",
style: s.style ?? "",
techniques: migratedTechs,
notes: s.notes ?? ""
}
};
}
function migrateSpellItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "spell",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
specialityname: s.specialityname ?? "",
associatedelement: elementKey(s.associatedelement ?? ""),
heiType: heiKey(s.hei ?? ""),
heiCost: Number(s.heiCost ?? 0),
difficulty: Number(s.difficulty ?? 0),
realizationtimeritual: s.realizationtimeritual ?? "",
realizationtimeaccelerated: s.realizationtimeaccelerated ?? "",
flashback: s.flashback ?? "",
components: s.components ?? "",
effects: s.effects ?? "",
examples: s.examples ?? "",
notes: s.notes ?? "",
discipline: inferDiscipline(s.specialityname ?? "", oldItem.name ?? "")
}
};
}
function migrateSupernaturalItem(oldItem) {
const s = oldItem.system ?? {};
const nestedRef = s.supernatural?.reference ?? "";
return {
name: oldItem.name,
type: "supernatural",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference || nestedRef,
description: s.description ?? "",
notes: s.notes ?? "",
heiType: "yin",
heiCost: 0,
trigger: "",
effects: ""
}
};
}
function migrateItem(oldItem) {
switch (oldItem.type) {
case "item":
return migrateEquipmentItem(oldItem);
case "kungfu":
return migrateKungfuItem(oldItem);
case "spell":
return migrateSpellItem(oldItem);
case "supernatural":
return migrateSupernaturalItem(oldItem);
default:
return migrateEquipmentItem({ ...oldItem, type: "item" });
}
}
function migrateCharacter(old) {
const s = old.system ?? {};
const aspect = {};
for (const [k, v] of Object.entries(s.aspect ?? {})) {
aspect[k] = { chinese: v.chinese ?? "", label: v.label ?? "", value: Number(v.value ?? 0) };
}
const skills = {};
for (const [k, v] of Object.entries(s.skills ?? {})) {
skills[k] = { label: v.label ?? "", specialities: v.specialities ?? "", value: Number(v.value ?? 0) };
}
const resources = {};
for (const [k, v] of Object.entries(s.resources ?? {})) {
resources[k] = { label: v.label ?? "", specialities: v.specialities ?? "", value: Number(v.value ?? 0), debt: Boolean(v.debt) };
}
const component = {};
for (const [k, v] of Object.entries(s.component ?? {})) {
component[k] = { value: v.value ?? "" };
}
const MAGIC_SPECIALITIES = {
internalcinnabar: ["essence", "mind", "purification", "manipulation", "aura"],
alchemy: ["acupuncture", "elixirs", "poisons", "arsenal", "potions"],
masteryoftheway: ["curse", "transfiguration", "necromancy", "climatecontrol", "goldenmagic"],
exorcism: ["invocation", "tracking", "protection", "punishment", "domination"],
geomancy: ["neutralization", "divination", "earthlyprayer", "heavenlyprayer", "fungseoi"]
};
const magics = {};
for (const [school, specs] of Object.entries(MAGIC_SPECIALITIES)) {
const om = s.magics?.[school] ?? {};
const speciality = {};
for (const spec of specs) {
speciality[spec] = { check: Boolean(om.speciality?.[spec]?.check) };
}
magics[school] = { visible: Boolean(om.visible), value: Number(om.value ?? 0), speciality };
}
const tt = s.threetreasures ?? {};
const threetreasures = {
heiyang: { value: Number(tt.heiyang?.value ?? 0), max: Number(tt.heiyang?.max ?? 0) },
heiyin: { value: Number(tt.heiyin?.value ?? 0), max: Number(tt.heiyin?.max ?? 0) },
dicelevel: {
level0d: {
san: { value: Number(tt.dicelevel?.level0d?.san?.value ?? 0), max: Number(tt.dicelevel?.level0d?.san?.max ?? 0) },
zing: { value: Number(tt.dicelevel?.level0d?.zing?.value ?? 0), max: Number(tt.dicelevel?.level0d?.zing?.max ?? 0) }
},
level1d: {
san: { value: Number(tt.dicelevel?.level1d?.san?.value ?? 0), max: Number(tt.dicelevel?.level1d?.san?.max ?? 0) },
zing: { value: Number(tt.dicelevel?.level1d?.zing?.value ?? 0), max: Number(tt.dicelevel?.level1d?.zing?.max ?? 0) }
},
level2d: {
san: { value: Number(tt.dicelevel?.level2d?.san?.value ?? 0), max: Number(tt.dicelevel?.level2d?.san?.max ?? 0) },
zing: { value: Number(tt.dicelevel?.level2d?.zing?.value ?? 0), max: Number(tt.dicelevel?.level2d?.zing?.max ?? 0) }
}
}
};
const description = s.description || s.biography || "";
return {
name: old.name,
type: "character",
img: old.img || DEFAULT_ACTOR_IMG,
system: {
concept: s.concept ?? "",
guardian: parseInt(s.guardian ?? "0") || 0,
initiative: Number(s.initiative ?? 1),
anti_initiative: Number(s.anti_initiative ?? 24),
description,
aspect,
skills,
resources,
component,
magics,
threetreasures,
experience: {
value: Number(s.experience?.value ?? 0),
max: Number(s.experience?.max ?? 0),
min: Number(s.experience?.min ?? 0)
}
},
items: (old.items ?? []).map(migrateItem)
};
}
function migrateNpc(old) {
const s = old.system ?? {};
const aptitudes = {};
for (const [k, v] of Object.entries(s.aptitudes ?? {})) {
aptitudes[k] = { value: Number(v.value ?? 0), speciality: v.speciality ?? "" };
}
return {
name: old.name,
type: "npc",
img: old.img || DEFAULT_ACTOR_IMG,
system: {
type: s.type ?? "",
// Old system had separate `levelofthreat`/`powerofnuisance` as numbers
// and string copies `threat`/`nuisance` — use the numeric fields
threat: Number(s.levelofthreat ?? s.threat ?? 0),
nuisance: Number(s.powerofnuisance ?? s.nuisance ?? 0),
initiative: Number(s.initiative ?? 1),
anti_initiative: Number(s.anti_initiative ?? 24),
aptitudes,
vitality: {
value: Number(s.vitality?.value ?? 0),
calcul: Number(s.vitality?.calcul ?? 0),
note: s.vitality?.note ?? ""
},
hei: {
value: Number(s.hei?.value ?? 0),
calcul: Number(s.hei?.calcul ?? 0),
note: s.hei?.note ?? ""
},
description: s.description ?? ""
},
items: (old.items ?? []).map(migrateItem)
};
}
function migrateActor(oldJson) {
switch (oldJson.type) {
case "character":
return migrateCharacter(oldJson);
case "npc":
return migrateNpc(oldJson);
default:
throw new Error(`Unknown actor type "${oldJson.type}" in "${oldJson.name}"`);
}
}
function parseLegacyJson(jsonText) {
const parsed = JSON.parse(jsonText);
if (typeof parsed !== "object" || parsed === null) {
throw new Error("Le fichier JSON doit contenir un objet acteur ou un tableau d'acteurs");
}
const actors = Array.isArray(parsed) ? parsed : [parsed];
return actors.map(migrateActor);
}
// src/ui/apps/migration-app.js
var MIGRATION_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/apps/cde-migration-app.html";
var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.HandlebarsApplicationMixin(
foundry.applications.api.ApplicationV2
) {
static DEFAULT_OPTIONS = {
id: "cde-migration-app",
classes: ["cde-migration-app"],
tag: "div",
window: {
title: "CDE.MigrationTitle",
icon: "fas fa-file-import",
resizable: false
},
position: { width: 560, height: "auto" },
actions: {
clearFiles: _CDEMigrationApp.#clearFiles,
doImport: _CDEMigrationApp.#doImport
}
};
static PARTS = {
form: { template: MIGRATION_TEMPLATE }
};
/** @type {Array<{name: string, type: string, img: string, system: object, items: object[], _srcFile: string}>} */
#pending = [];
/** @type {string[]} - error messages per file */
#errors = [];
async _prepareContext(options) {
return {
pending: this.#pending,
errors: this.#errors,
hasPending: this.#pending.length > 0,
hasErrors: this.#errors.length > 0,
count: this.#pending.length
};
}
/** After render, wire up the file input. */
_onRender(context, options) {
super._onRender(context, options);
const input = this.element.querySelector(".cde-migration-file-input");
input?.addEventListener("change", this.#onFileChange.bind(this));
const dropZone = this.element.querySelector(".cde-migration-drop-zone");
if (dropZone) {
dropZone.addEventListener("dragover", (e) => {
e.preventDefault();
dropZone.classList.add("is-dragover");
});
dropZone.addEventListener("dragleave", () => dropZone.classList.remove("is-dragover"));
dropZone.addEventListener("drop", (e) => {
e.preventDefault();
dropZone.classList.remove("is-dragover");
this.#processFiles(Array.from(e.dataTransfer.files));
});
}
}
async #onFileChange(event) {
const files = Array.from(event.target.files ?? []);
event.target.value = "";
await this.#processFiles(files);
}
async #processFiles(files) {
for (const file of files) {
if (!file.name.endsWith(".json")) {
this.#errors.push(game.i18n.format("CDE.MigrationErrorNotJson", { file: file.name }));
continue;
}
try {
const text = await file.text();
const actors = parseLegacyJson(text);
for (const actor of actors) {
actor._srcFile = file.name;
if (!this.#pending.some((p) => p.name === actor.name)) {
this.#pending.push(actor);
}
}
} catch (err) {
this.#errors.push(game.i18n.format("CDE.MigrationErrorParse", { file: file.name, error: err.message }));
}
}
this.render();
}
static async #clearFiles() {
this.#pending = [];
this.#errors = [];
this.render();
}
static async #doImport() {
if (!this.#pending.length) return;
const created = [];
const failed = [];
for (const data of this.#pending) {
try {
const { _srcFile, ...actorData } = data;
const actor = await Actor.create(actorData);
created.push(actor.name);
} catch (err) {
failed.push(`${data.name}: ${err.message}`);
console.error(`CHRONIQUESDELETRANGE | Migration failed for "${data.name}":`, err);
}
}
this.#pending = [];
this.#errors = failed;
this.render();
if (created.length) {
ui.notifications.info(
game.i18n.format("CDE.MigrationSuccess", { count: created.length, names: created.join(", ") })
);
}
if (failed.length) {
ui.notifications.warn(
game.i18n.format("CDE.MigrationPartialError", { count: failed.length })
);
}
}
};
// src/config/settings.js
function registerSettings() {
game.settings.registerMenu(SYSTEM_ID, "migrationTool", {
name: "CDE.MigrationTitle",
label: "CDE.MigrationMenuLabel",
hint: "CDE.MigrationMenuHint",
icon: "fas fa-file-import",
type: CDEMigrationApp,
restricted: true
});
game.settings.register(SYSTEM_ID, "loksyuData", {
scope: "world",
config: false,
@@ -153,9 +602,36 @@ function registerSettings() {
type: Number,
default: 0
});
game.settings.register(SYSTEM_ID, "welcomeSceneLoaded", {
scope: "world",
config: false,
type: Boolean,
default: false
});
}
async function migrateIfNeeded() {
}
async function loadWelcomeSceneIfNeeded() {
if (!game.user.isGM) return;
if (game.settings.get(SYSTEM_ID, "welcomeSceneLoaded")) return;
try {
const pack = game.packs.get(`${SYSTEM_ID}.cde-scenes`);
if (!pack) return;
const index = await pack.getIndex();
const entry = index.find((e) => e.name === "Accueil");
if (!entry) return;
const existing = game.scenes.find((s) => s.name === "Accueil");
let scene = existing;
if (!scene) {
const doc = await pack.getDocument(entry._id);
[scene] = await Scene.createDocuments([doc.toObject()]);
}
await game.settings.set(SYSTEM_ID, "welcomeSceneLoaded", true);
await scene.activate();
} catch (err) {
console.error("CHRONIQUESDELETRANGE | loadWelcomeSceneIfNeeded failed:", err);
}
}
// src/config/localize.js
function preLocalizeConfig() {
@@ -807,6 +1283,20 @@ function registerHandlebarsHelpers() {
};
return game.i18n.localize(keys[activation] ?? "CDE.Activation");
});
Handlebars.registerHelper("cranPosition", function(cran, cx, cy, r) {
const angleDeg = 90 + cran * 15;
const angleRad = angleDeg * Math.PI / 180;
const x = Math.round(cx + r * Math.cos(angleRad));
const y = Math.round(cy - r * Math.sin(angleRad));
return { x, y };
});
Handlebars.registerHelper("fighterX", function(cx, index, total) {
const offset = total > 1 ? (index - (total - 1) / 2) * 34 : 0;
return Math.round(cx - 15 + offset);
});
Handlebars.registerHelper("fighterY", function(cy, index, total) {
return Math.round(cy - 50);
});
}
// src/ui/templates.js
@@ -1640,6 +2130,7 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
this.#bindPrefs();
this.#bindRollButtons();
this.#bindComponentRandomize();
this.#bindDiagramZoom();
}
#bindInitiativeControls() {
const buttons = this.element?.querySelectorAll(".click-initiative");
@@ -1718,6 +2209,16 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
});
});
}
#bindDiagramZoom() {
const img = this.element?.querySelector("[data-action='zoom-diagram']");
if (!img) return;
img.addEventListener("click", () => {
new ImagePopout(img.src, {
title: game.i18n.localize("CDE.NghangDiagramTitle"),
shareable: false
}).render(true);
});
}
#bindComponentRandomize() {
const btn = this.element?.querySelector("[data-action='randomize-component']");
if (!btn) return;
@@ -2010,7 +2511,8 @@ var CDELoksyuApp = class _CDELoksyuApp extends foundry.applications.api.Handleba
position: { width: 520, height: "auto" },
actions: {
resetElement: _CDELoksyuApp.#onResetElement,
resetAll: _CDELoksyuApp.#onResetAll
resetAll: _CDELoksyuApp.#onResetAll,
zoomVisual: _CDELoksyuApp.#onZoomVisual
}
};
static PARTS = {
@@ -2093,6 +2595,12 @@ var CDELoksyuApp = class _CDELoksyuApp extends foundry.applications.api.Handleba
for (const k of KEYS) data[k] = { yin: 0, yang: 0 };
await setLoksyuData(data);
}
static #onZoomVisual(_event, target) {
new ImagePopout(target.src, {
title: game.i18n.localize("CDE.LoksyuDiagramTitle"),
shareable: false
}).render(true);
}
};
// src/ui/apps/tinji-app.js
@@ -2108,7 +2616,7 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
resizable: false
},
classes: ["cde-app", "cde-tinji-standalone"],
position: { width: 320, height: "auto" },
position: { width: 380, height: "auto" },
actions: {
increment: _CDETinjiApp.#onIncrement,
decrement: _CDETinjiApp.#onDecrement,
@@ -2191,6 +2699,205 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
}
};
// src/documents/combat.js
var CDECombat = class extends Combat {
/**
* Override rollInitiative to open the PC or NPC initiative dialog
* for each selected combatant, then sync the result to the Combatant document.
*/
async rollInitiative(ids, options = {}) {
const combatantIds = typeof ids === "string" ? [ids] : ids;
for (const id of combatantIds) {
const combatant = this.combatants.get(id);
if (!combatant) continue;
const actor = combatant.actor;
if (!actor) continue;
if (actor.type === ACTOR_TYPES.character) {
await rollInitiativePC(actor);
} else {
await rollInitiativeNPC(actor);
}
}
return this;
}
/**
* Sort combatants: highest initiative first (furthest counter-clockwise = acts first).
* Ties: PCs before NPCs; among PCs, by name; among NPCs, by name.
* Calls super.setupTurns() first to ensure this.current is properly initialized.
*/
setupTurns() {
super.setupTurns();
this.turns = this.turns.slice().sort((a, b) => {
const ia = a.initiative ?? 0;
const ib = b.initiative ?? 0;
if (ia !== ib) return ib - ia;
const aIsPC = a.actor?.type === ACTOR_TYPES.character ? 1 : 0;
const bIsPC = b.actor?.type === ACTOR_TYPES.character ? 1 : 0;
if (aIsPC !== bIsPC) return bIsPC - aIsPC;
return (a.name ?? "").localeCompare(b.name ?? "");
});
return this.turns;
}
};
async function advanceCombatantPosition(combatant, cranCost) {
const current = combatant.initiative ?? combatant.actor?.system?.initiative ?? 1;
const newValue = (current - cranCost - 1 + 48) % 24 + 1;
await combatant.update({ initiative: newValue });
}
// src/ui/apps/wheel-app.js
var WHEEL_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/apps/cde-wheel-app.html";
var ACTION_COSTS = [
{ key: "draw", label: "CDE.ActionCostDraw", cost: 1 },
{ key: "changestyle", label: "CDE.ActionCostChangeStyle", cost: 1 },
{ key: "defense", label: "CDE.ActionCostDefense", cost: 1 },
{ key: "aim", label: "CDE.ActionCostAim", cost: 2 },
{ key: "help", label: "CDE.ActionCostHelp", cost: 2 },
{ key: "defally", label: "CDE.ActionCostDefendAlly", cost: 2 },
{ key: "move", label: "CDE.ActionCostMove", cost: 2 },
{ key: "attack", label: "CDE.ActionCostAttack", cost: 3 },
{ key: "delay", label: "CDE.ActionCostDelay", cost: 6 }
];
var WHEEL_SEGMENTS = [
{ label: "M\xE9tal", color: "#b8c4cc", textColor: "#1a1a1a", crans: [1, 2, 3, 4] },
{ label: "Eau", color: "#3a7bd5", textColor: "#ffffff", crans: [5, 6, 7, 8] },
{ label: "Terre", color: "#c8a84b", textColor: "#1a1a1a", crans: [9, 10, 11, 12] },
{ label: "Feu", color: "#d94f3d", textColor: "#ffffff", crans: [13, 14, 15, 16] },
{ label: "Bois", color: "#4a9b5a", textColor: "#ffffff", crans: [17, 18, 19, 20] },
{ label: "Rep\xE8re", color: "#1a1a2e", textColor: "#aaaaaa", crans: [21, 22, 23, 24] }
];
function segmentForCran(cran) {
return WHEEL_SEGMENTS.find((s) => s.crans.includes(cran)) ?? WHEEL_SEGMENTS[0];
}
var CDEWheelApp = class _CDEWheelApp extends foundry.applications.api.ApplicationV2 {
static DEFAULT_OPTIONS = {
id: "cde-wheel-app",
classes: ["cde-wheel-app"],
tag: "div",
window: {
title: "CDE.InitiativeWheel",
icon: "fas fa-circle-notch",
resizable: true
},
position: { width: 820, height: 620 },
actions: {
advanceCran: _CDEWheelApp.#advanceCran,
setSurprised: _CDEWheelApp.#setSurprised,
rollInitiative: _CDEWheelApp.#rollInitiative
}
};
/** @type {CDEWheelApp|null} */
static #instance = null;
/** Open (or bring to front) the singleton instance. */
static open() {
if (!_CDEWheelApp.#instance || _CDEWheelApp.#instance.rendered === false) {
_CDEWheelApp.#instance = new _CDEWheelApp();
_CDEWheelApp.#instance.render(true);
} else {
_CDEWheelApp.#instance.bringToFront();
}
return _CDEWheelApp.#instance;
}
/** Currently selected combatant id (for action panel). */
#selectedId = null;
async _prepareContext(options) {
const combat = game.combat;
const combatants = combat ? [...combat.combatants.values()] : [];
const sorted = [...combatants].sort((a, b) => (b.initiative ?? 0) - (a.initiative ?? 0));
const cranData = this.#buildCranData(combatants);
const selected = this.#selectedId ? combatants.find((c) => c.id === this.#selectedId) : null;
const actionCosts = ACTION_COSTS.map((a) => ({
...a,
label: game.i18n.localize(a.label)
}));
return {
hasCombat: !!combat,
combatants: sorted.map((c) => ({
id: c.id,
name: c.name,
img: c.token?.texture?.src ?? c.actor?.img ?? "icons/svg/mystery-man.svg",
initiative: c.initiative ?? "\u2014",
segment: segmentForCran(c.initiative ?? 1),
isActive: combat?.current?.combatantId === c.id,
isSelected: c.id === this.#selectedId,
hasInitiative: c.initiative != null
})),
cranData,
selected,
selectedName: selected?.name ?? null,
actionCosts
};
}
async _renderHTML(context, options) {
return foundry.applications.handlebars.renderTemplate(WHEEL_TEMPLATE, context);
}
_replaceHTML(result, content, options) {
content.innerHTML = result;
this.#bindEvents(content);
}
/** Build per-cran data for the SVG wheel. */
#buildCranData(combatants) {
const data = [];
for (let cran = 1; cran <= 24; cran++) {
const segment = segmentForCran(cran);
const fighters = combatants.filter((c) => Math.round(c.initiative) === cran);
data.push({ cran, segment, fighters });
}
return data;
}
/** Bind click events for combatant selection. */
#bindEvents(content) {
content.querySelectorAll("[data-select-combatant]").forEach((el) => {
el.addEventListener("click", () => {
this.#selectedId = el.dataset.selectCombatant;
this.render();
});
});
}
/** Action: advance selected combatant by given cran cost. */
static async #advanceCran(event, element) {
const app = _CDEWheelApp.#instance;
if (!app?.#selectedId) return;
const cost = parseInt(element.dataset.cost, 10);
if (!cost || isNaN(cost)) return;
const combatant = game.combat?.combatants.get(app.#selectedId);
if (!combatant) return;
await advanceCombatantPosition(combatant, cost);
}
/** Action: set selected combatant to surprised (position 1 = reference). */
static async #setSurprised(event, element) {
const app = _CDEWheelApp.#instance;
if (!app?.#selectedId) return;
const combatant = game.combat?.combatants.get(app.#selectedId);
if (!combatant) return;
await combatant.update({ initiative: 1 });
}
/** Action: open the initiative dialog for the selected combatant. */
static async #rollInitiative(event, element) {
const app = _CDEWheelApp.#instance;
if (!app?.#selectedId) return;
const combatant = game.combat?.combatants.get(app.#selectedId);
if (!combatant) return;
await game.combat.rollInitiative([app.#selectedId]);
}
/** Re-render when combat state changes. */
static registerHooks() {
const refresh = () => {
if (_CDEWheelApp.#instance?.rendered) _CDEWheelApp.#instance.render();
};
Hooks.on("updateCombat", refresh);
Hooks.on("updateCombatant", refresh);
Hooks.on("createCombatant", refresh);
Hooks.on("deleteCombatant", refresh);
Hooks.on("updateActor", (_actor, diff) => {
if (foundry.utils.hasProperty(diff, "system.initiative")) refresh();
});
Hooks.on("deleteCombat", () => {
if (_CDEWheelApp.#instance?.rendered) _CDEWheelApp.#instance.render();
});
}
};
// src/ui/roll-actions.js
var RESULT_TEMPLATE3 = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-dice-result.html";
function injectRollActions(message, html) {
@@ -2338,13 +3045,55 @@ function refreshAllRollActions() {
});
}
// src/ui/apps/welcome.js
var HELP_JOURNAL_UUID = `Compendium.${SYSTEM_ID}.cde-help.JournalEntry.CDEGuideMain0001`;
async function showWelcomeMessage() {
const logo = `systems/${SYSTEM_ID}/images/logo_jeu.webp`;
const content = `
<div class="cde-welcome-message">
<img class="cde-welcome-logo" src="${logo}" alt="Les Chroniques de l'\xC9trange" />
<h2 class="cde-welcome-title">Les Chroniques de l'\xC9trange</h2>
<p class="cde-welcome-links">
Un jeu de r\xF4le \xE9dit\xE9 par
<a href="https://antre-monde.com/les-chroniques-de-letrengae/" target="_blank" rel="noopener">Antre-Monde \xC9ditions</a>
</p>
<p class="cde-welcome-links">
Syst\xE8me FoundryVTT r\xE9alis\xE9 par
<a href="https://www.uberwald.me" target="_blank" rel="noopener">LeRatierBretonnien</a>
</p>
<button type="button" class="cde-welcome-help-btn" data-action="open-cde-help">
<i class="fas fa-book-open"></i>
${game.i18n.localize("CDE.WelcomeOpenHelp")}
</button>
</div>`;
await ChatMessage.create({
content,
speaker: { alias: "Les Chroniques de l'\xC9trange" },
flags: { [SYSTEM_ID]: { welcome: true } }
});
}
function injectWelcomeActions(_message, html) {
const el = html instanceof HTMLElement ? html : html[0] ?? html;
const btn = el?.querySelector?.("[data-action='open-cde-help']");
if (!btn) return;
btn.addEventListener("click", async () => {
try {
const doc = await fromUuid(HELP_JOURNAL_UUID);
doc?.sheet?.render(true);
} catch {
game.packs.get(`${SYSTEM_ID}.cde-help`)?.render(true);
}
});
}
// src/system.js
Hooks.once("i18nInit", preLocalizeConfig);
Hooks.once("init", async () => {
console.info(`CHRONIQUESDELETRANGE | Initializing ${SYSTEM_ID}`);
registerSettings();
game.system.CONST = { MAGICS, SUBTYPES };
game.cde = { CDELoksyuApp, CDETinjiApp };
game.cde = { CDELoksyuApp, CDETinjiApp, CDEWheelApp };
CONFIG.Combat.documentClass = CDECombat;
CONFIG.Actor.dataModels = {
[ACTOR_TYPES.character]: CharacterDataModel,
[ACTOR_TYPES.npc]: NpcDataModel
@@ -2422,6 +3171,9 @@ Hooks.once("init", async () => {
});
Hooks.once("ready", async () => {
await migrateIfNeeded();
await loadWelcomeSceneIfNeeded();
CDEWheelApp.registerHooks();
if (game.user.isGM) showWelcomeMessage();
});
Hooks.on("renderChatLog", (_app, html) => {
const el = html instanceof HTMLElement ? html : html[0] ?? html;
@@ -2436,10 +3188,14 @@ Hooks.on("renderChatLog", (_app, html) => {
<button type="button" class="cde-chat-btn cde-chat-btn--tinji">
<i class="fas fa-star"></i> ${game.i18n.localize("CDE.TinJi2")}
</button>
<button type="button" class="cde-chat-btn cde-chat-btn--wheel">
<i class="fas fa-circle-notch"></i> ${game.i18n.localize("CDE.InitiativeWheel")}
</button>
`;
wrapper.addEventListener("click", (ev) => {
if (ev.target.closest(".cde-chat-btn--loksyu")) CDELoksyuApp.open();
if (ev.target.closest(".cde-chat-btn--tinji")) CDETinjiApp.open();
if (ev.target.closest(".cde-chat-btn--wheel")) CDEWheelApp.open();
});
const anchor = el.querySelector(".chat-form") ?? el.querySelector(".chat-message-form") ?? el.querySelector("form");
if (anchor) anchor.parentElement.insertBefore(wrapper, anchor);
@@ -2447,6 +3203,7 @@ Hooks.on("renderChatLog", (_app, html) => {
});
Hooks.on("renderChatMessageHTML", (message, html) => {
injectRollActions(message, html);
if (message.flags?.[SYSTEM_ID]?.welcome) injectWelcomeActions(message, html);
});
Hooks.on("updateSetting", (setting) => {
if (!setting.key) return;
@@ -2454,6 +3211,28 @@ Hooks.on("updateSetting", (setting) => {
refreshAllRollActions();
}
});
Hooks.on("updateActor", (actor, diff) => {
if (!foundry.utils.hasProperty(diff, "system.initiative")) return;
if (!game.combat) return;
const initiative = actor.system.initiative;
const combatant = game.combat.combatants.find((c) => c.actor?.id === actor.id);
if (combatant && combatant.initiative !== initiative) {
combatant.update({ initiative }).catch(() => {
});
}
});
Hooks.on("updateCombatant", (combatant, diff) => {
if (!("initiative" in diff)) return;
const initiative = combatant.initiative;
if (initiative == null) return;
setTimeout(() => {
const actor = combatant.actor;
if (actor && actor.system?.initiative !== initiative) {
actor.update({ "system.initiative": initiative }).catch(() => {
});
}
}, 0);
});
/**
* Chroniques de l'Étrange — Système FoundryVTT
*
+3 -3
View File
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

+43
View File
@@ -0,0 +1,43 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="dm-glow" cx="50%" cy="45%" r="50%">
<stop offset="0%" stop-color="#cc2222" stop-opacity="0.5"/>
<stop offset="100%" stop-color="#cc2222" stop-opacity="0"/>
</radialGradient>
</defs>
<!-- Fond -->
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#dm-glow)"/>
<!-- Flammes infernales en arrière-plan -->
<path d="M30 78 Q28 65 34 56 Q30 62 32 52 Q36 42 42 48 Q38 36 46 28 Q48 42 44 50 Q50 38 54 30 Q56 44 50 54 Q56 46 62 40 Q62 54 56 62 Q62 56 68 52 Q66 64 62 72 Q56 66 54 72 Q50 80 48 72 Q44 64 40 72 Q36 80 30 78 Z"
fill="#cc2222" fill-opacity="0.18" stroke="#cc2222" stroke-width="1" stroke-linejoin="round" opacity="0.7"/>
<!-- Visage de démon - contour de tête -->
<ellipse cx="50" cy="52" rx="20" ry="22" fill="#cc2222" fill-opacity="0.12" stroke="#cc2222" stroke-width="2"/>
<!-- Deux cornes -->
<path d="M36 35 Q32 20 38 16 Q40 24 38 30" fill="#cc2222" fill-opacity="0.7" stroke="#cc2222" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M64 35 Q68 20 62 16 Q60 24 62 30" fill="#cc2222" fill-opacity="0.7" stroke="#cc2222" stroke-width="1.5" stroke-linejoin="round"/>
<!-- Yeux (forme de flamme) -->
<path d="M40 50 Q44 44 48 50 Q44 56 40 50 Z" fill="#cc2222" opacity="0.9"/>
<path d="M52 50 Q56 44 60 50 Q56 56 52 50 Z" fill="#cc2222" opacity="0.9"/>
<!-- Pupilles -->
<ellipse cx="44" cy="50" rx="1.5" ry="2.5" fill="#101622"/>
<ellipse cx="56" cy="50" rx="1.5" ry="2.5" fill="#101622"/>
<!-- Nez aplati (démon) -->
<path d="M47 58 Q50 60 53 58" fill="none" stroke="#cc2222" stroke-width="2" stroke-linecap="round" opacity="0.7"/>
<!-- Bouche avec crocs -->
<path d="M38 66 Q50 74 62 66" fill="none" stroke="#cc2222" stroke-width="2" stroke-linecap="round" opacity="0.8"/>
<!-- Crocs -->
<path d="M43 67 L42 73 L45 68" fill="#cc2222" opacity="0.7"/>
<path d="M57 67 L58 73 L55 68" fill="#cc2222" opacity="0.7"/>
<!-- Sourcils menaçants -->
<path d="M38 44 Q44 40 48 43" fill="none" stroke="#cc2222" stroke-width="2.5" stroke-linecap="round" opacity="0.8"/>
<path d="M52 43 Q56 40 62 44" fill="none" stroke="#cc2222" stroke-width="2.5" stroke-linecap="round" opacity="0.8"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+44
View File
@@ -0,0 +1,44 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="dv-glow" cx="50%" cy="40%" r="55%">
<stop offset="0%" stop-color="#ddaa00" stop-opacity="0.5"/>
<stop offset="100%" stop-color="#ddaa00" stop-opacity="0"/>
</radialGradient>
</defs>
<!-- Fond -->
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#dv-glow)"/>
<!-- Rayons célestes (halo) -->
<line x1="50" y1="10" x2="50" y2="18" stroke="#ddaa00" stroke-width="2" opacity="0.6"/>
<line x1="68" y1="15" x2="64" y2="22" stroke="#ddaa00" stroke-width="2" opacity="0.6"/>
<line x1="80" y1="28" x2="74" y2="32" stroke="#ddaa00" stroke-width="2" opacity="0.6"/>
<line x1="32" y1="15" x2="36" y2="22" stroke="#ddaa00" stroke-width="2" opacity="0.6"/>
<line x1="20" y1="28" x2="26" y2="32" stroke="#ddaa00" stroke-width="2" opacity="0.6"/>
<line x1="86" y1="44" x2="80" y2="46" stroke="#ddaa00" stroke-width="1.5" opacity="0.5"/>
<line x1="14" y1="44" x2="20" y2="46" stroke="#ddaa00" stroke-width="1.5" opacity="0.5"/>
<!-- Halo circulaire doré -->
<circle cx="50" cy="36" r="14" fill="none" stroke="#ddaa00" stroke-width="2.5" opacity="0.8"/>
<circle cx="50" cy="36" r="16" fill="none" stroke="#ddaa00" stroke-width="0.8" opacity="0.4" stroke-dasharray="3,4"/>
<!-- Lotus (5 pétales) -->
<ellipse cx="50" cy="72" rx="8" ry="4" fill="#ddaa00" fill-opacity="0.6" transform="rotate(0,50,72)"/>
<ellipse cx="50" cy="72" rx="8" ry="4" fill="#ddaa00" fill-opacity="0.4" transform="rotate(36,50,72)"/>
<ellipse cx="50" cy="72" rx="8" ry="4" fill="#ddaa00" fill-opacity="0.4" transform="rotate(72,50,72)"/>
<ellipse cx="50" cy="72" rx="8" ry="4" fill="#ddaa00" fill-opacity="0.4" transform="rotate(108,50,72)"/>
<ellipse cx="50" cy="72" rx="8" ry="4" fill="#ddaa00" fill-opacity="0.4" transform="rotate(144,50,72)"/>
<!-- Cœur du lotus -->
<circle cx="50" cy="72" r="4" fill="#ddaa00" fill-opacity="0.8"/>
<!-- Silhouette divine — corps lumineux -->
<ellipse cx="50" cy="36" rx="8" ry="10" fill="#ddaa00" fill-opacity="0.25"/>
<!-- Corps stylisé (robe longue) -->
<path d="M44 44 Q40 58 42 72 Q50 68 58 72 Q60 58 56 44 Z"
fill="#ddaa00" fill-opacity="0.18" stroke="#ddaa00" stroke-width="1.5"/>
<!-- Mains en prière -->
<path d="M44 54 Q38 52 36 56 Q38 60 44 58" fill="#ddaa00" fill-opacity="0.3" stroke="#ddaa00" stroke-width="1.2"/>
<path d="M56 54 Q62 52 64 56 Q62 60 56 58" fill="#ddaa00" fill-opacity="0.3" stroke="#ddaa00" stroke-width="1.2"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+41
View File
@@ -0,0 +1,41 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="ea-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#e8a030" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#e8a030" stop-opacity="0"/>
</radialGradient>
</defs>
<!-- Fond -->
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#ea-glow)"/>
<!-- Anneau extérieur -->
<circle cx="50" cy="50" r="42" fill="none" stroke="#e8a030" stroke-width="1.2" opacity="0.4"/>
<!-- Yin-Yang stylisé (transformation) -->
<!-- Demi-cercle yang (clair) -->
<path d="M50 18 A32 32 0 0 1 50 82 A16 16 0 0 0 50 50 A16 16 0 0 1 50 18 Z"
fill="#e8a030" fill-opacity="0.25" stroke="#e8a030" stroke-width="1.5"/>
<!-- Demi-cercle yin (sombre) -->
<path d="M50 18 A32 32 0 0 0 50 82 A16 16 0 0 1 50 50 A16 16 0 0 0 50 18 Z"
fill="#e8a030" fill-opacity="0.05" stroke="#e8a030" stroke-width="1.5"/>
<!-- Petits cercles yin-yang -->
<circle cx="50" cy="34" r="6" fill="#e8a030" fill-opacity="0.6"/>
<circle cx="50" cy="66" r="6" fill="#e8a030" fill-opacity="0.15" stroke="#e8a030" stroke-width="1.2"/>
<!-- Patte d'animal (5 coussinets) -->
<!-- Coussinet principal (paume) -->
<ellipse cx="50" cy="55" rx="9" ry="7" fill="#e8a030" fill-opacity="0.7"/>
<!-- 4 orteils -->
<ellipse cx="40" cy="44" rx="4" ry="3.5" fill="#e8a030" fill-opacity="0.7" transform="rotate(-15,40,44)"/>
<ellipse cx="45" cy="41" rx="4" ry="3.5" fill="#e8a030" fill-opacity="0.7" transform="rotate(-5,45,41)"/>
<ellipse cx="55" cy="41" rx="4" ry="3.5" fill="#e8a030" fill-opacity="0.7" transform="rotate(5,55,41)"/>
<ellipse cx="60" cy="44" rx="4" ry="3.5" fill="#e8a030" fill-opacity="0.7" transform="rotate(15,60,44)"/>
<!-- Griffes stylisées -->
<path d="M38 42 Q35 38 34 34" fill="none" stroke="#e8a030" stroke-width="1.8" stroke-linecap="round" opacity="0.8"/>
<path d="M43 39 Q42 35 42 31" fill="none" stroke="#e8a030" stroke-width="1.8" stroke-linecap="round" opacity="0.8"/>
<path d="M57 39 Q58 35 58 31" fill="none" stroke="#e8a030" stroke-width="1.8" stroke-linecap="round" opacity="0.8"/>
<path d="M62 42 Q65 38 66 34" fill="none" stroke="#e8a030" stroke-width="1.8" stroke-linecap="round" opacity="0.8"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+41
View File
@@ -0,0 +1,41 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="gh-glow" cx="50%" cy="40%" r="55%">
<stop offset="0%" stop-color="#88ccee" stop-opacity="0.45"/>
<stop offset="100%" stop-color="#88ccee" stop-opacity="0"/>
</radialGradient>
</defs>
<!-- Fond -->
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#gh-glow)"/>
<!-- Silhouette fantôme — tête arrondie -->
<path d="M34 44 Q34 24 50 22 Q66 24 66 44 L66 68 Q62 64 58 68 Q55 72 52 68 Q49 64 50 68 Q47 72 44 68 Q40 64 36 68 Q34 64 34 68 Z"
fill="#88ccee" fill-opacity="0.15" stroke="#88ccee" stroke-width="2" stroke-linejoin="round"/>
<!-- Yeux fantôme — vides, inquiétants -->
<ellipse cx="43" cy="42" rx="4" ry="5" fill="#101622" stroke="#88ccee" stroke-width="1.5" opacity="0.9"/>
<ellipse cx="57" cy="42" rx="4" ry="5" fill="#101622" stroke="#88ccee" stroke-width="1.5" opacity="0.9"/>
<!-- Lueurs dans les yeux -->
<ellipse cx="43" cy="42" rx="1.5" ry="2" fill="#88ccee" opacity="0.5"/>
<ellipse cx="57" cy="42" rx="1.5" ry="2" fill="#88ccee" opacity="0.5"/>
<!-- Kanji 鬼 stylisé en filigrane (simplifié) -->
<!-- Traits horizontaux et verticaux évoquant le caractère -->
<line x1="40" y1="53" x2="60" y2="53" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<line x1="50" y1="53" x2="50" y2="62" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<path d="M42 58 Q50 55 58 58" fill="none" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<!-- Traînée vaporeuse en bas -->
<path d="M38 68 Q36 75 38 82 Q40 88 44 84 Q46 78 48 84 Q50 88 52 84 Q54 78 56 84 Q58 88 62 82 Q64 75 62 68"
fill="#88ccee" fill-opacity="0.08" stroke="#88ccee" stroke-width="1.2" stroke-dasharray="3,3" opacity="0.6"/>
<!-- Chaînes (lien au monde des vivants) — deux petits maillons -->
<circle cx="32" cy="52" r="3" fill="none" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<circle cx="32" cy="58" r="3" fill="none" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<line x1="32" y1="49" x2="32" y2="55" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<circle cx="68" cy="52" r="3" fill="none" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<circle cx="68" cy="58" r="3" fill="none" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
<line x1="68" y1="49" x2="68" y2="55" stroke="#88ccee" stroke-width="1.5" opacity="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

+47
View File
@@ -0,0 +1,47 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="jg-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#22cc88" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#22cc88" stop-opacity="0"/>
</radialGradient>
</defs>
<!-- Fond -->
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#jg-glow)"/>
<!-- Cercle de transformation mystique -->
<circle cx="50" cy="50" r="38" fill="none" stroke="#22cc88" stroke-width="1.2" opacity="0.35" stroke-dasharray="4,3"/>
<!-- Silhouette multi-forme (créature hybride) -->
<!-- Corps central — humanoïde -->
<ellipse cx="50" cy="52" rx="12" ry="15" fill="#22cc88" fill-opacity="0.15" stroke="#22cc88" stroke-width="1.8"/>
<!-- Tête avec cornes/oreilles animales -->
<circle cx="50" cy="35" r="9" fill="#22cc88" fill-opacity="0.15" stroke="#22cc88" stroke-width="1.8"/>
<!-- Oreilles pointues (animal) -->
<path d="M41 30 L38 20 L45 28" fill="#22cc88" fill-opacity="0.5" stroke="#22cc88" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M59 30 L62 20 L55 28" fill="#22cc88" fill-opacity="0.5" stroke="#22cc88" stroke-width="1.5" stroke-linejoin="round"/>
<!-- Yeux (regard surnaturel) -->
<ellipse cx="46" cy="35" rx="3" ry="2" fill="#22cc88" opacity="0.8"/>
<ellipse cx="54" cy="35" rx="3" ry="2" fill="#22cc88" opacity="0.8"/>
<!-- Queue spiralée -->
<path d="M62 60 Q72 58 74 65 Q76 72 68 74 Q62 74 62 68"
fill="none" stroke="#22cc88" stroke-width="2" stroke-linecap="round" opacity="0.7"/>
<!-- Tentacule / membre supplémentaire gauche -->
<path d="M38 55 Q26 52 22 60 Q20 68 28 66"
fill="none" stroke="#22cc88" stroke-width="2" stroke-linecap="round" opacity="0.6"/>
<!-- Écailles / motif sur le corps -->
<path d="M44 46 Q50 42 56 46 Q52 50 50 48 Q48 50 44 46 Z"
fill="#22cc88" fill-opacity="0.3" stroke="#22cc88" stroke-width="1"/>
<path d="M44 52 Q50 48 56 52 Q52 56 50 54 Q48 56 44 52 Z"
fill="#22cc88" fill-opacity="0.3" stroke="#22cc88" stroke-width="1"/>
<!-- Kanji 怪 (étrange) stylisé — simplifié -->
<text x="50" y="81" text-anchor="middle" font-size="11" font-family="serif"
fill="#22cc88" opacity="0.55"></text>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+41
View File
@@ -0,0 +1,41 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="mt-glow" cx="50%" cy="40%" r="50%">
<stop offset="0%" stop-color="#6688aa" stop-opacity="0.35"/>
<stop offset="100%" stop-color="#6688aa" stop-opacity="0"/>
</radialGradient>
</defs>
<!-- Fond -->
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#mt-glow)"/>
<!-- Anneau ésotérique (cercle de protection) -->
<circle cx="50" cy="50" r="40" fill="none" stroke="#6688aa" stroke-width="1.2" opacity="0.4"/>
<circle cx="50" cy="50" r="38" fill="none" stroke="#6688aa" stroke-width="0.6" opacity="0.25" stroke-dasharray="5,4"/>
<!-- Silhouette humaine -->
<!-- Tête -->
<circle cx="50" cy="30" r="9" fill="#6688aa" fill-opacity="0.25" stroke="#6688aa" stroke-width="1.8"/>
<!-- Corps -->
<path d="M40 42 L36 66 L42 66 L45 56 L50 60 L55 56 L58 66 L64 66 L60 42 Z"
fill="#6688aa" fill-opacity="0.2" stroke="#6688aa" stroke-width="1.8" stroke-linejoin="round"/>
<!-- Bras gauche -->
<path d="M40 44 Q30 52 28 60" fill="none" stroke="#6688aa" stroke-width="2" stroke-linecap="round"/>
<!-- Bras droit (levé, tenant un talisman) -->
<path d="M60 44 Q70 48 72 42" fill="none" stroke="#6688aa" stroke-width="2" stroke-linecap="round"/>
<!-- Talisman / ofuda (papier de prière) -->
<rect x="68" y="32" width="10" height="14" rx="1"
fill="#6688aa" fill-opacity="0.2" stroke="#6688aa" stroke-width="1.5"/>
<!-- Lignes du talisman -->
<line x1="70" y1="36" x2="76" y2="36" stroke="#6688aa" stroke-width="1" opacity="0.7"/>
<line x1="70" y1="39" x2="76" y2="39" stroke="#6688aa" stroke-width="1" opacity="0.7"/>
<line x1="70" y1="42" x2="76" y2="42" stroke="#6688aa" stroke-width="1" opacity="0.7"/>
<!-- Symbole occulte sur la poitrine (trigramme Pa Kua simplifié) -->
<line x1="45" y1="46" x2="55" y2="46" stroke="#6688aa" stroke-width="1.5" opacity="0.6"/>
<line x1="45" y1="49" x2="55" y2="49" stroke="#6688aa" stroke-width="1.5" opacity="0.6"/>
<line x1="45" y1="52" x2="50" y2="52" stroke="#6688aa" stroke-width="1.5" opacity="0.6"/>
<line x1="52" y1="52" x2="55" y2="52" stroke="#6688aa" stroke-width="1.5" opacity="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1010 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1024 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 986 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 KiB

+44 -1
View File
@@ -131,6 +131,45 @@
"CDE.InitiativeNPCSpeciality": "Première action (Aptitude) que vous escomptez effectuer",
"CDE.InitiativeRoll": "Jet d'initiative",
"CDE.InitiativeSpeciality": "Première action (Compétence) que vous escomptez effectuer",
"CDE.MigrationTitle": "Migration depuis l'ancien système",
"CDE.MigrationMenuLabel": "Importer des personnages",
"CDE.MigrationMenuHint": "Importer des fiches de personnage depuis l'ancien système CDE",
"CDE.MigrationHint": "Glissez-déposez des fichiers JSON ou cliquez pour les sélectionner.",
"CDE.MigrationDropHint": "Déposez vos fichiers JSON ici",
"CDE.MigrationChooseFiles": "Choisir des fichiers",
"CDE.MigrationPreviewTitle": "Personnages à importer",
"CDE.MigrationClear": "Vider",
"CDE.MigrationColName": "Nom",
"CDE.MigrationColType": "Type",
"CDE.MigrationColItems": "Objets",
"CDE.MigrationColFile": "Fichier source",
"CDE.MigrationImport": "Importer",
"CDE.MigrationSuccess": "{count} personnage(s) importé(s) : {names}",
"CDE.MigrationPartialError": "{count} personnage(s) n'ont pas pu être importés.",
"CDE.MigrationErrorNotJson": "Le fichier « {file} » n'est pas un fichier JSON.",
"CDE.MigrationErrorParse": "Erreur lors de la lecture de « {file} » : {error}",
"CDE.InitiativeWheel": "Roue d'Initiative",
"CDE.InitiativeWheelOpen": "Ouvrir la Roue d'Initiative",
"CDE.InitiativeWheelHint": "Roue d'initiative Les Chroniques de l'Étrange",
"CDE.ActionCostAttack": "Attaque",
"CDE.ActionCostDefense": "Défense",
"CDE.ActionCostDefendAlly": "Défendre un allié",
"CDE.ActionCostMove": "Déplacement",
"CDE.ActionCostHelp": "Aide",
"CDE.ActionCostAim": "Viser",
"CDE.ActionCostChangeStyle": "Changer d'art",
"CDE.ActionCostDraw": "Dégainer",
"CDE.ActionCostDelay": "Retarder (événement)",
"CDE.ActionCostAdvance": "Avancer de {n} crans",
"CDE.ActiveCombatant": "Combat en cours — ce personnage agit maintenant",
"CDE.AdvanceCombatant": "Avancer sur la roue",
"CDE.Combatants": "Combattants",
"CDE.NoCombatActive": "Aucun combat en cours",
"CDE.SelectCombatantHint": "Cliquez sur un combattant pour sélectionner ses actions",
"CDE.SurprisedAction": "Pris par surprise",
"CDE.SurprisedHint": "Place le personnage sur le cran de référence (position 1)",
"CDE.WheelCran": "Cran",
"CDE.WheelReference": "Repère",
"CDE.Inquiry": "Renseignement",
"CDE.InternalCinnabar": "Cinabre Interne",
"CDE.Investigation": "Enquête",
@@ -187,6 +226,9 @@
"CDE.New": "Nouveau",
"CDE.NextTimeGoToTheSettings": "Tout ceci est paramétrable dans les Préférences",
"CDE.NgHang": "Ng Hang",
"CDE.NghangDiagramTitle": "Diagramme des Ng Hang (Cinq Éléments)",
"CDE.ZoomDiagram": "Agrandir le diagramme",
"CDE.LoksyuDiagramTitle": "Loksyu (Huit Trigrammes)",
"CDE.NoTemplate": "Aucun Modèle",
"CDE.NoSupernaturals": "Aucun pouvoir surnaturel",
"CDE.NoSpells": "Aucun sortilège",
@@ -390,5 +432,6 @@
"CDE.TotalDamage": "Dommages",
"CDE.WeaponRoll": "Jet d'arme",
"CDE.RangePenalty": "Pénalité de portée",
"CDE.SuccessTimesDamage": "succès × dégâts de base"
"CDE.SuccessTimesDamage": "succès × dégâts de base",
"CDE.WelcomeOpenHelp": "Ouvrir l'aide en ligne"
}
+3538
View File
File diff suppressed because it is too large Load Diff
+293
View File
@@ -0,0 +1,293 @@
{
"_id": "CDEGuideMain0001",
"_key": "!journal!CDEGuideMain0001",
"name": "Guide du Système CDE",
"pages": [
{
"_id": "CDEHelpP01Intro",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP01Intro",
"name": "Bienvenue dans CDE",
"type": "text",
"text": {
"content": "\n<h1>Bienvenue dans les Chroniques de l'Étrange</h1>\n<p>Ce guide vous présente l'interface du système FoundryVTT pour <em>Chroniques de l'Étrange</em> (CDE), jeu de rôle d'enquête et d'action surnaturelle dans le Hong Kong contemporain, édité par Antre-Monde Éditions.</p>\n<h2>Structure du système</h2>\n<ul>\n<li><strong>Fiches de personnage (Fat Si)</strong> — Héros joueurs avec cinq aspects Wu Xing, compétences, Trois Trésors et équipement.</li>\n<li><strong>Fiches de PNJ</strong> — Créatures, dieux, fantômes et humains à l'usage du MJ.</li>\n<li><strong>Compendiums</strong> — Arts martiaux, sortilèges, équipements, PNJs, capacités surnaturelles, ingrédients, San Hei.</li>\n<li><strong>Outils de MJ</strong> — Roue d'initiative, compteurs Loksyu/Tin Ji, outil de migration.</li>\n</ul>\n<p>Naviguez dans ce journal via les onglets de page pour découvrir chaque aspect du système.</p>\n",
"format": 1,
"markdown": ""
},
"sort": 100000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP02WuXin",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP02WuXin",
"name": "Le Cycle Wu Xing",
"type": "text",
"text": {
"content": "\n<h1>Le Cycle Wu Xing (五行)</h1>\n<p>Le Wu Xing est le cœur du système de résolution. Cinq aspects — <strong>Métal (㊎)</strong>, <strong>Eau (㊌)</strong>, <strong>Terre (㊏)</strong>, <strong>Feu (㊋)</strong> et <strong>Bois (㊍)</strong> — définissent les capacités d'un personnage.</p>\n<h2>Faces des d10 et résultats</h2>\n<p>Chaque aspect est associé à deux faces du d10. Lors d'un jet, vous déclarez l'aspect utilisé avant de lancer vos dés. Chaque dé donne un résultat :</p>\n<ul>\n<li><strong>Succès</strong> — avancez vers votre objectif.</li>\n<li><strong>Dés-fastes (吉)</strong> — résultats favorables supplémentaires.</li>\n<li><strong>Dés-néfastes (凶)</strong> — complications.</li>\n<li><strong>Loksyu (落穗)</strong> — alimentent le compteur mondial de chance collective.</li>\n<li><strong>Tin Ji (天機)</strong> — alimentent le compteur de destin.</li>\n</ul>\n<h2>Correspondances</h2>\n<table>\n<thead><tr><th>Aspect</th><th>Faces d10</th><th>Caractère</th></tr></thead>\n<tbody>\n<tr><td>㊎ Métal</td><td>1 &amp; 6</td><td>Agressif, passionné, combatif</td></tr>\n<tr><td>㊌ Eau</td><td>2 &amp; 7</td><td>Souple, appliqué, adaptable</td></tr>\n<tr><td>㊏ Terre</td><td>3 &amp; 8</td><td>Obstiné, résilient, endurant</td></tr>\n<tr><td>㊋ Feu</td><td>4 &amp; 9</td><td>Chaleureux, créatif, empathique</td></tr>\n<tr><td>㊍ Bois</td><td>5 &amp; 10</td><td>Intuitif, observateur, instinctif</td></tr>\n</tbody>\n</table>\n<p><em>La valeur d'un aspect (de 1 à 5) détermine le nombre de dés que vous lancez.</em></p>\n",
"format": 1,
"markdown": ""
},
"sort": 200000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP03Sheet",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP03Sheet",
"name": "La Fiche de Personnage",
"type": "text",
"text": {
"content": "\n<h1>La Fiche de Personnage (Fat Si)</h1>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/character-sheet-nghang.png\" alt=\"Fiche de personnage — onglet Ng Hang\"/><figcaption>Onglet Ng Hang : les cinq aspects Wu Xing</figcaption></figure>\n<p>La fiche de personnage se décompose en sept onglets :</p>\n<ol>\n<li><strong>Description</strong> — Biographie, concept, gardien céleste.</li>\n<li><strong>Ng Hang</strong> — Les cinq aspects Wu Xing (valeur 15). Cliquez sur l'image du dé pour lancer.</li>\n<li><strong>Compétences</strong> — Les compétences générales et ressources.</li>\n<li><strong>Trois Trésors</strong> — Hei-Yang, Hei-Yin et les niveaux de dés.</li>\n<li><strong>Magies</strong> — Les cinq écoles de magie et leurs sortilèges.</li>\n<li><strong>Kung Fu</strong> — Arts martiaux possédés.</li>\n<li><strong>Équipement</strong> — Objets portés.</li>\n</ol>\n<h2>En-tête de fiche</h2>\n<p>En haut de la fiche se trouvent le <strong>concept du personnage</strong>, son <strong>gardien céleste</strong> (aspect dominant) et la zone d'<strong>initiative</strong> avec les boutons ±.</p>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/character-sheet-skills.png\" alt=\"Fiche de personnage — onglet Compétences\"/><figcaption>Onglet Compétences : compétences et ressources</figcaption></figure>\n",
"format": 1,
"markdown": ""
},
"sort": 300000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP04Treas",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP04Treas",
"name": "Les Trois Trésors",
"type": "text",
"text": {
"content": "\n<h1>Les Trois Trésors (三寶)</h1>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/character-sheet-treasures.png\" alt=\"Fiche de personnage — onglet Trois Trésors\"/><figcaption>Onglet Trois Trésors : Hei-Yang, Hei-Yin et niveaux de dés</figcaption></figure>\n<p>Les Trois Trésors représentent les réserves d'énergie vitale du personnage :</p>\n<h2>Hei-Yang (陽氣) et Hei-Yin (陰氣)</h2>\n<p>Ce sont les deux jauges de vitalité. Le Hei-Yang représente l'énergie active, le Hei-Yin l'énergie passive. Ensemble, ils forment le <strong>token attribute</strong> visible sur la carte.</p>\n<h2>Niveaux de dés</h2>\n<p>Les niveaux de dés (d4 → d6 → d8 → d10 → d12) reflètent la progression du personnage dans un aspect. Chaque niveau de dé confère un bonus ou un avantage supplémentaire.</p>\n<h2>Blessures</h2>\n<p>Les blessures s'accumulent et imposent des malus croissants :</p>\n<ul>\n<li>Blessé : 1 dé à tous les jets</li>\n<li>Gravement blessé : 2 dés</li>\n<li>État critique : 3 dés</li>\n</ul>\n",
"format": 1,
"markdown": ""
},
"sort": 400000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP05Magic",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP05Magic",
"name": "Magie",
"type": "text",
"text": {
"content": "\n<h1>Magie</h1>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/character-sheet-magics.png\" alt=\"Fiche de personnage — onglet Magies\"/><figcaption>Onglet Magies : les cinq écoles et leurs sortilèges</figcaption></figure>\n<p>CDE dispose de cinq écoles de magie, chacune divisée en cinq spécialités :</p>\n<ul>\n<li><strong>Cinabre Interne</strong> (内丹) — magie du souffle et du corps.</li>\n<li><strong>Alchimie</strong> (外丹) — préparations, potions et talismans matériels.</li>\n<li><strong>Maîtrise du Tao</strong> (道術) — maîtrise des principes cosmiques.</li>\n<li><strong>Exorcisme</strong> (驅魔) — combat contre les entités surnaturelles.</li>\n<li><strong>Géomancie</strong> (風水) — magie des lieux et de l'environnement.</li>\n</ul>\n<h2>Utiliser un sortilège</h2>\n<ol>\n<li>Cliquez sur l'icône dé du sort dans l'onglet Magies.</li>\n<li>Un dialog apparaît avec l'aspect associé, le coût en Hei et le nombre de dés.</li>\n<li>Validez pour effectuer le jet.</li>\n</ol>\n<p>Les sortilèges sont importés depuis le compendium <em>Sortilèges</em> et glissés sur la fiche.</p>\n",
"format": 1,
"markdown": ""
},
"sort": 500000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP06KungF",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP06KungF",
"name": "Arts Martiaux",
"type": "text",
"text": {
"content": "\n<h1>Arts Martiaux (武術)</h1>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/character-sheet-kungfu.png\" alt=\"Fiche de personnage — onglet Kung Fu\"/><figcaption>Onglet Kung Fu : arts martiaux possédés</figcaption></figure>\n<p>Les arts martiaux représentent les techniques de combat du personnage. Chaque art martial possède :</p>\n<ul>\n<li><strong>Un mode d'activation</strong> : passif, action d'attaque, réaction, etc.</li>\n<li><strong>Une description</strong> des effets en jeu.</li>\n</ul>\n<h2>Importer un art martial</h2>\n<p>Ouvrez le compendium <em>Arts Martiaux</em> et faites glisser une technique sur la fiche du personnage. Elle apparaît alors dans l'onglet Kung Fu.</p>\n<h2>Types d'activation</h2>\n<table>\n<thead><tr><th>Type</th><th>Déclencheur</th></tr></thead>\n<tbody>\n<tr><td>Passif (dés)</td><td>Toujours actif</td></tr>\n<tr><td>Action d'attaque</td><td>Lors d'une attaque</td></tr>\n<tr><td>Action de défense</td><td>Lors d'une défense</td></tr>\n<tr><td>Réaction</td><td>En réponse à un événement</td></tr>\n<tr><td>Dégâts infligés</td><td>Quand vous blessez</td></tr>\n</tbody>\n</table>\n",
"format": 1,
"markdown": ""
},
"sort": 600000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP07Items",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP07Items",
"name": "Équipement & Inventaire",
"type": "text",
"text": {
"content": "\n<h1>Équipement &amp; Inventaire</h1>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/character-sheet-items.png\" alt=\"Fiche de personnage — onglet Équipement\"/><figcaption>Onglet Équipement : objets portés</figcaption></figure>\n<p>L'onglet Équipement liste tout ce que porte le personnage. Les objets sont classés en plusieurs catégories :</p>\n<ul>\n<li><strong>Armes</strong> — avec dégâts, distance et type.</li>\n<li><strong>Protections</strong> — armures et protections spirituelles.</li>\n<li><strong>San Hei (三氣)</strong> — objets magiques à charges.</li>\n<li><strong>Ingrédients</strong> — matériaux pour l'alchimie.</li>\n<li><strong>Équipement générique</strong> — tout autre objet.</li>\n</ul>\n<h2>Ajouter un objet</h2>\n<p>Faites glisser un objet depuis un compendium (Armes, Protections, San Hei, Ingrédients, Équipements) ou créez-en un avec le bouton <em>Créer</em> correspondant.</p>\n<p>Cliquez sur l'image d'un objet pour ouvrir sa fiche détaillée.</p>\n",
"format": 1,
"markdown": ""
},
"sort": 700000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP08NPCSH",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP08NPCSH",
"name": "Les PNJ",
"type": "text",
"text": {
"content": "\n<h1>Les Personnages Non-Joueurs (PNJ)</h1>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/npc-sheet.png\" alt=\"Fiche de PNJ\"/><figcaption>Fiche PNJ : type, nuisance, menace et aptitudes</figcaption></figure>\n<p>Les PNJ ont une fiche simplifiée par rapport aux personnages joueurs.</p>\n<h2>Caractéristiques</h2>\n<ul>\n<li><strong>Type de créature</strong> : Mortel, Démon, Esprit, Esprit animal, Fantôme, Jiugwaai, Dieu/Divinité.</li>\n<li><strong>Capacité de nuisance</strong> : Figurant, Sbire, Adversaire, Allié, Boss, Divinité.</li>\n<li><strong>Niveau de menace</strong> : Profane → Apprenti → Initié → Accompli → Renommé.</li>\n</ul>\n<h2>Aptitudes</h2>\n<p>Les PNJ ont quatre aptitudes (Physique, Martiale, Mentale, Sociale) avec une spécialité optionnelle chacune.</p>\n<h2>Capacités surnaturelles</h2>\n<p>Les PNJ peuvent avoir des capacités importées depuis le compendium <em>Capacités Surnaturelles</em>.</p>\n",
"format": 1,
"markdown": ""
},
"sort": 800000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP09Initi",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP09Initi",
"name": "Initiative & Combat",
"type": "text",
"text": {
"content": "\n<h1>Initiative &amp; Combat</h1>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/initiative-wheel.png\" alt=\"Roue d'initiative\"/><figcaption>La Roue d'Initiative : 24 crans, couleurs Wu Xing</figcaption></figure>\n<h2>La Roue d'Initiative</h2>\n<p>La roue est un cercle de <strong>24 crans</strong> numérotés. L'initiative de chaque personnage est calculée comme suit :</p>\n<ul>\n<li><strong>Personnage joueur</strong> : Prouesse + valeur de compétence de la première action.</li>\n<li><strong>PNJ</strong> : Aptitude physique + aptitude de la première action.</li>\n</ul>\n<p>Les crans sont colorés selon le cycle Wu Xing (4 crans par couleur, 6 couleurs). <strong>Un effet qui dure 6 crans</strong> court jusqu'au prochain cran de la même couleur.</p>\n<h2>Ordre d'action</h2>\n<p>Les personnages agissent <strong>du numéro le plus élevé au plus bas</strong>. Après chaque action, le jeton avance dans le sens horaire du <strong>coût de l'action</strong> :</p>\n<table>\n<thead><tr><th>Action</th><th>Coût (crans)</th></tr></thead>\n<tbody>\n<tr><td>Défense</td><td>1</td></tr>\n<tr><td>Déplacement</td><td>2</td></tr>\n<tr><td>Attaque</td><td>3</td></tr>\n<tr><td>Retarder</td><td>6</td></tr>\n</tbody>\n</table>\n<h2>Accès à la roue</h2>\n<p>Ouvrez la roue depuis la barre latérale du chat (icône roue) ou via la console : <code>game.cde.CDEWheelApp.open()</code>.</p>\n",
"format": 1,
"markdown": ""
},
"sort": 900000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
},
{
"_id": "CDEHelpP10Extra",
"_key": "!journal.pages!CDEGuideMain0001.CDEHelpP10Extra",
"name": "Loksyu, Tin Ji & Migration",
"type": "text",
"text": {
"content": "\n<h1>Loksyu, Tin Ji &amp; Outils de MJ</h1>\n<h2>Loksyu (落穗) et Tin Ji (天機)</h2>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/loksyu-app.png\" alt=\"Application Loksyu\"/><figcaption>Application Loksyu : compteurs Yin/Yang et Tin Ji</figcaption></figure>\n<p>Ces deux compteurs sont <strong>partagés entre tous les joueurs</strong> et le MJ :</p>\n<ul>\n<li><strong>Loksyu</strong> — Se divise en Yin et Yang. Les jets de dés alimentent ces compteurs selon les résultats. Les joueurs peuvent puiser dans le Loksyu pour améliorer leurs jets.</li>\n<li><strong>Tin Ji</strong> — Le compteur de destin. Peut être dépensé pour des effets exceptionnels.</li>\n</ul>\n<p>Accédez via la barre du chat ou : <code>game.cde.CDELoksyuApp.open()</code></p>\n<h2>Migration de l'ancien système</h2>\n<figure><img src=\"systems/fvtt-chroniques-de-l-etrange/images/ui/migration-dialog.png\" alt=\"Outil de migration\"/><figcaption>Outil de migration : importation depuis l'ancien système</figcaption></figure>\n<p>Si vous possédez des fiches de personnage créées dans l'ancien système CDE (non maintenu), l'outil de migration les convertit automatiquement :</p>\n<ol>\n<li>Ouvrez <strong>Paramètres de la partie → Paramètres du système → Importer des personnages</strong>.</li>\n<li>Glissez les fichiers JSON des anciens personnages dans la zone de dépôt.</li>\n<li>Vérifiez l'aperçu et cliquez <strong>Importer</strong>.</li>\n</ol>\n<p>Les personnages migrés apparaissent dans la liste des Acteurs.</p>\n",
"format": 1,
"markdown": ""
},
"sort": 1000000,
"title": {
"show": true,
"level": 1
},
"image": {
"caption": ""
},
"video": {
"controls": true,
"volume": 0.5
},
"src": null,
"flags": {},
"ownership": {
"default": -1
}
}
],
"sort": 0,
"ownership": {
"default": 0
},
"flags": {},
"folder": null
}
@@ -11,7 +11,7 @@
"aspect": "metal",
"skill": "kungfu",
"speciality": "Poignard",
"style": "<p>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 dattaque (ou augmente de 1 la valeur de lAptitude Techniques</p>",
"style": "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 valeur de l'Aptitude martiale dans le cas d'un PNJ).",
"techniques": {
"technique1": {
"check": true,
@@ -23,7 +23,7 @@
"check": true,
"name": "le système de combat",
"activation": "reaction",
"technique": "<p>Le corps résistant et la position immuable du pratiquant le rendent difficile à blesser. Si le personnage choisit de ne pas utiliser daction de défense contre une attaque, le personnage utilise sa valeur de Métal (ou dAptitude martiale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1). martiale dans le cas dun PNJ). Sil décide dutiliser ce Style au moment où est déterminée lInitiative, le personnage peut décider de remplacer son score normal dInitiative par le double de sa valeur de Feu (ou dAptitude sociale pour un PNJ). les chroniqu</p>"
"technique": "<p>Le corps résistant et la position immuable du pratiquant le rendent difficile à blesser. Si le personnage choisit de ne pas utiliser daction de défense contre une attaque, le personnage utilise sa valeur de Métal (ou dAptitude martiale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1). martiale dans le cas dun PNJ). Sil décide dutiliser ce Style au moment où est déterminée lInitiative, le personnage peut décider de remplacer son score normal dInitiative par le double de sa valeur de Feu (ou dAptitude sociale pour un PNJ).</p>"
},
"technique3": {
"check": true,
@@ -11,7 +11,7 @@
"aspect": "terre",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>S’étant fortifié le corps à lextrême pour pratiquer le Kung-fu de lInvulnérabilité, le pratiquant résiste à des coups qui laisseraient dautres sur le carreau. Le personnage obtient une protection de 2.</p>",
"style": "S’étant fortifié le corps à lextrême pour pratiquer le Kung-fu de lInvulnérabilité, le pratiquant résiste à des coups qui laisseraient dautres sur le carreau. Le personnage obtient une protection de 2.",
"techniques": {
"technique1": {
"check": true,
@@ -23,7 +23,7 @@
"check": true,
"name": "La volonté de fer",
"activation": "action-attack-defense",
"technique": "<p>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. Sil 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. Sil sagit dun 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</p>"
"technique": "<p>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. Sil 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. Sil sagit dun PNJ, il récupère 1 point de Vitalité. Forme des Couteaux papillon</p>"
},
"technique3": {
"check": false,
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
@@ -6,18 +6,18 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>Le Hung Gar, natif de la province du Guangdong, est très populaire aussi bien en Chine qu’à l’étranger. On le surnomme également la Boxe du Tigre et de la Grue bien quil adopte des postures typiques dautres animaux (léopard, dragon, serpent). Cette boxe était notamment pratiquée par le grand héros Wong Feihung. À partir de positions basses et stables, les membres supérieurs sont au cœur des techniques du Hung Gar, autant pour porter des coups que pour utiliser lune des nombreuses techniques de blocage contre ladversaire. Le Coeng Kyun offre au pratiquant une mobilité exceptionnelle, se traduisant par un jeu de jambes élaboré. Le personnage peut dépenser 2 dés-fastes obtenus lors dune action de défense pour obtenir une action de déplacement gratuite (sans dépenser de crans dinitiative supplémentaires) qui a lieu immédiatement après que laction de défense est résolue. difficulté pour le toucher (au lieu de la difficulté normale de 1). de l’étrange Il sappuie essentiellement sur des coups de pied sautés et des frappes allongées permettant datteindre ladversaire, même quand celui-ci se croit hors de portée.</p>",
"description": "<p>Le Hung Gar, natif de la province du Guangdong, est très populaire aussi bien en Chine qu’à l’étranger. On le surnomme également la Boxe du Tigre et de la Grue bien quil adopte des postures typiques dautres animaux (léopard, dragon, serpent). Cette boxe était notamment pratiquée par le grand héros Wong Feihung. À partir de positions basses et stables, les membres supérieurs sont au cœur des techniques du Hung Gar, autant pour porter des coups que pour utiliser lune des nombreuses techniques de blocage contre ladversaire. Le Coeng Kyun offre au pratiquant une mobilité exceptionnelle, se traduisant par un jeu de jambes élaboré. Le personnage peut dépenser 2 dés-fastes obtenus lors dune action de défense pour obtenir une action de déplacement gratuite (sans dépenser de crans dinitiative supplémentaires) qui a lieu immédiatement après que laction de défense est résolue. difficulté pour le toucher (au lieu de la difficulté normale de 1).</p>",
"orientation": "yang",
"aspect": "feu",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>Le Hung Gar est un art martial qui privilégie lagressivité et la puissance. Le personnage gagne 1 dé supplémentaire sur chacun de ses jets dattaque (ou augmente de 1 la valeur de lAptitude martiale dans le cas dun PNJ) et inflige 1 dégât supplémentaire à mains nues. Techniques</p>",
"style": "Le Hung Gar est un art martial qui privilégie lagressivité et la puissance. Le personnage gagne 1 dé supplémentaire sur chacun de ses jets dattaque (ou augmente de 1 la valeur de lAptitude martiale dans le cas dun PNJ) et inflige 1 dégât supplémentaire à mains nues.",
"techniques": {
"technique1": {
"check": true,
"name": "Le tigre déchire sa proie",
"activation": "damage-inflicted",
"technique": "<p>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 dAptitude martiale pour un PNJ) au lieu de 1 pour cette attaque. niq e</p>"
"technique": "<p>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 dAptitude martiale pour un PNJ) au lieu de 1 pour cette attaque.</p>"
},
"technique2": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Lanimal acculé mord le chasseur",
"activation": "dice",
"technique": "<p>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</p>"
"technique": "<p>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)</p>"
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
@@ -11,7 +11,7 @@
"aspect": "bois",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>Telle la fameuse arme traditionnelle dont sinspire cette boxe, le pratiquant fuse à grande vitesse pour arriver à portée de son adversaire. Une action de déplacement coûte 1 cran dinitiative (au lieu de 2) au personnage. La pointe de la lance</p>",
"style": "Telle la fameuse arme traditionnelle dont sinspire cette boxe, le pratiquant fuse à grande vitesse pour arriver à portée de son adversaire. Une action de déplacement coûte 1 cran dinitiative (au lieu de 2) au personnage. La pointe de la lance",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "La pensée précède la forme",
"activation": "dice",
"technique": "<p>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 dattaque 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</p>"
"technique": "<p>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 dattaque 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)."
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
@@ -6,30 +6,30 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>Rarement enseigné dans les écoles, en raison de ses formes particulières et des légendes scabreuses entourant ses origines, ce style est sans arme les plus anciennes. La version la plus populaire sur sa naissance prétend que son créateur découvrit les arcanes du Zeoi Kyun alors quil sétait ennivré, après avoir tenté en vain de comprendre les dessins faits par son maître qui voulait lui transmettre ses secrets. La Boxe de lIvresse évoque irrésistiblement les attitudes et formes des arts martiaux classiques, tels quils seraient singés par un ivrogne. En réalité, ce style repose entièrement sur les notions de mobilité et dimprévisibilité. Il vise à déstabiliser ladversaire, en prétendant effectuer des attaques ou des gardes maladroites. Ainsi, en dépit des apparences, il sagit dun art martial très difficile à maîtriser.</p>",
"description": "<p>Rarement enseigné dans les écoles, en raison de ses formes particulières et des légendes scabreuses entourant ses origines, ce style est pourtant au nombre des techniques de combat sans arme les plus anciennes. La version la plus populaire sur sa naissance prétend que son créateur découvrit les arcanes du Zeoi Kyun alors qu'il s'était ennivré, après avoir tenté en vain de comprendre les dessins faits par son maître qui voulait lui transmettre ses secrets. La Boxe de l'Ivresse évoque irrésistiblement les attitudes et formes des arts martiaux classiques, tels qu'ils seraient singés par un ivrogne. En réalité, ce style repose entièrement sur les notions de mobilité et d'imprévisibilité. Il vise à déstabiliser l'adversaire, en prétendant effectuer des attaques ou des gardes maladroites. Ainsi, en dépit des apparences, il s'agit d'un art martial très difficile à maîtriser.</p>",
"orientation": "yin",
"aspect": "eau",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>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 double. le système de combat</p>",
"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 soient réussies ou non.",
"techniques": {
"technique1": {
"check": true,
"name": "La terre tourne autour du soleil",
"name": "Les mains collantes",
"activation": "damage-inflicted",
"technique": "<p>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 lIvresse. Le personnage élimine gratuitement 2 dés-néfastes sur ses actions dattaque, quelles so</p>"
"technique": "<p>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.</p>"
},
"technique2": {
"check": true,
"name": "Chuter du ciel",
"activation": "dice",
"technique": "<p>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 dune attaque réussie, le personnage fait tomber son adversaire et peut dépenser les dés-fastes obtenus à son action dattaque pour faire perdre des crans dinitiative à sa cible (à raison de 1 pour 1, maximum 3). Lattaque inflige</p>"
"name": "Contrer l'impulsion",
"activation": "reaction",
"technique": "<p>Placé au plus proche de son adversaire, le pratiquant oriente les mouvements de celui-ci par un contrôle de ses poings et de ses pieds. S'il choisit de ne pas utiliser d'action de défense contre une attaque, le personnage utilise sa valeur de Terre (ou d'Aptitude physique pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1).</p>"
},
"technique3": {
"check": true,
"name": "La lame senvole",
"activation": "action-defense",
"technique": "<p>Lorsquil affronte un combattant armé, le pratiquant prend bien garde à le priver de cet atout. Lors dune défense au contact réussie, le personnage désarme son adversaire et larme est projetée à distance courte. Si le personnage dépense 2 dés-fastes à cet effet, larme e</p>"
"name": "Le double coup de paume",
"activation": "damage-inflicted",
"technique": "<p>Le pratiquant effectue une double frappe afin de maximiser l'impact de ses attaques. Les dégâts à mains nues du personnage sont égaux à sa valeur de Bois (ou d'Aptitude spirituelle pour un PNJ) au lieu de 1 pour cette attaque.</p>"
}
}
},
@@ -6,7 +6,7 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>Bien quon en connaisse surtout la version moderne, qui relève davantage dune discipline sportive le kung-fu pratiqué en compétition , le Coeng Kyun est à lorigine un art martial externe conçu par lethnie musulmane des Hui, dans le nord de la Chine. Techniques Le bond du fauve Activation : Action dattaque Le pratiquant entre dans la garde de son adversaire en un éclair quand il passe à lattaque. Le personnage ajoute à son action dattaque une action de déplacement gratuite (donc sans dépenser de crans dinitiative supplémentaires). Il peut alors se déplacer puis attaquer, m</p>",
"description": "<p>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 par l'ethnie musulmane des Hui, dans le nord de la Chine. Il s'appuie essentiellement sur des coups de pied sautés et des frappes allongées permettant d'atteindre l'adversaire, même quand celui-ci se croit hors de portée.</p>",
"orientation": "yang",
"aspect": "feu",
"skill": "kungfu",
@@ -29,7 +29,7 @@
"check": true,
"name": "Lenvol de la grue",
"activation": "reaction",
"technique": "<p>Tout comme il sait se rapprocher pour attaquer, le pratiquant sait se mettre hors datteinte des coups de son adversaire en adoptant une garde à la fois solide et gracieuse. Sil choisit de ne pas utiliser daction de défense contre une attaque, le personnage utilise sa valeur de Feu (ou dAptitude 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 très populaire aussi</p>"
"technique": "<p>Tout comme il sait se rapprocher pour attaquer, le pratiquant sait se mettre hors datteinte des coups de son adversaire en adoptant une garde à la fois solide et gracieuse. Sil choisit de ne pas utiliser daction de défense contre une attaque, le personnage utilise sa valeur de Feu (ou dAptitude sociale pour un PNJ) pour fixer la BoxeGar de) la famille Hong (Hung</p>"
}
}
},
@@ -6,12 +6,12 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>Héros de la dynastie Song, Yue Fei possède la réputation d’être lun des plus grands guerriers de toute lhistoire 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 attaques en sont puissantes et dévastatrices grâce au poids de larme et à sa pointe de fer. Les parades en sont solides et rapides grâce à son long manche en bois. Cest un art martial équilibré qui met à lhonneur une arme typique de la Chine impériale. s c ra le l’ét</p>",
"description": "<p>Héros de la dynastie Song, Yue Fei possède la réputation d’être lun des plus grands guerriers de toute lhistoire 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 attaques en sont puissantes et dévastatrices grâce au poids de larme et à sa pointe de fer. Les parades en sont solides et rapides grâce à son long manche en bois. Cest un art martial équilibré qui met à lhonneur une arme typique de la Chine impériale.</p>",
"orientation": "yinyang",
"aspect": "terre",
"skill": "kungfu",
"speciality": "Lance",
"style": "<p>Le pratiquant met à profit lavantage que lui procure la longueur de sa lance. Le personnage peut porter une attaque à distance courte comme sil se trouvait au contact. Techniques</p>",
"style": "Le pratiquant met à profit lavantage que lui procure la longueur de sa lance. Le personnage peut porter une attaque à distance courte comme sil se trouvait au contact.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Retenir lavalanche",
"activation": "action-defense",
"technique": "<p>Dune solidité à toute épreuve, la lance bloque et repousse les opposants du pratiquant. Si laction de défense du personnage est réussie, son agresseur est projeté à distance courte. Sil dépense 2 dés-fastes à cet effet, lagresseur 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 à larc doit sa création à un jeune chas</p>"
"technique": "<p>Dune solidité à toute épreuve, la lance bloque et repousse les opposants du pratiquant. Si laction de défense du personnage est réussie, son agresseur est projeté à distance courte. Sil dépense 2 dés-fastes à cet effet, lagresseur est projeté à distance médiane. Les Éclairs de Leoi Gung</p>"
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
@@ -6,30 +6,30 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>La Paume des Huit Trigrammes vient du nord de la Chine et plus précisément des Monts Wudang berceau de nombreux arts martiaux chinois. Il sagit dun art martial privilégiant les attaques à main ouverte (plutôt que le poing fermé) ainsi que la mobilité et la fluidité : le des déplacements circulaires incessants au sein dun cercle imaginaire figurant le taaigik.</p>",
"description": "<p>La Paume des Huit Trigrammes vient du nord de la Chine et plus précisément des Monts Wudang berceau de nombreux arts martiaux chinois. Il s'agit d'un art martial privilégiant les attaques à main ouverte (plutôt que le poing fermé) ainsi que la mobilité et la fluidité : le pratiquant contrôle son espace de combat par des déplacements circulaires incessants au sein d'un cercle imaginaire figurant le taaigik.</p>",
"orientation": "yin",
"aspect": "metal",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>Une grande mobilité est le principal atout du pratiquant de la Paume des Huit Trigrammes. Une action de déplacement coûte 1 cran dinitiative (au lieu de 2) au personnage. Techniques Contourner lobstacle</p>",
"style": "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": {
"technique1": {
"check": true,
"name": "Les mains collantes",
"name": "Contourner l'obstacle",
"activation": "reaction",
"technique": "<p>Constamment en mouvement face à son adversaire, le pratiquant loblige à sépuiser pour latteindre. Une attaque contre le personnage coûte</p>"
"technique": "<p>Constamment en mouvement face à son adversaire, le pratiquant l'oblige à s'épuiser pour l'atteindre. Une attaque contre le personnage coûte 1 cran d'initiative supplémentaire à l'agresseur.</p>"
},
"technique2": {
"check": true,
"name": "Contourner l'obstacle",
"name": "La terre tourne autour du soleil",
"activation": "action-attack",
"technique": "<p>Constamment en mouvement face à son\nadversaire, le pratiquant loblige à s’épuiser\npour latteindre. Une attaque contre le personnage coûte 1 cran dinitiative supplémentaire à\nlagresseur.\nActivation : Action dattaque\nCherchant inlassablement à obtenir une position privilégiée, le pratiquant délivre des frappes\nrapides et précises. Cette action dattaque du personnage lui coûte 2 crans dinitiative (au lieu de 3). La main du dragon Activation : Action dattaque\nDès quil se trouve dans la posi</p>"
"technique": "<p>Cherchant inlassablement à obtenir une position privilégiée, le pratiquant délivre des frappes rapides et précises. Cette action d'attaque du personnage lui coûte 2 crans d'initiative (au lieu de 3).</p>"
},
"technique3": {
"check": true,
"name": "La main du dragon",
"activation": "action-attack",
"technique": "<p>Dès quil 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 augmenter ses dégâts comptent double. De plus, les dégâts à mains nues du personnage sont égaux à sa valeur de Terre (ou dAptitude physique pour un PNJ) au l</p>"
"technique": "<p>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 augmenter ses dégâts comptent double. De plus, les dégâts à mains nues du personnage sont égaux à sa valeur de Terre (ou d'Aptitude physique pour un PNJ) au lieu de 1 pour cette attaque.</p>"
}
}
},
+3 -3
View File
@@ -11,7 +11,7 @@
"aspect": "bois",
"skill": "kungfu",
"speciality": "Bâton",
"style": "<p>La souplesse dutilisation du bâton rend cette arme redoutable entre les mains du pratiquant. Le personnage gagne 1 dé-faste gratuit sur ses actions dattaque et de défense. Techniques</p>",
"style": "La souplesse dutilisation du bâton rend cette arme redoutable entre les mains du pratiquant. Le personnage gagne 1 dé-faste gratuit sur ses actions dattaque et de défense.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Esquiver les griffes du tigre",
"activation": "reaction",
"technique": "<p>Sa taille et sa légèreté font du bâton une arme de défense efficace. Sil choisit de ne pas utiliser daction de défense contre une attaque, le personnage utilise sa valeur dEau (ou dAptitude 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</p>"
"technique": "<p>Sa taille et sa légèreté font du bâton une arme de défense efficace. Sil choisit de ne pas utiliser daction de défense contre une attaque, le personnage utilise sa valeur dEau (ou dAptitude mentale pour un PNJ) pour fixer la difficulté pour le toucher (au lieu de la difficulté normale de 1)."
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
@@ -6,12 +6,12 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>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 dune redoutable efficacité. Le Taaigik Gim sappuie sur le contrô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</p>",
"description": "<p>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 dune redoutable efficacité. Le Taaigik Gim sappuie sur le contrôle des énergies internes et des coups plus vifs, précis et légers que la majeure partie des techniques</p>",
"orientation": "yin",
"aspect": "eau",
"skill": "kungfu",
"speciality": "Épée",
"style": "<p>L’épée souple est une arme défensive dune extrême efficacité, senroulant 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 valeur de lAptitude martiale dans le cas dun PNJ). Les personnages adverses se voient automatiquement infliger 2 désnéfastes sur leur action visant à le désarmer. Techniques</p>",
"style": "L’épée souple est une arme défensive dune extrême efficacité, senroulant 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 valeur de lAptitude martiale dans le cas dun PNJ). Les personnages adverses se voient automatiquement infliger 2 dés-néfastes sur leur action visant à le désarmer.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Limmortel sur sa montagne",
"activation": "action-attack-defense",
"technique": "<p>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. Sil 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. Sil sagit dun 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 développé au début du sixième</p>"
"technique": "<p>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. Sil 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. Sil sagit dun PNJ, il récupère 1 point de Vitalité."
}
}
},
@@ -11,7 +11,7 @@
"aspect": "eau",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>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 lAptitude martiale dans le cas dun PNJ) et inflige 1 dégât supplémentaire à mains nues. Techniques</p>",
"style": "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 lAptitude martiale dans le cas dun PNJ) et inflige 1 dégât supplémentaire à mains nues.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "La résolution vainc lindécision",
"activation": "action-attack",
"technique": "<p>Quand il passe à lattaque, le pratiquant exploite les failles de son adversaire. Si ladversaire se défend et quil 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 dAptitude martiale pour un PNJ) au lieu de 1 pour cette attaque. BoxeKyun longue (Coeng Orientation : Yang Aspect : Feu Compétence : Kung-fu Spécialité : Mains Nues Bien quon en connaisse surtout la version moderne, qui relève davantage</p>"
"technique": "<p>Quand il passe à lattaque, le pratiquant exploite les failles de son adversaire. Si ladversaire se défend et quil 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 dAptitude martiale pour un PNJ) au lieu de 1 pour cette attaque. BoxeKyun longue (Coeng</p>"
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
+3 -3
View File
@@ -11,7 +11,7 @@
"aspect": "eau",
"skill": "rangedcombat",
"speciality": "Pistolet, Fusil",
"style": "<p>Sa célérité et ses angles de tir improbables permettent au pratiquant de toucher des cibles qui semblent hors datteinte. La portée des attaques du personnage passe de distance longue à distance extrême, et les dégâts des armes à feu sont augmentés de 1 à portée courte. Techniques</p>",
"style": "Sa célérité et ses angles de tir improbables permettent au pratiquant de toucher des cibles qui semblent hors datteinte. La portée des attaques du personnage passe de distance longue à distance extrême, et les dégâts des armes à feu sont augmentés de 1 à portée courte.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Le cri du dragon",
"activation": "damage-inflicted",
"technique": "<p>Vidant ses chargeurs dans un déluge de plomb, le pratiquant sassure doccasionner le maximum de dommages. Le personnage inflige des dégâts supplémentaires égaux à sa valeur de Métal (ou dAptitude 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</p>"
"technique": "<p>Vidant ses chargeurs dans un déluge de plomb, le pratiquant sassure doccasionner le maximum de dommages. Le personnage inflige des dégâts supplémentaires égaux à sa valeur de Métal (ou dAptitude martiale pour un PNJ) sur une attaque réussie. Le Gun Kata</p>"
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
+3 -3
View File
@@ -11,7 +11,7 @@
"aspect": "metal",
"skill": "rangedcombat",
"speciality": "Pistolet, Fusil",
"style": "<p>Le pratiquant comprend intuitivement les trajectoires des tirs qui fusent autour de lui. Pour effectuer une défense face à une attaque à distance, le personnage peut utiliser sa Compétence Armes à feu (Pistolet / Fusil) au lieu de sa Compétence Prouesse. Dans le cas dun PNJ, celui-ci peut baser sa défense sur son Aptitude physique au lieu de son Aptitude martiale.</p>",
"style": "Le pratiquant comprend intuitivement les trajectoires des tirs qui fusent autour de lui. Pour effectuer une défense face à une attaque à distance, le personnage peut utiliser sa Compétence Armes à feu (Pistolet / Fusil) au lieu de sa Compétence Prouesse. Dans le cas dun PNJ, celui-ci peut baser sa défense sur son Aptitude physique au lieu de son Aptitude martiale.",
"techniques": {
"technique1": {
"check": true,
@@ -23,7 +23,7 @@
"check": true,
"name": "le système de combat",
"activation": "action-aid",
"technique": "<p>Le pratiquant tire de façon à avantager ses alliés. Lorsquil utilise laction dAide, le personnage octroie 3 dés supplémentaires à lancer au lieu de 2 (ou donne un + 3 à lAptitude adaptée pour un PNJ au lieu de + 2) au personnage quil assiste. LES ARTS MARTIAUX EN TANT QU’ÉLÉMENT SCÉNARISTIQUE de l’étrange Tir rapide La magie que maîtrisent les fat si est lun des aspects essentiels de Hong Kong Les dans locculte et le surnaturel. Ce chapitre détaille les règles qui gouvernent lusage des diverses magies dont peuvent disposer les PJ. « Un plumeau taoïste à la main, jentamai une suite de mouvements martiaux afin de symboliser le combat du dieu de la guerre Gwaan Dai contre les forces maléfiques. Mes gestes enroulaient des volutes de poussière autour du chasse-mouches jusqu’à ce que d’épaisses spirales entourent lobjet. Classique instrument dexorcisme, le plumeau possède le pouvoir dexpulser les flux néfastes comme une nuée dinsectes indésirables. Afin que mon rituel de purification soit complet, je devais cependant concentrer toute cette énergie Yin et ne pas en laisser une seule bribe m’échapper. Cela me demandait un effort considérable mais la nature même de ma magie me facilitait quelque peu cette tâche. Mes sens mystiques évaluaient avec exactitude la quantité de force négative quil me restait à accumuler autour de mon plumeau afin de nettoyer l’établissement de Pui Gan. Jinjectais en continu mon propre hei dans le chasse-mouches sans cesser ma danse martiale devenant en quelque sorte un aimant à énergie Yin. » — La Résurr</p>"
"technique": "<p>Le pratiquant tire de façon à avantager ses alliés. Lorsquil utilise laction dAide, le personnage octroie 3 dés supplémentaires à lancer au lieu de 2 (ou donne un + 3 à lAptitude adaptée pour un PNJ au lieu de + 2) au personnage quil assiste. LES ARTS MARTIAUX EN TANT QU’ÉLÉMENT SCÉNARISTIQUE</p>"
},
"technique3": {
"check": false,
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
@@ -11,7 +11,7 @@
"aspect": "bois",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>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 dattaque et de défense et inflige 1 dégât supplémentaire à mains nues. Techniques</p>",
"style": "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 dattaque et de défense et inflige 1 dégât supplémentaire à mains nues.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Sois comme leau",
"activation": "dice",
"technique": "<p>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 dEau (ou dAptitude 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</p>"
"technique": "<p>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 dEau (ou dAptitude mentale pour un PNJ). BoxePensée de la(Jingji FormeKyun et ) de la</p>"
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
+3 -3
View File
@@ -11,7 +11,7 @@
"aspect": "terre",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "<p>Lobjectif du Seot Gaau est de gêner les mouvements de lopposant par lapplication de clés, dimmobilisations, de saisies… Le personnage obtient automatiquement 2 dés-fastes supplémentaires sur ses actions de défense, quelles soient réussies ou non. s ue niq e o hr ng s c ra le l’ét de</p>",
"style": "Lobjectif du Seot Gaau est de gêner les mouvements de lopposant par lapplication de clés, dimmobilisations, de saisies… Le personnage obtient automatiquement 2 dés-fastes supplémentaires sur ses actions de défense, quelles soient réussies ou non.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Saisir lopportunité",
"activation": "action-aid",
"technique": "<p>Le pratiquant parvient à bloquer brièvement un adversaire de façon à permettre à un allié de lui porter une attaque. Lorsquil utilise laction dAide, le personnage octroie autant de dés supplémentaires à lancer que sa valeur de Feu (ou dAptitude sociale pour un PNJ) au lieu de 2 (ou ajoute ce bonus à lAptitude martiale pour un PNJ au lieu de + 2) au personnage quil assiste. Ce bonus est obtenu uniquement sur la prochaine attaque visant la cible immobilisée. Kung-fu de lInvulnérabilité Orientation : Yang ou Yin Aspect : Terre Compétence : Kung-fu Spécialité : Mains Nues Style à lhistoire mal connue, on dit que la pratique du Kung-f</p>"
"technique": "<p>Le pratiquant parvient à bloquer brièvement un adversaire de façon à permettre à un allié de lui porter une attaque. Lorsquil utilise laction dAide, le personnage octroie autant de dés supplémentaires à lancer que sa valeur de Feu (ou dAptitude sociale pour un PNJ) au lieu de 2 (ou ajoute ce bonus à lAptitude martiale pour un PNJ au lieu de + 2) au personnage quil assiste. Ce bonus est obtenu uniquement sur la prochaine attaque visant la cible immobilisée. Kung-fu de lInvulnérabilité</p>"
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
@@ -11,7 +11,7 @@
"aspect": "bois",
"skill": "rangedcombat",
"speciality": "Arc",
"style": "<p>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 dAptitude martiale pour un PNJ) avant davoir à recharger. De plus, ses dégâts à larc sont toujours augmentés de 1. Techniques</p>",
"style": "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 dAptitude martiale pour un PNJ) avant davoir à recharger. De plus, ses dégâts à larc sont toujours augmentés de 1.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Limpassibilité de la montagne",
"activation": "dice",
"technique": "<p>Concentré à lextrême, le pratiquant parvient à décocher ses flèches même dans un environnement peu favorable. Le personnage peut annuler, sur le résultat dun jet dattaque, un nombre de dés-néfastes égal à sa valeur de Terre (ou dAptitude physique), quil 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</p>"
"technique": "<p>Concentré à lextrême, le pratiquant parvient à décocher ses flèches même dans un environnement peu favorable. Le personnage peut annuler, sur le résultat dun jet dattaque, un nombre de dés-néfastes égal à sa valeur de Terre (ou dAptitude physique), quil soit réussi ou non."
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
+1 -1
View File
@@ -11,7 +11,7 @@
"aspect": "feu",
"skill": "rangedcombat",
"speciality": "Arme de jet",
"style": "<p>Le pratiquant dispose dune grande mobilité et projette toujours ses armes à un rythme soutenu afin de noyer ladversaire sous un déluge dacier. Chaque attaque du personnage coûte 2 crans dinitiative (au lieu de 3).</p>",
"style": "Le pratiquant dispose dune grande mobilité et projette toujours ses armes à un rythme soutenu afin de noyer ladversaire sous un déluge dacier. Chaque attaque du personnage coûte 2 crans dinitiative (au lieu de 3).",
"techniques": {
"technique1": {
"check": true,
@@ -11,25 +11,25 @@
"aspect": "terre",
"skill": "rangedcombat",
"speciality": "Poignard, Hachette",
"style": "<p>Le pratiquant des Poignards volants utilise sa puissance pour frapper ses cibles même quand celles-ci semblent hors datteinte. 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 lespace dune génération, il était inévitable que les amateurs des films daction de</p>",
"style": "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 attaques du personnage passe de distance médiane à distance longue, et les dégâts de ses attaques aux poignards sont augmentés de 1.",
"techniques": {
"technique1": {
"check": true,
"name": "Handicaper l'ennemi",
"activation": "action-attack",
"technique": ""
"technique": "<p>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 projetée à distance courte, en plus des dégâts subis. Si le personnage dépense 2 dés-fastes à cet effet, l'arme est projetée à distance médiane. L'attaque inflige ensuite normalement ses dégâts.</p>"
},
"technique2": {
"check": true,
"name": "Assiéger la forteresse",
"activation": "action-attack",
"technique": "<p>Sachant comment dissimuler et projeter ses\narmes dans toutes les situations, le pratiquant\nest toujours en position dattaquer. 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 dattaque. attaques du personnage passe de distance médiane à distance longue, et les dégâts de ses\nattaques aux poignards sont augmentés de 1. \n Techniques Activation : Dés-fastes\nLe</p>"
"activation": "dice",
"technique": "<p>Le pratiquant sait où viser pour gêner les mouvements de son adversaire. Le personnage peut dépenser les dés-fastes de son action d'attaque (qu'elle soit réussie ou non) pour faire perdre des crans d'initiative à sa cible (à raison de 1 pour 1, maximum 3).</p>"
},
"technique3": {
"check": true,
"name": "Décider de la retraite",
"activation": "action-defense",
"technique": "<p>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 dinitiative 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 dun poignard ou dune hachette</p>"
"technique": "<p>Garder la bonne distance avec son adversaire est essentiel pour le pratiquant afin de tirer le meilleur parti de ses armes. Le personnage obtient immédiatement après son action de défense une action de déplacement gratuite (donc sans dépenser de crans dinitiative supplémentaires).</p>"
}
}
},
+4 -4
View File
@@ -6,12 +6,12 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>Le nom de ce style évoque les multiples avantages offerts par le bâton à trois sections (saam zit gwan) inventé par le fondateur de la dynastie Song. Le bâton à trois sections (aussi nommé tri-bâton ou triple bâton) offre une grande polyvalence offensive et défensive, mais il savère une arme dont la maîtrise demande beaucoup defforts et une attention soutenue. de l’étrange Les Trois Joyaux font également référence à l’éveil, la droiture et la pureté, inhérents à la nature de chaque être dans le bouddhisme Sim. Il sagit dun des principaux styles armés développés par les moines de Shaolin.</p>",
"description": "<p>Le nom de ce style évoque les multiples avantages offerts par le bâton à trois sections (saam zit gwan) inventé par le fondateur de la dynastie Song. Le bâton à trois sections (aussi nommé tri-bâton ou triple bâton) offre une grande polyvalence offensive et défensive, mais il savère une arme dont la maîtrise demande beaucoup defforts et une attention soutenue.</p>",
"orientation": "yang",
"aspect": "feu",
"skill": "kungfu",
"speciality": "Bâton",
"style": "<p>Le triple-bâton est une arme de défense aussi solide quune armure de fer. Le personnage obtient une protection de 2. Techniques</p>",
"style": "Le triple-bâton est une arme de défense aussi solide quune armure de fer. Le personnage obtient une protection de 2.",
"techniques": {
"technique1": {
"check": true,
@@ -29,7 +29,7 @@
"check": true,
"name": "Le serpent rampe au sol",
"activation": "dice",
"technique": "<p>Utilisé tel un fouet, le triple-bâton heurte cruellement les chevilles de lopposant et lenvoie ainsi à terre. Sur une attaque réussie, le personnage fait tomber son adversaire et peut dépenser les dés-fastes obtenus à son action dattaque pour faire perdre des crans dinitiative à sa cible (à raison de 1 pour 1, maximum 3). Lattaque 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 de la dynastie Song, Yue Fei possède la réputation d’être lun</p>"
"technique": "<p>Utilisé tel un fouet, le triple-bâton heurte cruellement les chevilles de lopposant et lenvoie ainsi à terre. Sur une attaque réussie, le personnage fait tomber son adversaire et peut dépenser les dés-fastes obtenus à son action dattaque pour faire perdre des crans dinitiative à sa cible (à raison de 1 pour 1, maximum 3). Lattaque inflige ensuite normalement ses dégâts."
}
}
},
@@ -40,4 +40,4 @@
"default": 0
},
"flags": {}
}
}
+13 -13
View File
@@ -6,30 +6,30 @@
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-kungfu.svg",
"system": {
"reference": "",
"description": "<p>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. Daprès la légende, cest une nonne de Shaolin qui inventa ce kung-fu et le transmit à une jeune fille afin quelle échappe à un mariage arrangé avant de répandre largement cette technique. Le fameux Ip Man maître de Bruce Lee en fut le pratiquant le plus célèbre. Les principes au centre du Wing Chun sont de privilégier la vitesse et la masse de son propre corps en utilisant la force de ladversaire contre lui. Les coups offensifs du Wing C</p>",
"description": "<p>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 inventa ce kung-fu et le transmit à une jeune fille afin qu'elle échappe à un mariage arrangé avant de répandre largement cette technique. Le fameux Ip Man maître de Bruce Lee en fut le pratiquant le plus célèbre. Les principes au centre du Wing Chun sont de privilégier la vitesse et la masse de son propre corps en utilisant la force de l'adversaire contre lui. Les coups offensifs du Wing Chun accordent une importance accrue aux techniques de mains dans la grande majorité des courants connus.</p>",
"orientation": "yin",
"aspect": "metal",
"skill": "kungfu",
"speciality": "Mains Nues",
"style": "",
"style": "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 double.",
"techniques": {
"technique1": {
"check": true,
"name": "La terre tourne autour du soleil",
"activation": "damage-inflicted",
"technique": "<p>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 lIvresse. Le personnage élimine gratuitement 2 dés-fastes sur ses actions dattaque,\nquelles soient réussies ou non. Techniques Chuter du ciel Activation : Dés-fastes\nLui-même </p>"
"name": "Chuter du ciel",
"activation": "dice",
"technique": "<p>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 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.</p>"
},
"technique2": {
"check": false,
"name": "",
"activation": "action-attack",
"technique": ""
"check": true,
"name": "La lame s'envole",
"activation": "action-defense",
"technique": "<p>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 à distance courte. Si le personnage dépense 2 dés-fastes à cet effet, l'arme est projetée à distance médiane.</p>"
},
"technique3": {
"check": false,
"name": "",
"activation": "action-attack",
"technique": ""
"check": true,
"name": "L'alcool mauvais",
"activation": "damage-inflicted",
"technique": "<p>Abandonnant un instant sa gestuelle souple au moment d'attaquer, le pratiquant rigidifie brièvement son corps afin de porter un coup dévastateur. Les dégâts à mains nues sont égaux à sa valeur de Feu (ou d'Aptitude sociale pour un PNJ) au lieu de 1 pour cette attaque.</p>"
}
}
},
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!9jr5RN2GDhfVOZnY",
"name": "Alexander Weng",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!JSQ8x2ojYooWx6fr",
"name": "Ban Daan, gros bras trop ambitieux",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!xs3iEeRvVqnLG4fa",
"name": "Bui Hok, général fidèle",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 3,
@@ -3,7 +3,7 @@
"_key": "!actors!c08hmLyriGEOct1K",
"name": "Carrie Suet, citoyenne ordinaire",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 0,
@@ -3,7 +3,7 @@
"_key": "!actors!CVbY9xpxodgazhLq",
"name": "Charlie Fei, psychologue pour défunts",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!xwVOrq4vFJbAHrue",
"name": "Cimei (démon des forêts)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!A54y6E5qYiSfPhQw",
"name": "Consultant ésotérique",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!kEgcNfeMGeOA3q58",
"name": "Démon-gardien (gaamwujan mo) Profane",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 0,
@@ -3,7 +3,7 @@
"_key": "!actors!j0M9lM05layknpjc",
"name": "Deoi Sam (double démoniaque)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!CecTD0e1caDDLi4f",
"name": "Fat si sorcier",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!oZQYYd9fshpR1fzS",
"name": "Fonctionnaire infernal (gwai caai)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!nKvFMqTQluI6slsR",
"name": "Gaaujan (ogresse des mers)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-jiugwaai.svg",
"system": {
"type": "jiugwaai",
"threat": 1,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!gX41y0aGmiXzf7em",
"name": "Gamzing (générique)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-fantome.svg",
"system": {
"type": "fantome",
"threat": 1,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!qfTSRgyrtBfRA43K",
"name": "Ginny Ching",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!Xn42o1E660Q7nFD5",
"name": "Goengsi (jiangshi)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-fantome.svg",
"system": {
"type": "fantome",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!ch7LrshdCOtq7cyl",
"name": "Good Boy, molosse protecteur",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!CSiS3imbab0YaMSW",
"name": "Gwat Jyun (singe blanc) Initié",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-jiugwaai.svg",
"system": {
"type": "jiugwaai",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!rCaI4p3b7wWAkogg",
"name": "Gwat Jyun (singe blanc) Profane",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-jiugwaai.svg",
"system": {
"type": "jiugwaai",
"threat": 0,
@@ -3,7 +3,7 @@
"_key": "!actors!dQUAdHHo2adCgCcY",
"name": "Hyun Ci, champion underground",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 3,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!lWZ4Ifq8L46QorAH",
"name": "Intermédiaire",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!mTlPb9acTYuN8g34",
"name": "James Kam, tueur à gages",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 4,
@@ -3,7 +3,7 @@
"_key": "!actors!GPcB3MHaqxO0NcyK",
"name": "Je Maan, cadre aux dents longues",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!VDe1iLJbtQ0Yy5CD",
"name": "Jeffrey Chiu",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 0,
@@ -3,7 +3,7 @@
"_key": "!actors!4ZjFZ1HoJV9mJStt",
"name": "Jing Tin, guerrier décapité",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-dieu.svg",
"system": {
"type": "dieu",
"threat": 3,
@@ -3,7 +3,7 @@
"_key": "!actors!54uOjMPREX9p9y3k",
"name": "John Wa, maître des rites free-lance",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!xso73DrDuFPD74MF",
"name": "Juk Lyun, guide touristique",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-jiugwaai.svg",
"system": {
"type": "jiugwaai",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!4qsz1fgQaLp6XgOA",
"name": "Julian Po, travailleur social",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!zVpmacwoWEG8YTCQ",
"name": "Karen Sen, croqueuse de diamants",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 2,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!Z5DRulhhSyujEVjG",
"name": "Ken Luan",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!a5blX0uXTNzcplH1",
"name": "Laureen Zoeng, esthéticienne roublarde",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!4ys4N6FQKGacd3rf",
"name": "Leonie Fei",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!wvdZgXLIdqQxc3nH",
"name": "Maximilian Pang",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 3,
@@ -3,7 +3,7 @@
"_key": "!actors!S6LN7FcZz1i2jHQj",
"name": "Michelle Chun, gentille couturière",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 2,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!cPLaYDg6uI1XuThZ",
"name": "Mo (démon basique)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!phueAQD8QBesE5IP",
"name": "Mogwaai",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!u3ssdy3dXYpglToU",
"name": "Ngogwai (spectre affamé)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-fantome.svg",
"system": {
"type": "fantome",
"threat": 1,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!nj5HVe2TK5B9xxR7",
"name": "Paul Fei",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-mortel.svg",
"system": {
"type": "mortel",
"threat": 1,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!dVqVEap03syc9tq2",
"name": "Peijau (bête ailée)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!9CRYTLZ8mKD3r9vS",
"name": "Phil Mok, fantôme errant",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-fantome.svg",
"system": {
"type": "fantome",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!5cjWTpSNYAb8tXsL",
"name": "Pui Gan, petit parrain",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!Cba6AI6uEzOlag4A",
"name": "Ruby Jin Jin, star de la pop",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-dieu.svg",
"system": {
"type": "dieu",
"threat": 3,
@@ -3,7 +3,7 @@
"_key": "!actors!rjyebC6fMDuwPvcm",
"name": "Scott Zang, explorateur urbain",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 2,
@@ -3,7 +3,7 @@
"_key": "!actors!IfGFbXhsGkUchE5u",
"name": "Sonia Tsui, hackeuse agoraphobe",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!mcRdZybIvf7empYb",
"name": "Susan Chow, culturiste amateure",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-esprit-animal.svg",
"system": {
"type": "esprit-animal",
"threat": 4,
@@ -3,7 +3,7 @@
"_key": "!actors!TeSKf4HhtefN6eUO",
"name": "Taotie (têtes volantes)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-demon.svg",
"system": {
"type": "demon",
"threat": 1,
@@ -3,7 +3,7 @@
"_key": "!actors!nHDNm1XjphjKkCiP",
"name": "Tony Meng, assoiffé de sang",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-fantome.svg",
"system": {
"type": "fantome",
"threat": 2,
+1 -1
View File
@@ -3,7 +3,7 @@
"_key": "!actors!UawVI5WvJYTiAvWc",
"name": "Waanjing (Apprenti)",
"type": "npc",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc.svg",
"img": "systems/fvtt-chroniques-de-l-etrange/images/icons/icon-npc-fantome.svg",
"system": {
"type": "fantome",
"threat": 1,

Some files were not shown because too many files have changed in this diff Show More