Rework complet des fiches et dialog de jets

This commit is contained in:
2026-03-28 08:47:13 +01:00
parent 1b51a81919
commit a9e902ed78
59 changed files with 2342 additions and 305 deletions

View File

@@ -1,5 +1,3 @@
# Les Chroniques de l'étrange
# Les Chroniques de l'étrange pour FoundryVTT
A rudimentary implementation of Les Chroniques de l'étrange for Foundry VTT.
The 2 integrated CdE d10 die sets for dice-so-nice extension look nicer with 'white', 'paper', and plastic' dice options selected in this very extension.
Implémentation du JDR Les Chroniques de l'Etrange de Antre-Monde éditions.

View File

@@ -29,12 +29,21 @@
overflow: hidden;
}
.cde-sheet input,
.cde-sheet select,
.cde-sheet textarea {
font-family: inherit;
color: #e2e8f4;
background: transparent;
}
.cde-sheet select {
font-family: inherit;
color: #e2e8f4;
background: #101622;
border-radius: 2px;
}
.cde-sheet select option {
background: #080c14;
color: #e2e8f4;
}
.cde-neon-header {
position: relative;
background: #101622;
@@ -182,8 +191,7 @@
color: #e2e8f4;
letter-spacing: 0.02em;
}
.cde-stat-cell input,
.cde-stat-cell select {
.cde-stat-cell input {
width: 100%;
background: transparent;
border: none;
@@ -194,7 +202,18 @@
outline: none;
transition: border-color 0.15s;
}
.cde-stat-cell input:focus,
.cde-stat-cell input:focus {
border-bottom-color: #00d4d4;
}
.cde-stat-cell select {
width: 100%;
border: none;
border-bottom: 1px solid #1a2436;
font-size: 14px;
padding: 4px 0;
outline: none;
transition: border-color 0.15s;
}
.cde-stat-cell select:focus {
border-bottom-color: #00d4d4;
}
@@ -492,8 +511,7 @@ section.npc .cde-neon-tabs .item.active {
color: #7d94b8;
margin: 0;
}
.cde-chip input,
.cde-chip select {
.cde-chip input {
width: 100%;
border: none;
border-bottom: 1px solid #1a2436;
@@ -502,7 +520,16 @@ section.npc .cde-neon-tabs .item.active {
padding: 4px 0;
outline: none;
}
.cde-chip input:focus,
.cde-chip input:focus {
border-bottom-color: #00d4d4;
}
.cde-chip select {
width: 100%;
border: none;
border-bottom: 1px solid #1a2436;
padding: 4px 0;
outline: none;
}
.cde-chip select:focus {
border-bottom-color: #00d4d4;
}
@@ -738,7 +765,6 @@ section.npc .cde-neon-tabs .item.active {
color: #7d94b8;
}
.cde-field input,
.cde-field select,
.cde-field textarea {
width: 100%;
border: none;
@@ -749,10 +775,19 @@ section.npc .cde-neon-tabs .item.active {
outline: none;
}
.cde-field input:focus,
.cde-field select:focus,
.cde-field textarea:focus {
border-bottom-color: #00d4d4;
}
.cde-field select {
width: 100%;
border: none;
border-bottom: 1px solid #1a2436;
padding: 5px 0;
outline: none;
}
.cde-field select:focus {
border-bottom-color: #00d4d4;
}
.cde-section-title {
font-family: "Averia", sans-serif;
font-size: 10px;
@@ -793,8 +828,7 @@ section.npc .cde-neon-tabs .item.active {
.cde-data-table tr:hover {
background: rgba(38, 56, 83, 0.2);
}
.cde-data-table input,
.cde-data-table select {
.cde-data-table input {
width: 100%;
border: none;
border-bottom: 1px solid #1a2436;
@@ -803,6 +837,13 @@ section.npc .cde-neon-tabs .item.active {
padding: 4px 0;
outline: none;
}
.cde-data-table select {
width: 100%;
border: none;
border-bottom: 1px solid #1a2436;
padding: 4px 0;
outline: none;
}
.cde-centered-card {
display: flex;
gap: 12px;
@@ -1222,6 +1263,763 @@ section.npc .cde-neon-tabs .item.active {
letter-spacing: 0.06em;
color: #7d94b8;
}
.cde-section-label {
display: flex;
align-items: center;
gap: 8px;
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.12em;
color: #7d94b8;
border-bottom: 1px solid #1a2436;
padding-bottom: 6px;
margin-bottom: 10px;
}
.cde-section-label i {
font-size: 11px;
}
.cde-section-label--top-margin {
margin-top: 18px;
}
.cde-components-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px;
margin-bottom: 10px;
}
.cde-component-cell {
display: flex;
align-items: center;
gap: 8px;
background: #101622;
border: 1px solid #1a2436;
border-radius: 8px;
padding: 4px 8px;
}
.cde-component-cell:hover {
border-color: #263853;
}
.cde-component-die {
width: 28px;
height: 28px;
object-fit: contain;
flex-shrink: 0;
opacity: 0.85;
}
.cde-component-input {
flex: 1;
background: transparent;
border: none;
border-bottom: 1px solid transparent;
color: #e2e8f4;
font-size: 12px;
padding: 2px 0;
}
.cde-component-input:focus {
outline: none;
border-bottom-color: #4a9eff;
}
.cde-component-input::placeholder {
color: #7d94b8;
font-style: italic;
font-size: 11px;
}
.cde-component-random-row {
display: flex;
justify-content: center;
margin-bottom: 4px;
}
.cde-btn-random-component {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 16px;
background: rgba(74, 158, 255, 0.08);
border: 1px solid rgba(74, 158, 255, 0.35);
border-radius: 8px;
color: #4a9eff;
font-family: "Averia", sans-serif;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.08em;
cursor: pointer;
transition: background 0.15s, box-shadow 0.15s;
}
.cde-btn-random-component i {
font-size: 14px;
}
.cde-btn-random-component:hover {
background: rgba(74, 158, 255, 0.16);
box-shadow: 0 0 8px rgba(74, 158, 255, 0.3);
}
.cde-magic-card {
background: #101622;
border: 1px solid #1a2436;
border-left: 3px solid #263853;
border-radius: 8px;
margin-bottom: 8px;
overflow: hidden;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
}
.cde-magic-header {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
}
.cde-magic-aspect-icon {
width: 32px;
height: 32px;
object-fit: contain;
flex-shrink: 0;
}
.cde-magic-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 1px;
min-width: 0;
}
.cde-magic-name {
font-family: "Averia", sans-serif;
font-size: 13px;
font-weight: 700;
color: #e2e8f4;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cde-magic-aspect-name {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
color: #7d94b8;
font-family: "Averia", sans-serif;
}
.cde-magic-value-input {
width: 52px;
flex-shrink: 0;
}
.cde-magic-roll-btn {
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8px;
cursor: pointer;
transition: background 0.15s;
flex-shrink: 0;
}
.cde-magic-roll-btn i {
font-size: 15px;
}
.cde-magic-roll-btn:hover {
background: rgba(74, 158, 255, 0.15);
}
.cde-magic-toggle {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: #7d94b8;
flex-shrink: 0;
}
.cde-magic-toggle input[type="checkbox"] {
display: none;
}
.cde-magic-toggle i {
font-size: 11px;
transition: color 0.15s;
}
.cde-magic-toggle:hover i {
color: #e2e8f4;
}
.cde-magic-specialities {
border-top: 1px solid #1a2436;
padding: 4px 0;
}
.cde-magic-spec-row {
display: flex;
align-items: center;
gap: 8px;
padding: 5px 10px 5px 42px;
opacity: 0.55;
transition: opacity 0.12s, background 0.12s;
}
.cde-magic-spec-row:hover {
opacity: 1;
background: rgba(38, 56, 83, 0.3);
}
.cde-magic-spec-row--active {
opacity: 1;
}
.cde-magic-spec-check-label {
display: flex;
align-items: center;
cursor: pointer;
flex-shrink: 0;
}
.cde-magic-spec-check-label input[type="checkbox"] {
display: none;
}
.cde-magic-spec-check-label .cde-spec-checkbox-ui {
width: 14px;
height: 14px;
border: 1px solid #7d94b8;
border-radius: 3px;
display: inline-flex;
align-items: center;
justify-content: center;
transition: border-color 0.12s, background 0.12s;
}
.cde-magic-spec-check-label input:checked + .cde-spec-checkbox-ui {
background: #4a9eff;
border-color: #4a9eff;
}
.cde-magic-spec-check-label input:checked + .cde-spec-checkbox-ui::after {
content: "✓";
font-size: 9px;
color: #080c14;
line-height: 1;
}
.cde-magic-spec-element {
width: 18px;
height: 18px;
object-fit: contain;
flex-shrink: 0;
}
.cde-magic-spec-polarity {
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #7d94b8;
width: 42px;
flex-shrink: 0;
}
.cde-magic-spec-polarity.icon-yin {
color: #cc44ff;
}
.cde-magic-spec-polarity.icon-yang {
color: #00d4d4;
}
.cde-magic-spec-polarity.icon-yinyang {
color: #4a9eff;
}
.cde-magic-spec-name {
flex: 1;
font-size: 12px;
color: #e2e8f4;
font-family: "Averia", sans-serif;
}
.cde-magic-spec-roll-btn {
width: 26px;
height: 26px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8px;
cursor: pointer;
color: #7d94b8;
flex-shrink: 0;
transition: color 0.15s, background 0.15s;
}
.cde-magic-spec-roll-btn i {
font-size: 12px;
}
.cde-magic-spec-roll-btn:hover {
color: #4a9eff;
background: rgba(74, 158, 255, 0.12);
}
.cde-magic--internalcinnabar {
border-left-color: #70706e;
}
.cde-magic--internalcinnabar .cde-magic-name {
color: #a3a3a1;
}
.cde-magic--internalcinnabar .cde-magic-roll-btn i {
color: #70706e;
}
.cde-magic--alchemy {
border-left-color: #009fe2;
}
.cde-magic--alchemy .cde-magic-name {
color: #30c1ff;
}
.cde-magic--alchemy .cde-magic-roll-btn i {
color: #009fe2;
}
.cde-magic--masteryoftheway {
border-left-color: #a85747;
}
.cde-magic--masteryoftheway .cde-magic-name {
color: #cd9488;
}
.cde-magic--masteryoftheway .cde-magic-roll-btn i {
color: #be7364;
}
.cde-magic--exorcism {
border-left-color: #cd171a;
}
.cde-magic--exorcism .cde-magic-name {
color: #ed5d60;
}
.cde-magic--exorcism .cde-magic-roll-btn i {
color: #cd171a;
}
.cde-magic--geomancy {
border-left-color: #41a436;
}
.cde-magic--geomancy .cde-magic-name {
color: #68ca5d;
}
.cde-magic--geomancy .cde-magic-roll-btn i {
color: #41a436;
}
.cde-grimoire-section {
border-top: 1px dashed rgba(26, 36, 54, 0.6);
margin-top: 6px;
padding-top: 6px;
}
.cde-grimoire-header {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px;
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.1em;
color: #7d94b8;
}
.cde-grimoire-header i {
font-size: 10px;
color: #4a9eff;
}
.cde-grimoire-header span {
flex: 1;
}
.cde-grimoire-add {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border-radius: 3px;
cursor: pointer;
color: #7d94b8;
transition: color 0.12s, background 0.12s;
}
.cde-grimoire-add i {
font-size: 10px;
}
.cde-grimoire-add:hover {
color: #4a9eff;
background: rgba(74, 158, 255, 0.15);
}
.cde-grimoire-list {
list-style: none;
margin: 0;
padding: 0;
}
.cde-grimoire-entry {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px 4px 14px;
border-bottom: 1px solid rgba(26, 36, 54, 0.4);
transition: background 0.1s;
}
.cde-grimoire-entry:last-child {
border-bottom: none;
}
.cde-grimoire-entry:hover {
background: rgba(26, 36, 54, 0.25);
}
.cde-grimoire-entry:hover .cde-grimoire-controls {
opacity: 1;
}
.cde-grimoire-img {
width: 18px;
height: 18px;
object-fit: contain;
border-radius: 2px;
flex-shrink: 0;
}
.cde-grimoire-name {
flex: 1;
font-size: 12px;
color: #e2e8f4;
font-family: "Averia", sans-serif;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cde-grimoire-meta {
display: flex;
align-items: center;
gap: 8px;
font-size: 10px;
color: #7d94b8;
flex-shrink: 0;
}
.cde-grimoire-meta em {
color: #4a9eff;
font-style: normal;
font-size: 10px;
max-width: 80px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cde-grimoire-diff,
.cde-grimoire-hei {
display: flex;
align-items: center;
gap: 3px;
}
.cde-grimoire-diff i,
.cde-grimoire-hei i {
font-size: 9px;
}
.cde-grimoire-diff {
color: #7d94b8;
}
.cde-grimoire-hei {
color: #ff3d5a;
}
.cde-grimoire-controls {
display: flex;
align-items: center;
gap: 4px;
opacity: 0;
transition: opacity 0.12s;
flex-shrink: 0;
}
.cde-grimoire-controls a {
display: flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
border-radius: 3px;
color: #7d94b8;
cursor: pointer;
transition: color 0.12s, background 0.12s;
}
.cde-grimoire-controls a i {
font-size: 10px;
}
.cde-grimoire-controls a:hover {
color: #e2e8f4;
background: rgba(38, 56, 83, 0.3);
}
.cde-grimoire-empty {
padding: 4px 14px 8px;
font-size: 11px;
color: #7d94b8;
font-style: italic;
margin: 0;
}
.cde-kf-add-row {
display: flex;
justify-content: flex-end;
padding: 4px 0 8px;
}
.cde-kf-add-btn {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 11px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.08em;
color: #7d94b8;
cursor: pointer;
padding: 4px 10px;
border-radius: 8px;
border: 1px solid #1a2436;
transition: color 0.12s, border-color 0.12s, background 0.12s;
}
.cde-kf-add-btn i {
font-size: 10px;
}
.cde-kf-add-btn:hover {
color: #ff3d5a;
border-color: #ff3d5a;
background: rgba(255, 61, 90, 0.08);
}
.cde-kf-card {
border: 1px solid #1a2436;
border-left: 3px solid #ff3d5a;
border-radius: 8px;
background: rgba(16, 22, 34, 0.7);
margin-bottom: 10px;
overflow: hidden;
transition: box-shadow 0.15s;
}
.cde-kf-card:hover {
box-shadow: 0 0 8px rgba(255, 61, 90, 0.2);
}
.cde-kf-card.cde-kf--metal {
border-left-color: #70706e;
}
.cde-kf-card.cde-kf--eau {
border-left-color: #009fe2;
}
.cde-kf-card.cde-kf--terre {
border-left-color: #be7364;
}
.cde-kf-card.cde-kf--feu {
border-left-color: #cd171a;
}
.cde-kf-card.cde-kf--bois {
border-left-color: #41a436;
}
.cde-kf-header {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
}
.cde-kf-header:hover .cde-kf-controls {
opacity: 1;
}
.cde-kf-aspect-icon {
width: 26px;
height: 26px;
object-fit: contain;
flex-shrink: 0;
}
.cde-kf-orient-icon {
width: 18px;
height: 18px;
object-fit: contain;
flex-shrink: 0;
opacity: 0.75;
}
.cde-kf-info {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.cde-kf-name {
font-size: 14px;
font-weight: 700;
font-family: "Averia", sans-serif;
color: #e2e8f4;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cde-kf-meta {
font-size: 10px;
color: #7d94b8;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.cde-kf-meta em {
color: #e2e8f4;
font-style: normal;
}
.cde-kf-roll-btn {
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8px;
cursor: pointer;
color: #7d94b8;
flex-shrink: 0;
transition: color 0.15s, background 0.15s;
}
.cde-kf-roll-btn i {
font-size: 14px;
}
.cde-kf-roll-btn:hover {
color: #ff3d5a;
background: rgba(255, 61, 90, 0.15);
}
.cde-kf-controls {
display: flex;
align-items: center;
gap: 4px;
opacity: 0;
transition: opacity 0.12s;
flex-shrink: 0;
}
.cde-kf-controls a {
display: flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
border-radius: 3px;
color: #7d94b8;
cursor: pointer;
transition: color 0.12s, background 0.12s;
}
.cde-kf-controls a i {
font-size: 11px;
}
.cde-kf-controls a:hover {
color: #e2e8f4;
background: rgba(38, 56, 83, 0.3);
}
.cde-kf-style-row {
display: flex;
align-items: baseline;
gap: 8px;
padding: 4px 12px 6px 44px;
border-top: 1px solid rgba(26, 36, 54, 0.6);
background: rgba(16, 22, 34, 0.4);
}
.cde-kf-style-label {
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.08em;
color: #ff3d5a;
flex-shrink: 0;
}
.cde-kf-style-label i {
font-size: 9px;
}
.cde-kf-style-text {
font-size: 11px;
color: #e2e8f4;
font-family: "Averia", sans-serif;
font-style: italic;
}
.cde-kf-techniques {
list-style: none;
margin: 0;
padding: 0;
border-top: 1px solid rgba(26, 36, 54, 0.5);
}
.cde-kf-tech {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 12px 5px 44px;
border-bottom: 1px solid rgba(26, 36, 54, 0.3);
opacity: 0.5;
transition: opacity 0.1s, background 0.1s;
}
.cde-kf-tech:last-child {
border-bottom: none;
}
.cde-kf-tech--mastered {
opacity: 1;
}
.cde-kf-tech:hover {
background: rgba(26, 36, 54, 0.2);
opacity: 1;
}
.cde-kf-tech-mastered {
font-size: 11px;
flex-shrink: 0;
width: 14px;
text-align: center;
}
.cde-kf-tech--mastered .cde-kf-tech-mastered {
color: #ff3d5a;
}
.cde-kf-tech:not(.cde-kf-tech--mastered) .cde-kf-tech-mastered {
color: #7d94b8;
}
.cde-act-badge {
font-size: 9px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 2px 5px;
border-radius: 3px;
flex-shrink: 0;
max-width: 110px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border: 1px solid currentColor;
}
.cde-act-badge.cde-act--action-attack {
color: #cd171a;
background: rgba(205, 23, 26, 0.1);
}
.cde-act-badge.cde-act--action-defense {
color: #009fe2;
background: rgba(0, 159, 226, 0.1);
}
.cde-act-badge.cde-act--action-aid {
color: #41a436;
background: rgba(65, 164, 54, 0.1);
}
.cde-act-badge.cde-act--action-attack-defense {
color: #70706e;
background: rgba(112, 112, 110, 0.12);
}
.cde-act-badge.cde-act--reaction {
color: #a85747;
background: rgba(168, 87, 71, 0.12);
}
.cde-act-badge.cde-act--dice {
color: #4a9eff;
background: rgba(74, 158, 255, 0.1);
}
.cde-act-badge.cde-act--damage-inflicted {
color: #ff6b35;
background: rgba(255, 107, 53, 0.1);
}
.cde-act-badge.cde-act--damage-received {
color: #7d94b8;
background: rgba(26, 36, 54, 0.2);
}
.cde-kf-tech-name {
flex: 1;
font-size: 12px;
color: #e2e8f4;
font-family: "Averia", sans-serif;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cde-kf-tech-name em {
color: #7d94b8;
}
.cde-kf-empty {
padding: 16px;
text-align: center;
font-size: 12px;
color: #7d94b8;
font-style: italic;
}
.cde-chat-random-component {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
padding: 8px 12px;
}
.cde-chat-component-label {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: #7d94b8;
font-family: "Averia", sans-serif;
}
.cde-chat-component-value {
font-size: 16px;
font-weight: 700;
color: #4a9eff;
text-shadow: 0 0 8px rgba(74, 158, 255, 0.5);
}
.cde-tabs {
margin-top: 12px;
border-bottom: 1px solid #1a2436;

View File

@@ -69,11 +69,24 @@
height: 100%;
overflow: hidden;
input, select, textarea {
input, textarea {
font-family: inherit;
color: @cde-text;
background: transparent;
}
// Selects need an explicit dark background — transparent fails on native dropdowns
select {
font-family: inherit;
color: @cde-text;
background: @cde-surface;
border-radius: 2px;
}
select option {
background: @cde-bg;
color: @cde-text;
}
}
// ============================================================
@@ -213,8 +226,7 @@
letter-spacing: 0.02em;
}
.cde-stat-cell input,
.cde-stat-cell select {
.cde-stat-cell input {
width: 100%;
background: transparent;
border: none;
@@ -225,9 +237,19 @@
outline: none;
transition: border-color 0.15s;
&:focus {
border-bottom-color: @cde-item;
}
&:focus { border-bottom-color: @cde-item; }
}
.cde-stat-cell select {
width: 100%;
border: none;
border-bottom: 1px solid @cde-border;
font-size: 14px;
padding: 4px 0;
outline: none;
transition: border-color 0.15s;
&:focus { border-bottom-color: @cde-item; }
}
.cde-neon-header.kungfu .cde-stat-cell input:focus,
@@ -504,7 +526,7 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
margin: 0;
}
input, select {
input {
width: 100%;
border: none;
border-bottom: 1px solid @cde-border;
@@ -516,6 +538,16 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
&:focus { border-bottom-color: @cde-item; }
}
select {
width: 100%;
border: none;
border-bottom: 1px solid @cde-border;
padding: 4px 0;
outline: none;
&:focus { border-bottom-color: @cde-item; }
}
input[type="checkbox"] {
width: auto;
align-self: flex-start;
@@ -754,7 +786,7 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
color: @cde-muted;
}
input, select, textarea {
input, textarea {
width: 100%;
border: none;
border-bottom: 1px solid @cde-border;
@@ -765,6 +797,16 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
&:focus { border-bottom-color: @cde-item; }
}
select {
width: 100%;
border: none;
border-bottom: 1px solid @cde-border;
padding: 5px 0;
outline: none;
&:focus { border-bottom-color: @cde-item; }
}
}
.cde-section-title {
@@ -809,7 +851,7 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
tr:nth-child(even) { background: fade(@cde-surface, 50%); }
tr:hover { background: fade(@cde-border-hi, 20%); }
input, select {
input {
width: 100%;
border: none;
border-bottom: 1px solid @cde-border;
@@ -818,6 +860,14 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
padding: 4px 0;
outline: none;
}
select {
width: 100%;
border: none;
border-bottom: 1px solid @cde-border;
padding: 4px 0;
outline: none;
}
}
.cde-centered-card {
@@ -1227,6 +1277,727 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
}
}
// ============================================================
// Magics tab — components grid + magic cards
// ============================================================
.cde-section-label {
display: flex;
align-items: center;
gap: 8px;
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.12em;
color: @cde-muted;
border-bottom: 1px solid @cde-border;
padding-bottom: 6px;
margin-bottom: 10px;
i { font-size: 11px; }
&--top-margin { margin-top: 18px; }
}
// 2-column grid for the 10 components
.cde-components-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px;
margin-bottom: 10px;
}
.cde-component-cell {
display: flex;
align-items: center;
gap: 8px;
background: @cde-surface;
border: 1px solid @cde-border;
border-radius: @cde-radius;
padding: 4px 8px;
&:hover { border-color: @cde-border-hi; }
}
.cde-component-die {
width: 28px;
height: 28px;
object-fit: contain;
flex-shrink: 0;
opacity: 0.85;
}
.cde-component-input {
flex: 1;
background: transparent;
border: none;
border-bottom: 1px solid transparent;
color: @cde-text;
font-size: 12px;
padding: 2px 0;
&:focus {
outline: none;
border-bottom-color: @cde-spell;
}
&::placeholder { color: @cde-muted; font-style: italic; font-size: 11px; }
}
.cde-component-random-row {
display: flex;
justify-content: center;
margin-bottom: 4px;
}
.cde-btn-random-component {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 16px;
background: fade(@cde-spell, 8%);
border: 1px solid fade(@cde-spell, 35%);
border-radius: @cde-radius;
color: @cde-spell;
font-family: "Averia", sans-serif;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.08em;
cursor: pointer;
transition: background 0.15s, box-shadow 0.15s;
i { font-size: 14px; }
&:hover {
background: fade(@cde-spell, 16%);
box-shadow: 0 0 8px fade(@cde-spell, 30%);
}
}
// === Magic type cards ===
.cde-magic-card {
background: @cde-surface;
border: 1px solid @cde-border;
border-left: 3px solid @cde-border-hi;
border-radius: @cde-radius;
margin-bottom: 8px;
overflow: hidden;
box-shadow: @cde-shadow-sm;
}
.cde-magic-header {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
}
.cde-magic-aspect-icon {
width: 32px;
height: 32px;
object-fit: contain;
flex-shrink: 0;
}
.cde-magic-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 1px;
min-width: 0;
}
.cde-magic-name {
font-family: "Averia", sans-serif;
font-size: 13px;
font-weight: 700;
color: @cde-text;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cde-magic-aspect-name {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
color: @cde-muted;
font-family: "Averia", sans-serif;
}
.cde-magic-value-input {
width: 52px;
flex-shrink: 0;
}
.cde-magic-roll-btn {
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: @cde-radius;
cursor: pointer;
transition: background 0.15s;
flex-shrink: 0;
i { font-size: 15px; }
&:hover { background: fade(@cde-spell, 15%); }
}
.cde-magic-toggle {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: @cde-muted;
flex-shrink: 0;
input[type="checkbox"] { display: none; }
i { font-size: 11px; transition: color 0.15s; }
&:hover i { color: @cde-text; }
}
// Specialities list
.cde-magic-specialities {
border-top: 1px solid @cde-border;
padding: 4px 0;
}
.cde-magic-spec-row {
display: flex;
align-items: center;
gap: 8px;
padding: 5px 10px 5px 42px; // indent aligned with aspect icon
opacity: 0.55;
transition: opacity 0.12s, background 0.12s;
&:hover { opacity: 1; background: fade(@cde-border-hi, 30%); }
&--active { opacity: 1; }
}
.cde-magic-spec-check-label {
display: flex;
align-items: center;
cursor: pointer;
flex-shrink: 0;
input[type="checkbox"] { display: none; }
.cde-spec-checkbox-ui {
width: 14px;
height: 14px;
border: 1px solid @cde-muted;
border-radius: 3px;
display: inline-flex;
align-items: center;
justify-content: center;
transition: border-color 0.12s, background 0.12s;
}
input:checked + .cde-spec-checkbox-ui {
background: @cde-spell;
border-color: @cde-spell;
&::after {
content: "✓";
font-size: 9px;
color: @cde-bg;
line-height: 1;
}
}
}
.cde-magic-spec-element {
width: 18px;
height: 18px;
object-fit: contain;
flex-shrink: 0;
}
.cde-magic-spec-polarity {
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.06em;
color: @cde-muted;
width: 42px;
flex-shrink: 0;
&.icon-yin { color: @cde-supernatural; }
&.icon-yang { color: @cde-item; }
&.icon-yinyang { color: @cde-spell; }
}
.cde-magic-spec-name {
flex: 1;
font-size: 12px;
color: @cde-text;
font-family: "Averia", sans-serif;
}
.cde-magic-spec-roll-btn {
width: 26px;
height: 26px;
display: flex;
align-items: center;
justify-content: center;
border-radius: @cde-radius;
cursor: pointer;
color: @cde-muted;
flex-shrink: 0;
transition: color 0.15s, background 0.15s;
i { font-size: 12px; }
&:hover { color: @cde-spell; background: fade(@cde-spell, 12%); }
}
// Per-magic accent colors using direct Wu Xing LESS variables
.cde-magic--internalcinnabar {
border-left-color: @wu-gray;
.cde-magic-name { color: lighten(@wu-gray, 20%); }
.cde-magic-roll-btn i { color: @wu-gray; }
}
.cde-magic--alchemy {
border-left-color: @wu-blue;
.cde-magic-name { color: lighten(@wu-blue, 15%); }
.cde-magic-roll-btn i { color: @wu-blue; }
}
.cde-magic--masteryoftheway {
border-left-color: @wu-brown;
.cde-magic-name { color: lighten(@wu-brown, 20%); }
.cde-magic-roll-btn i { color: lighten(@wu-brown, 10%); }
}
.cde-magic--exorcism {
border-left-color: @wu-red;
.cde-magic-name { color: lighten(@wu-red, 20%); }
.cde-magic-roll-btn i { color: @wu-red; }
}
.cde-magic--geomancy {
border-left-color: @wu-green;
.cde-magic-name { color: lighten(@wu-green, 15%); }
.cde-magic-roll-btn i { color: @wu-green; }
}
// =====================================================================
// GRIMOIRE (spell list integrated in magic discipline cards)
// =====================================================================
.cde-grimoire-section {
border-top: 1px dashed fade(@cde-border, 60%);
margin-top: 6px;
padding-top: 6px;
}
.cde-grimoire-header {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px;
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.1em;
color: @cde-muted;
i { font-size: 10px; color: @cde-spell; }
span { flex: 1; }
}
.cde-grimoire-add {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border-radius: 3px;
cursor: pointer;
color: @cde-muted;
transition: color 0.12s, background 0.12s;
i { font-size: 10px; }
&:hover { color: @cde-spell; background: fade(@cde-spell, 15%); }
}
.cde-grimoire-list {
list-style: none;
margin: 0;
padding: 0;
}
.cde-grimoire-entry {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px 4px 14px;
border-bottom: 1px solid fade(@cde-border, 40%);
transition: background 0.1s;
&:last-child { border-bottom: none; }
&:hover {
background: fade(@cde-border, 25%);
.cde-grimoire-controls { opacity: 1; }
}
}
.cde-grimoire-img {
width: 18px;
height: 18px;
object-fit: contain;
border-radius: 2px;
flex-shrink: 0;
}
.cde-grimoire-name {
flex: 1;
font-size: 12px;
color: @cde-text;
font-family: "Averia", sans-serif;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cde-grimoire-meta {
display: flex;
align-items: center;
gap: 8px;
font-size: 10px;
color: @cde-muted;
flex-shrink: 0;
em {
color: @cde-spell;
font-style: normal;
font-size: 10px;
max-width: 80px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.cde-grimoire-diff, .cde-grimoire-hei {
display: flex;
align-items: center;
gap: 3px;
i { font-size: 9px; }
}
.cde-grimoire-diff { color: @cde-muted; }
.cde-grimoire-hei { color: @cde-kungfu; }
.cde-grimoire-controls {
display: flex;
align-items: center;
gap: 4px;
opacity: 0;
transition: opacity 0.12s;
flex-shrink: 0;
a {
display: flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
border-radius: 3px;
color: @cde-muted;
cursor: pointer;
transition: color 0.12s, background 0.12s;
i { font-size: 10px; }
&:hover { color: @cde-text; background: fade(@cde-border-hi, 30%); }
}
}
.cde-grimoire-empty {
padding: 4px 14px 8px;
font-size: 11px;
color: @cde-muted;
font-style: italic;
margin: 0;
}
// =====================================================================
// KUNG-FU CARDS (actor tab redesign)
// =====================================================================
.cde-kf-add-row {
display: flex;
justify-content: flex-end;
padding: 4px 0 8px;
}
.cde-kf-add-btn {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 11px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.08em;
color: @cde-muted;
cursor: pointer;
padding: 4px 10px;
border-radius: @cde-radius;
border: 1px solid @cde-border;
transition: color 0.12s, border-color 0.12s, background 0.12s;
i { font-size: 10px; }
&:hover { color: @cde-kungfu; border-color: @cde-kungfu; background: fade(@cde-kungfu, 8%); }
}
.cde-kf-card {
border: 1px solid @cde-border;
border-left: 3px solid @cde-kungfu;
border-radius: @cde-radius;
background: fade(@cde-surface, 70%);
margin-bottom: 10px;
overflow: hidden;
transition: box-shadow 0.15s;
&:hover { box-shadow: 0 0 8px fade(@cde-kungfu, 20%); }
&.cde-kf--metal { border-left-color: @wu-gray; }
&.cde-kf--eau { border-left-color: @wu-blue; }
&.cde-kf--terre { border-left-color: lighten(@wu-brown, 10%); }
&.cde-kf--feu { border-left-color: @wu-red; }
&.cde-kf--bois { border-left-color: @wu-green; }
}
.cde-kf-header {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
&:hover .cde-kf-controls { opacity: 1; }
}
.cde-kf-aspect-icon {
width: 26px;
height: 26px;
object-fit: contain;
flex-shrink: 0;
}
.cde-kf-orient-icon {
width: 18px;
height: 18px;
object-fit: contain;
flex-shrink: 0;
opacity: 0.75;
}
.cde-kf-info {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.cde-kf-name {
font-size: 14px;
font-weight: 700;
font-family: "Averia", sans-serif;
color: @cde-text;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cde-kf-meta {
font-size: 10px;
color: @cde-muted;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.06em;
em { color: @cde-text; font-style: normal; }
}
.cde-kf-roll-btn {
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: @cde-radius;
cursor: pointer;
color: @cde-muted;
flex-shrink: 0;
transition: color 0.15s, background 0.15s;
i { font-size: 14px; }
&:hover { color: @cde-kungfu; background: fade(@cde-kungfu, 15%); }
}
.cde-kf-controls {
display: flex;
align-items: center;
gap: 4px;
opacity: 0;
transition: opacity 0.12s;
flex-shrink: 0;
a {
display: flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
border-radius: 3px;
color: @cde-muted;
cursor: pointer;
transition: color 0.12s, background 0.12s;
i { font-size: 11px; }
&:hover { color: @cde-text; background: fade(@cde-border-hi, 30%); }
}
}
.cde-kf-style-row {
display: flex;
align-items: baseline;
gap: 8px;
padding: 4px 12px 6px 44px;
border-top: 1px solid fade(@cde-border, 60%);
background: fade(@cde-surface, 40%);
}
.cde-kf-style-label {
font-size: 10px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.08em;
color: @cde-kungfu;
flex-shrink: 0;
i { font-size: 9px; }
}
.cde-kf-style-text {
font-size: 11px;
color: @cde-text;
font-family: "Averia", sans-serif;
font-style: italic;
}
.cde-kf-techniques {
list-style: none;
margin: 0;
padding: 0;
border-top: 1px solid fade(@cde-border, 50%);
}
.cde-kf-tech {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 12px 5px 44px;
border-bottom: 1px solid fade(@cde-border, 30%);
opacity: 0.5;
transition: opacity 0.1s, background 0.1s;
&:last-child { border-bottom: none; }
&--mastered { opacity: 1; }
&:hover { background: fade(@cde-border, 20%); opacity: 1; }
}
.cde-kf-tech-mastered {
font-size: 11px;
flex-shrink: 0;
width: 14px;
text-align: center;
.cde-kf-tech--mastered & { color: @cde-kungfu; }
.cde-kf-tech:not(.cde-kf-tech--mastered) & { color: @cde-muted; }
}
.cde-act-badge {
font-size: 9px;
font-family: "Averia", sans-serif;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 2px 5px;
border-radius: 3px;
flex-shrink: 0;
max-width: 110px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border: 1px solid currentColor;
&.cde-act--action-attack { color: @wu-red; background: fade(@wu-red, 10%); }
&.cde-act--action-defense { color: @wu-blue; background: fade(@wu-blue, 10%); }
&.cde-act--action-aid { color: @wu-green; background: fade(@wu-green, 10%); }
&.cde-act--action-attack-defense { color: @wu-gray; background: fade(@wu-gray, 12%); }
&.cde-act--reaction { color: @wu-brown; background: fade(@wu-brown, 12%); }
&.cde-act--dice { color: @cde-spell; background: fade(@cde-spell, 10%); }
&.cde-act--damage-inflicted { color: @cde-weapon; background: fade(@cde-weapon, 10%); }
&.cde-act--damage-received { color: @cde-muted; background: fade(@cde-border, 20%); }
}
.cde-kf-tech-name {
flex: 1;
font-size: 12px;
color: @cde-text;
font-family: "Averia", sans-serif;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
em { color: @cde-muted; }
}
.cde-kf-empty {
padding: 16px;
text-align: center;
font-size: 12px;
color: @cde-muted;
font-style: italic;
}
// Random component chat message
.cde-chat-random-component {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
padding: 8px 12px;
}
.cde-chat-component-label {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: @cde-muted;
font-family: "Averia", sans-serif;
}
.cde-chat-component-value {
font-size: 16px;
font-weight: 700;
color: @cde-spell;
text-shadow: 0 0 8px fade(@cde-spell, 50%);
}
// Legacy tabs (actor sheets still use cde-tabs)
.cde-tabs {
margin-top: @cde-gap;

124
dist/system.js vendored
View File

@@ -449,7 +449,7 @@ var SpellDataModel = class extends foundry.abstract.TypeDataModel {
effects: htmlField(""),
examples: htmlField(""),
notes: htmlField(""),
discipline: stringField("cinabre"),
discipline: stringField("internalcinnabar"),
heiType: stringField("yin"),
heiCost: new fields.NumberField({ required: true, nullable: false, integer: true, min: 0, initial: 1 }),
difficulty: new fields.NumberField({ required: true, nullable: false, integer: true, min: 0, initial: 1 })
@@ -727,6 +727,55 @@ function registerHandlebarsHelpers() {
Handlebars.registerHelper("getMagicSpecialityLabelElement", function(magic, speciality) {
return game.i18n.localize(MAGICS[magic]?.speciality?.[speciality]?.labelelement ?? "");
});
Handlebars.registerHelper("getMagicAspectIcon", function(magic) {
const icons = {
internalcinnabar: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.png",
alchemy: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.png",
masteryoftheway: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.png",
exorcism: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.png",
geomancy: "/systems/fvtt-chroniques-de-l-etrange/images/cde_bois.png"
};
return icons[magic] ?? "";
});
Handlebars.registerHelper("getElementIcon", function(aspect) {
const icons = {
metal: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.png",
eau: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.png",
terre: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.png",
feu: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.png",
bois: "/systems/fvtt-chroniques-de-l-etrange/images/cde_bois.png"
};
return icons[aspect] ?? "";
});
Handlebars.registerHelper("getOrientationIcon", function(orientation) {
const icons = {
yin: "/systems/fvtt-chroniques-de-l-etrange/images/cde_yin.png",
yang: "/systems/fvtt-chroniques-de-l-etrange/images/cde_yang.png",
yinyang: "/systems/fvtt-chroniques-de-l-etrange/images/yin_yang.png"
};
return icons[orientation] ?? "";
});
Handlebars.registerHelper("getOrientationLabel", function(orientation) {
const keys = {
yin: "CDE.OrientationYin",
yang: "CDE.OrientationYang",
yinyang: "CDE.OrientationYinYang"
};
return game.i18n.localize(keys[orientation] ?? "CDE.Orientation");
});
Handlebars.registerHelper("getActivationLabel", function(activation) {
const keys = {
"action-attack": "CDE.ActivationAttack",
"action-defense": "CDE.ActivationDefense",
"action-aid": "CDE.ActivationAid",
"action-attack-defense": "CDE.ActivationAttackOrDefense",
reaction: "CDE.ActivationReaction",
dice: "CDE.ActivationDice",
"damage-inflicted": "CDE.ActivationDamageInflicted",
"damage-received": "CDE.ActivationDamageReceived"
};
return game.i18n.localize(keys[activation] ?? "CDE.Activation");
});
}
// src/ui/templates.js
@@ -1449,15 +1498,19 @@ var CDEBaseActorSheet = class _CDEBaseActorSheet extends HandlebarsApplicationMi
supernatural: "CDE.SupernaturalNew"
};
const name = game.i18n.localize(labels[type] ?? "CDE.ItemNew");
return cls.create({ name, type }, { parent: this.document });
const systemData = {};
if (type === "spell" && target.dataset.discipline) {
systemData.discipline = target.dataset.discipline;
}
return cls.create({ name, type, system: systemData }, { parent: this.document });
}
static #onItemEdit(event, target) {
const itemId = target.closest(".item")?.dataset.itemId;
const itemId = target.dataset.itemId ?? target.closest("[data-item-id]")?.dataset.itemId;
const item = this.document.items.get(itemId);
if (item) item.sheet.render(true);
}
static #onItemDelete(event, target) {
const itemId = target.closest(".item")?.dataset.itemId;
const itemId = target.dataset.itemId ?? target.closest("[data-item-id]")?.dataset.itemId;
const item = this.document.items.get(itemId);
if (item) item.delete();
}
@@ -1482,6 +1535,32 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
context.spells = context.items.filter((item) => item.type === "spell");
context.kungfus = context.items.filter((item) => item.type === "kungfu");
context.CDE = { MAGICS, SUBTYPES };
const spellsByDiscipline = {};
for (const spell of context.spells) {
const disc = spell.system?.discipline ?? "internalcinnabar";
if (!spellsByDiscipline[disc]) spellsByDiscipline[disc] = [];
spellsByDiscipline[disc].push(spell);
}
const systemMagics = context.systemData.magics ?? {};
context.magicsDisplay = Object.fromEntries(
Object.entries(MAGICS).map(([magicKey, magicDef]) => {
const magicData = systemMagics[magicKey] ?? {};
return [
magicKey,
{
value: magicData.value ?? 0,
visible: magicData.visible ?? false,
speciality: Object.fromEntries(
Object.keys(magicDef.speciality).map((specKey) => [
specKey,
{ check: magicData.speciality?.[specKey]?.check ?? false }
])
),
grimoire: spellsByDiscipline[magicKey] ?? []
}
];
})
);
return context;
}
_onRender(context, options) {
@@ -1489,6 +1568,7 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
this.#bindInitiativeControls();
this.#bindPrefs();
this.#bindRollButtons();
this.#bindComponentRandomize();
}
#bindInitiativeControls() {
const buttons = this.element?.querySelectorAll(".click-initiative");
@@ -1563,6 +1643,42 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
});
});
}
#bindComponentRandomize() {
const btn = this.element?.querySelector("[data-action='randomize-component']");
if (!btn) return;
btn.addEventListener("click", async () => {
const roll = new Roll("1d10");
await roll.evaluate();
const face = roll.total === 10 ? 0 : roll.total;
const COMPONENT_KEYS = {
1: "one",
2: "two",
3: "three",
4: "four",
5: "five",
6: "six",
7: "seven",
8: "eight",
9: "nine",
0: "zero"
};
const componentKey = COMPONENT_KEYS[face];
const componentValue = this.document.system.component?.[componentKey]?.value ?? "";
const label = componentValue ? `<strong>${componentValue}</strong>` : `<em>${game.i18n.localize("CDE.Component")}${face}</em>`;
const content = `
<div class="cde-chat-random-component">
<span class="cde-chat-component-label">${game.i18n.localize("CDE.ChanceThrowResult")}</span>
<span class="cde-chat-component-value">${label}</span>
</div>`;
await ChatMessage.create({
user: game.user.id,
speaker: ChatMessage.getSpeaker({ actor: this.document }),
content,
rolls: [roll],
rollMode: "roll"
});
});
}
};
// src/ui/sheets/actors/npc.js

4
dist/system.js.map vendored

File diff suppressed because one or more lines are too long

View File

@@ -44,6 +44,7 @@
"CDE.CelestialGuardian4": "Oiseau Écarlate (Feu)",
"CDE.CelestialGuardian5": "Dragon dAzur (Bois)",
"CDE.ChanceThrow": "Choisir un composant au hasard dans lurgence",
"CDE.ChanceThrowResult": "Composant tiré au sort :",
"CDE.ClimateControl": "Maîtrise Climatique",
"CDE.Component": "Composant n° ",
"CDE.Components": "Composantes",
@@ -143,6 +144,7 @@
"CDE.KFCreate": "Créer un Art Martial",
"CDE.KFDelete": "Supprimer lArt Martial",
"CDE.KFEdit": "Éditer lArt Martial",
"CDE.KFEmpty": "Aucun art martial maîtrisé.",
"CDE.KFNew": "Nouvel Art Martial",
"CDE.Knavery": "Filouterie",
"CDE.KungFu": "Kung Fu",
@@ -176,6 +178,8 @@
"CDE.MsgMagic3": ". La puissance à invoquer est de ",
"CDE.MsgMagic4": ", si toutefois le sort est lancé avec succès.",
"CDE.NPCName": "Nom du PNJ",
"CDE.FatSi": "Fat Si",
"CDE.PNJ": "PNJ",
"CDE.Name": "Nom",
"CDE.Necromancy": "Nécromancie",
"CDE.Neutralization": "Neutralisation",
@@ -256,6 +260,8 @@
"CDE.SpellDelete": "Supprimer le Sortilège",
"CDE.SpellEdit": "Éditer le Sortilège",
"CDE.SpellNew": "Nouveau Sortilège",
"CDE.Grimoire": "Grimoire",
"CDE.GrimoireEmpty": "Aucun sortilège noté pour cette discipline.",
"CDE.Spells": "Sortilèges",
"CDE.Spiritual": "● Spirituelle",
"CDE.Style": "Style",

View File

@@ -1 +1 @@
MANIFEST-000050
MANIFEST-000062

View File

@@ -1,3 +1,7 @@
2026/03/26-23:22:41.148674 7f90f77fe6c0 Recovering log #48
2026/03/26-23:22:41.202546 7f90f77fe6c0 Delete type=3 #46
2026/03/26-23:22:41.202617 7f90f77fe6c0 Delete type=0 #48
2026/03/27-23:40:07.003627 7f90f7fff6c0 Recovering log #60
2026/03/27-23:40:07.014585 7f90f7fff6c0 Delete type=3 #58
2026/03/27-23:40:07.014647 7f90f7fff6c0 Delete type=0 #60
2026/03/28-01:06:04.060694 7f90f5ffb6c0 Level-0 table #65: started
2026/03/28-01:06:04.060719 7f90f5ffb6c0 Level-0 table #65: 0 bytes OK
2026/03/28-01:06:04.067602 7f90f5ffb6c0 Delete type=0 #63
2026/03/28-01:06:04.080111 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!ZWBHiWW5QlUeseAX' @ 72057594037927935 : 1 .. '!journal.pages!ZWBHiWW5QlUeseAX.jtQXIqLfyet8Nlte' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/26-22:00:22.685636 7f90f7fff6c0 Recovering log #44
2026/03/26-22:00:22.746783 7f90f7fff6c0 Delete type=3 #42
2026/03/26-22:00:22.746837 7f90f7fff6c0 Delete type=0 #44
2026/03/26-23:22:30.433416 7f90f5ffb6c0 Level-0 table #49: started
2026/03/26-23:22:30.433442 7f90f5ffb6c0 Level-0 table #49: 0 bytes OK
2026/03/26-23:22:30.471510 7f90f5ffb6c0 Delete type=0 #47
2026/03/26-23:22:30.471678 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!ZWBHiWW5QlUeseAX' @ 72057594037927935 : 1 .. '!journal.pages!ZWBHiWW5QlUeseAX.jtQXIqLfyet8Nlte' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.280454 7f90f67fc6c0 Recovering log #56
2026/03/27-21:21:30.290347 7f90f67fc6c0 Delete type=3 #54
2026/03/27-21:21:30.290399 7f90f67fc6c0 Delete type=0 #56
2026/03/27-21:21:32.095874 7f90f5ffb6c0 Level-0 table #61: started
2026/03/27-21:21:32.095896 7f90f5ffb6c0 Level-0 table #61: 0 bytes OK
2026/03/27-21:21:32.102427 7f90f5ffb6c0 Delete type=0 #59
2026/03/27-21:21:32.116179 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!ZWBHiWW5QlUeseAX' @ 72057594037927935 : 1 .. '!journal.pages!ZWBHiWW5QlUeseAX.jtQXIqLfyet8Nlte' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000166
MANIFEST-000178

View File

@@ -1,3 +1,8 @@
2026/03/26-23:22:41.093289 7f90f67fc6c0 Recovering log #164
2026/03/26-23:22:41.146507 7f90f67fc6c0 Delete type=3 #162
2026/03/26-23:22:41.146560 7f90f67fc6c0 Delete type=0 #164
2026/03/27-23:40:06.991314 7f90f77fe6c0 Recovering log #176
2026/03/27-23:40:07.001875 7f90f77fe6c0 Delete type=3 #174
2026/03/27-23:40:07.001926 7f90f77fe6c0 Delete type=0 #176
2026/03/28-01:06:04.048472 7f90f5ffb6c0 Level-0 table #181: started
2026/03/28-01:06:04.048493 7f90f5ffb6c0 Level-0 table #181: 0 bytes OK
2026/03/28-01:06:04.054367 7f90f5ffb6c0 Delete type=0 #179
2026/03/28-01:06:04.054479 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
2026/03/28-01:06:04.054500 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/03/26-22:00:22.608830 7f90f67fc6c0 Recovering log #160
2026/03/26-22:00:22.665730 7f90f67fc6c0 Delete type=3 #158
2026/03/26-22:00:22.665947 7f90f67fc6c0 Delete type=0 #160
2026/03/26-23:22:30.583548 7f90f5ffb6c0 Level-0 table #165: started
2026/03/26-23:22:30.583573 7f90f5ffb6c0 Level-0 table #165: 0 bytes OK
2026/03/26-23:22:30.620608 7f90f5ffb6c0 Delete type=0 #163
2026/03/26-23:22:30.620784 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
2026/03/26-23:22:30.620826 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.268953 7f90f6ffd6c0 Recovering log #172
2026/03/27-21:21:30.278662 7f90f6ffd6c0 Delete type=3 #170
2026/03/27-21:21:30.278730 7f90f6ffd6c0 Delete type=0 #172
2026/03/27-21:21:32.067762 7f90f5ffb6c0 Level-0 table #177: started
2026/03/27-21:21:32.067784 7f90f5ffb6c0 Level-0 table #177: 0 bytes OK
2026/03/27-21:21:32.074619 7f90f5ffb6c0 Delete type=0 #175
2026/03/27-21:21:32.089332 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
2026/03/27-21:21:32.089368 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000738
MANIFEST-000750

View File

@@ -1,3 +1,8 @@
2026/03/26-23:22:41.037729 7f90f7fff6c0 Recovering log #736
2026/03/26-23:22:41.091148 7f90f7fff6c0 Delete type=3 #734
2026/03/26-23:22:41.091204 7f90f7fff6c0 Delete type=0 #736
2026/03/27-23:40:06.977536 7f90f67fc6c0 Recovering log #748
2026/03/27-23:40:06.987624 7f90f67fc6c0 Delete type=3 #746
2026/03/27-23:40:06.987699 7f90f67fc6c0 Delete type=0 #748
2026/03/28-01:06:04.041962 7f90f5ffb6c0 Level-0 table #753: started
2026/03/28-01:06:04.041998 7f90f5ffb6c0 Level-0 table #753: 0 bytes OK
2026/03/28-01:06:04.048371 7f90f5ffb6c0 Delete type=0 #751
2026/03/28-01:06:04.054466 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
2026/03/28-01:06:04.054494 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/03/26-22:00:22.529664 7f90f77fe6c0 Recovering log #732
2026/03/26-22:00:22.584296 7f90f77fe6c0 Delete type=3 #730
2026/03/26-22:00:22.584358 7f90f77fe6c0 Delete type=0 #732
2026/03/26-23:22:30.358180 7f90f5ffb6c0 Level-0 table #737: started
2026/03/26-23:22:30.358207 7f90f5ffb6c0 Level-0 table #737: 0 bytes OK
2026/03/26-23:22:30.395875 7f90f5ffb6c0 Delete type=0 #735
2026/03/26-23:22:30.471656 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
2026/03/26-23:22:30.471686 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.255554 7f90f77fe6c0 Recovering log #744
2026/03/27-21:21:30.266879 7f90f77fe6c0 Delete type=3 #742
2026/03/27-21:21:30.266948 7f90f77fe6c0 Delete type=0 #744
2026/03/27-21:21:32.081193 7f90f5ffb6c0 Level-0 table #749: started
2026/03/27-21:21:32.081218 7f90f5ffb6c0 Level-0 table #749: 0 bytes OK
2026/03/27-21:21:32.089124 7f90f5ffb6c0 Delete type=0 #747
2026/03/27-21:21:32.089363 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
2026/03/27-21:21:32.089373 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-004359
MANIFEST-004371

View File

@@ -1,3 +1,7 @@
2026/03/26-23:22:40.912790 7f90f67fc6c0 Recovering log #4357
2026/03/26-23:22:40.970516 7f90f67fc6c0 Delete type=3 #4355
2026/03/26-23:22:40.970566 7f90f67fc6c0 Delete type=0 #4357
2026/03/27-23:40:06.951174 7f90f77fe6c0 Recovering log #4369
2026/03/27-23:40:06.961084 7f90f77fe6c0 Delete type=3 #4367
2026/03/27-23:40:06.961153 7f90f77fe6c0 Delete type=0 #4369
2026/03/28-01:06:04.029376 7f90f5ffb6c0 Level-0 table #4374: started
2026/03/28-01:06:04.029452 7f90f5ffb6c0 Level-0 table #4374: 0 bytes OK
2026/03/28-01:06:04.035591 7f90f5ffb6c0 Delete type=0 #4372
2026/03/28-01:06:04.054447 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!0lxwWrzKsdTBQhH0' @ 72057594037927935 : 1 .. '!journal.pages!wgSyae4GTJDkmBOm.6Ql0lgquUCTrMyTZ' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/03/26-22:00:22.375122 7f90f67fc6c0 Recovering log #4353
2026/03/26-22:00:22.431093 7f90f67fc6c0 Delete type=3 #4351
2026/03/26-22:00:22.431156 7f90f67fc6c0 Delete type=0 #4353
2026/03/26-23:22:30.322515 7f90f5ffb6c0 Level-0 table #4358: started
2026/03/26-23:22:30.322564 7f90f5ffb6c0 Level-0 table #4358: 0 bytes OK
2026/03/26-23:22:30.358054 7f90f5ffb6c0 Delete type=0 #4356
2026/03/26-23:22:30.471641 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!0lxwWrzKsdTBQhH0' @ 72057594037927935 : 1 .. '!journal.pages!wgSyae4GTJDkmBOm.6Ql0lgquUCTrMyTZ' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.230925 7f90f67fc6c0 Recovering log #4365
2026/03/27-21:21:30.240633 7f90f67fc6c0 Delete type=3 #4363
2026/03/27-21:21:30.240686 7f90f67fc6c0 Delete type=0 #4365
2026/03/27-21:21:32.060793 7f90f5ffb6c0 Level-0 table #4370: started
2026/03/27-21:21:32.060834 7f90f5ffb6c0 Level-0 table #4370: 0 bytes OK
2026/03/27-21:21:32.067619 7f90f5ffb6c0 Delete type=0 #4368
2026/03/27-21:21:32.089309 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!0lxwWrzKsdTBQhH0' @ 72057594037927935 : 1 .. '!journal.pages!wgSyae4GTJDkmBOm.6Ql0lgquUCTrMyTZ' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000079
MANIFEST-000091

View File

@@ -1,3 +1,8 @@
2026/03/26-23:22:41.320339 7f90f6ffd6c0 Recovering log #77
2026/03/26-23:22:41.378833 7f90f6ffd6c0 Delete type=3 #75
2026/03/26-23:22:41.378896 7f90f6ffd6c0 Delete type=0 #77
2026/03/27-23:40:07.041219 7f90f6ffd6c0 Recovering log #89
2026/03/27-23:40:07.052133 7f90f6ffd6c0 Delete type=3 #87
2026/03/27-23:40:07.052198 7f90f6ffd6c0 Delete type=0 #89
2026/03/28-01:06:04.074099 7f90f5ffb6c0 Level-0 table #94: started
2026/03/28-01:06:04.074129 7f90f5ffb6c0 Level-0 table #94: 0 bytes OK
2026/03/28-01:06:04.080023 7f90f5ffb6c0 Delete type=0 #92
2026/03/28-01:06:04.080128 7f90f5ffb6c0 Manual compaction at level-0 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
2026/03/28-01:06:04.080153 7f90f5ffb6c0 Manual compaction at level-1 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/03/26-22:00:22.875118 7f90f77fe6c0 Recovering log #73
2026/03/26-22:00:22.937050 7f90f77fe6c0 Delete type=3 #71
2026/03/26-22:00:22.937152 7f90f77fe6c0 Delete type=0 #73
2026/03/26-23:22:30.545930 7f90f5ffb6c0 Level-0 table #78: started
2026/03/26-23:22:30.545959 7f90f5ffb6c0 Level-0 table #78: 0 bytes OK
2026/03/26-23:22:30.583434 7f90f5ffb6c0 Delete type=0 #76
2026/03/26-23:22:30.620775 7f90f5ffb6c0 Manual compaction at level-0 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
2026/03/26-23:22:30.620818 7f90f5ffb6c0 Manual compaction at level-1 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.316292 7f90f77fe6c0 Recovering log #85
2026/03/27-21:21:30.326791 7f90f77fe6c0 Delete type=3 #83
2026/03/27-21:21:30.326838 7f90f77fe6c0 Delete type=0 #85
2026/03/27-21:21:32.102543 7f90f5ffb6c0 Level-0 table #90: started
2026/03/27-21:21:32.102564 7f90f5ffb6c0 Level-0 table #90: 0 bytes OK
2026/03/27-21:21:32.109807 7f90f5ffb6c0 Delete type=0 #88
2026/03/27-21:21:32.116185 7f90f5ffb6c0 Manual compaction at level-0 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
2026/03/27-21:21:32.123641 7f90f5ffb6c0 Manual compaction at level-1 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000060
MANIFEST-000072

View File

@@ -1,3 +1,8 @@
2026/03/26-23:22:41.264104 7f90f77fe6c0 Recovering log #58
2026/03/26-23:22:41.318473 7f90f77fe6c0 Delete type=3 #56
2026/03/26-23:22:41.318542 7f90f77fe6c0 Delete type=0 #58
2026/03/27-23:40:07.028975 7f90f7fff6c0 Recovering log #70
2026/03/27-23:40:07.039557 7f90f7fff6c0 Delete type=3 #68
2026/03/27-23:40:07.039615 7f90f7fff6c0 Delete type=0 #70
2026/03/28-01:06:04.054602 7f90f5ffb6c0 Level-0 table #75: started
2026/03/28-01:06:04.054622 7f90f5ffb6c0 Level-0 table #75: 0 bytes OK
2026/03/28-01:06:04.060604 7f90f5ffb6c0 Delete type=0 #73
2026/03/28-01:06:04.080099 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
2026/03/28-01:06:04.080138 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/03/26-22:00:22.812984 7f90f7fff6c0 Recovering log #54
2026/03/26-22:00:22.870518 7f90f7fff6c0 Delete type=3 #52
2026/03/26-22:00:22.870588 7f90f7fff6c0 Delete type=0 #54
2026/03/26-23:22:30.508599 7f90f5ffb6c0 Level-0 table #59: started
2026/03/26-23:22:30.508625 7f90f5ffb6c0 Level-0 table #59: 0 bytes OK
2026/03/26-23:22:30.545804 7f90f5ffb6c0 Delete type=0 #57
2026/03/26-23:22:30.620763 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
2026/03/26-23:22:30.620799 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.304400 7f90f67fc6c0 Recovering log #66
2026/03/27-21:21:30.314598 7f90f67fc6c0 Delete type=3 #64
2026/03/27-21:21:30.314668 7f90f67fc6c0 Delete type=0 #66
2026/03/27-21:21:32.089478 7f90f5ffb6c0 Level-0 table #71: started
2026/03/27-21:21:32.089505 7f90f5ffb6c0 Level-0 table #71: 0 bytes OK
2026/03/27-21:21:32.095733 7f90f5ffb6c0 Delete type=0 #69
2026/03/27-21:21:32.116170 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
2026/03/27-21:21:32.123631 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000238
MANIFEST-000250

View File

@@ -1,3 +1,8 @@
2026/03/26-23:22:41.206104 7f90f6ffd6c0 Recovering log #236
2026/03/26-23:22:41.262267 7f90f6ffd6c0 Delete type=3 #234
2026/03/26-23:22:41.262335 7f90f6ffd6c0 Delete type=0 #236
2026/03/27-23:40:07.017004 7f90f6ffd6c0 Recovering log #248
2026/03/27-23:40:07.027187 7f90f6ffd6c0 Delete type=3 #246
2026/03/27-23:40:07.027254 7f90f6ffd6c0 Delete type=0 #248
2026/03/28-01:06:04.067738 7f90f5ffb6c0 Level-0 table #253: started
2026/03/28-01:06:04.067767 7f90f5ffb6c0 Level-0 table #253: 0 bytes OK
2026/03/28-01:06:04.073991 7f90f5ffb6c0 Delete type=0 #251
2026/03/28-01:06:04.080120 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
2026/03/28-01:06:04.080146 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/03/26-22:00:22.749196 7f90f6ffd6c0 Recovering log #232
2026/03/26-22:00:22.804213 7f90f6ffd6c0 Delete type=3 #230
2026/03/26-22:00:22.804283 7f90f6ffd6c0 Delete type=0 #232
2026/03/26-23:22:30.471790 7f90f5ffb6c0 Level-0 table #237: started
2026/03/26-23:22:30.471814 7f90f5ffb6c0 Level-0 table #237: 0 bytes OK
2026/03/26-23:22:30.508477 7f90f5ffb6c0 Delete type=0 #235
2026/03/26-23:22:30.620742 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
2026/03/26-23:22:30.620792 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.291918 7f90f7fff6c0 Recovering log #244
2026/03/27-21:21:30.302711 7f90f7fff6c0 Delete type=3 #242
2026/03/27-21:21:30.302762 7f90f7fff6c0 Delete type=0 #244
2026/03/27-21:21:32.109958 7f90f5ffb6c0 Level-0 table #249: started
2026/03/27-21:21:32.109983 7f90f5ffb6c0 Level-0 table #249: 0 bytes OK
2026/03/27-21:21:32.116069 7f90f5ffb6c0 Delete type=0 #247
2026/03/27-21:21:32.116191 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
2026/03/27-21:21:32.116205 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000980
MANIFEST-000992

View File

@@ -1,3 +1,8 @@
2026/03/26-23:22:40.972919 7f90f77fe6c0 Recovering log #978
2026/03/26-23:22:41.035302 7f90f77fe6c0 Delete type=3 #976
2026/03/26-23:22:41.035379 7f90f77fe6c0 Delete type=0 #978
2026/03/27-23:40:06.964100 7f90f7fff6c0 Recovering log #990
2026/03/27-23:40:06.975062 7f90f7fff6c0 Delete type=3 #988
2026/03/27-23:40:06.975129 7f90f7fff6c0 Delete type=0 #990
2026/03/28-01:06:04.035671 7f90f5ffb6c0 Level-0 table #995: started
2026/03/28-01:06:04.035691 7f90f5ffb6c0 Level-0 table #995: 0 bytes OK
2026/03/28-01:06:04.041795 7f90f5ffb6c0 Delete type=0 #993
2026/03/28-01:06:04.054457 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
2026/03/28-01:06:04.054505 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/03/26-22:00:22.455743 7f90f6ffd6c0 Recovering log #974
2026/03/26-22:00:22.523057 7f90f6ffd6c0 Delete type=3 #972
2026/03/26-22:00:22.523122 7f90f6ffd6c0 Delete type=0 #974
2026/03/26-23:22:30.395975 7f90f5ffb6c0 Level-0 table #979: started
2026/03/26-23:22:30.395996 7f90f5ffb6c0 Level-0 table #979: 0 bytes OK
2026/03/26-23:22:30.433284 7f90f5ffb6c0 Delete type=0 #977
2026/03/26-23:22:30.471668 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
2026/03/26-23:22:30.471709 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
2026/03/27-21:21:30.242574 7f90f7fff6c0 Recovering log #986
2026/03/27-21:21:30.253063 7f90f7fff6c0 Delete type=3 #984
2026/03/27-21:21:30.253116 7f90f7fff6c0 Delete type=0 #986
2026/03/27-21:21:32.074771 7f90f5ffb6c0 Level-0 table #991: started
2026/03/27-21:21:32.074793 7f90f5ffb6c0 Level-0 table #991: 0 bytes OK
2026/03/27-21:21:32.081032 7f90f5ffb6c0 Delete type=0 #989
2026/03/27-21:21:32.089348 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
2026/03/27-21:21:32.089398 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)

View File

@@ -17,7 +17,7 @@ export default class SpellDataModel extends foundry.abstract.TypeDataModel {
effects: htmlField(""),
examples: htmlField(""),
notes: htmlField(""),
discipline: stringField("cinabre"),
discipline: stringField("internalcinnabar"),
heiType: stringField("yin"),
heiCost: new fields.NumberField({ required: true, nullable: false, integer: true, min: 0, initial: 1 }),
difficulty: new fields.NumberField({ required: true, nullable: false, integer: true, min: 0, initial: 1 }),

View File

@@ -46,4 +46,58 @@ export function registerHandlebarsHelpers() {
Handlebars.registerHelper("getMagicSpecialityLabelElement", function (magic, speciality) {
return game.i18n.localize(MAGICS[magic]?.speciality?.[speciality]?.labelelement ?? "")
})
Handlebars.registerHelper("getMagicAspectIcon", function (magic) {
const icons = {
internalcinnabar: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.png",
alchemy: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.png",
masteryoftheway: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.png",
exorcism: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.png",
geomancy: "/systems/fvtt-chroniques-de-l-etrange/images/cde_bois.png",
}
return icons[magic] ?? ""
})
Handlebars.registerHelper("getElementIcon", function (aspect) {
const icons = {
metal: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.png",
eau: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.png",
terre: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.png",
feu: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.png",
bois: "/systems/fvtt-chroniques-de-l-etrange/images/cde_bois.png",
}
return icons[aspect] ?? ""
})
Handlebars.registerHelper("getOrientationIcon", function (orientation) {
const icons = {
yin: "/systems/fvtt-chroniques-de-l-etrange/images/cde_yin.png",
yang: "/systems/fvtt-chroniques-de-l-etrange/images/cde_yang.png",
yinyang: "/systems/fvtt-chroniques-de-l-etrange/images/yin_yang.png",
}
return icons[orientation] ?? ""
})
Handlebars.registerHelper("getOrientationLabel", function (orientation) {
const keys = {
yin: "CDE.OrientationYin",
yang: "CDE.OrientationYang",
yinyang: "CDE.OrientationYinYang",
}
return game.i18n.localize(keys[orientation] ?? "CDE.Orientation")
})
Handlebars.registerHelper("getActivationLabel", function (activation) {
const keys = {
"action-attack": "CDE.ActivationAttack",
"action-defense": "CDE.ActivationDefense",
"action-aid": "CDE.ActivationAid",
"action-attack-defense": "CDE.ActivationAttackOrDefense",
reaction: "CDE.ActivationReaction",
dice: "CDE.ActivationDice",
"damage-inflicted": "CDE.ActivationDamageInflicted",
"damage-received": "CDE.ActivationDamageReceived",
}
return game.i18n.localize(keys[activation] ?? "CDE.Activation")
})
}

View File

@@ -59,17 +59,21 @@ export class CDEBaseActorSheet extends HandlebarsApplicationMixin(foundry.applic
supernatural: "CDE.SupernaturalNew",
}
const name = game.i18n.localize(labels[type] ?? "CDE.ItemNew")
return cls.create({ name, type }, { parent: this.document })
const systemData = {}
if (type === "spell" && target.dataset.discipline) {
systemData.discipline = target.dataset.discipline
}
return cls.create({ name, type, system: systemData }, { parent: this.document })
}
static #onItemEdit(event, target) {
const itemId = target.closest(".item")?.dataset.itemId
const itemId = target.dataset.itemId ?? target.closest("[data-item-id]")?.dataset.itemId
const item = this.document.items.get(itemId)
if (item) item.sheet.render(true)
}
static #onItemDelete(event, target) {
const itemId = target.closest(".item")?.dataset.itemId
const itemId = target.dataset.itemId ?? target.closest("[data-item-id]")?.dataset.itemId
const item = this.document.items.get(itemId)
if (item) item.delete()
}

View File

@@ -24,6 +24,37 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
context.spells = context.items.filter((item) => item.type === "spell")
context.kungfus = context.items.filter((item) => item.type === "kungfu")
context.CDE = { MAGICS, SUBTYPES }
// Group spells by discipline key (matches MAGICS keys)
const spellsByDiscipline = {}
for (const spell of context.spells) {
const disc = spell.system?.discipline ?? "internalcinnabar"
if (!spellsByDiscipline[disc]) spellsByDiscipline[disc] = []
spellsByDiscipline[disc].push(spell)
}
// Build magicsDisplay: only include the 5 relevant specialities per magic type + grimoire
const systemMagics = context.systemData.magics ?? {}
context.magicsDisplay = Object.fromEntries(
Object.entries(MAGICS).map(([magicKey, magicDef]) => {
const magicData = systemMagics[magicKey] ?? {}
return [
magicKey,
{
value: magicData.value ?? 0,
visible: magicData.visible ?? false,
speciality: Object.fromEntries(
Object.keys(magicDef.speciality).map((specKey) => [
specKey,
{ check: magicData.speciality?.[specKey]?.check ?? false },
])
),
grimoire: spellsByDiscipline[magicKey] ?? [],
},
]
})
)
return context
}
@@ -32,6 +63,7 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
this.#bindInitiativeControls()
this.#bindPrefs()
this.#bindRollButtons()
this.#bindComponentRandomize()
}
#bindInitiativeControls() {
@@ -109,4 +141,33 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
})
})
}
#bindComponentRandomize() {
const btn = this.element?.querySelector("[data-action='randomize-component']")
if (!btn) return
btn.addEventListener("click", async () => {
const roll = new Roll("1d10")
await roll.evaluate()
const face = roll.total === 10 ? 0 : roll.total
const COMPONENT_KEYS = { 1:"one", 2:"two", 3:"three", 4:"four", 5:"five",
6:"six", 7:"seven", 8:"eight", 9:"nine", 0:"zero" }
const componentKey = COMPONENT_KEYS[face]
const componentValue = this.document.system.component?.[componentKey]?.value ?? ""
const label = componentValue
? `<strong>${componentValue}</strong>`
: `<em>${game.i18n.localize("CDE.Component")}${face}</em>`
const content = `
<div class="cde-chat-random-component">
<span class="cde-chat-component-label">${game.i18n.localize("CDE.ChanceThrowResult")}</span>
<span class="cde-chat-component-value">${label}</span>
</div>`
await ChatMessage.create({
user: game.user.id,
speaker: ChatMessage.getSpeaker({ actor: this.document }),
content,
rolls: [roll],
rollMode: "roll",
})
})
}
}

View File

@@ -15,12 +15,12 @@
<div class="cde-grid two">
<div class="cde-field">
<label>{{ localize "CDE.Concept" }}</label>
<input type="text" name="system.concept" value="{{systemData.concept}}" placeholder="{{ localize 'CDE.Concept' }}" />
<input type="text" name="system.concept" value="{{systemData.concept}}" placeholder="" />
</div>
<div class="cde-field">
<label>{{ localize "CDE.CelestialGuardian" }}</label>
<select name="system.guardian">
<option value="0" {{#if (eq systemData.guardian 0)}}selected{{/if}}>{{ localize "CDE.CelestialGuardian" }}</option>
<option value="0" {{#if (eq systemData.guardian 0)}}selected{{/if}}></option>
<option value="1" {{#if (eq systemData.guardian 1)}}selected{{/if}}>{{ localize "CDE.CelestialGuardian1" }}</option>
<option value="2" {{#if (eq systemData.guardian 2)}}selected{{/if}}>{{ localize "CDE.CelestialGuardian2" }}</option>
<option value="3" {{#if (eq systemData.guardian 3)}}selected{{/if}}>{{ localize "CDE.CelestialGuardian3" }}</option>
@@ -31,7 +31,7 @@
</div>
<div class="cde-quick-meta">
<div class="cde-tag">
<span class="cde-pill character">{{ localize "CDE.PCName" }}</span>
<span class="cde-pill character">{{ localize "CDE.FatSi" }}</span>
<span>Chroniques de l'Étrange</span>
</div>
<div class="cde-initiative-card">
@@ -74,7 +74,6 @@
<a class="item" data-action="tab" data-group="primary" data-tab="skills">{{ localize "CDE.Skills" }}</a>
<a class="item" data-action="tab" data-group="primary" data-tab="treasures">{{ localize "CDE.Treasures" }}</a>
<a class="item" data-action="tab" data-group="primary" data-tab="magics">{{ localize "CDE.Magics" }}</a>
<a class="item" data-action="tab" data-group="primary" data-tab="spells">{{ localize "CDE.Spells" }}</a>
<a class="item" data-action="tab" data-group="primary" data-tab="kungfus">{{ localize "CDE.KungFu" }}</a>
<a class="item" data-action="tab" data-group="primary" data-tab="items">{{ localize "CDE.Items" }}</a>
</nav>
@@ -110,12 +109,6 @@
</div>
</div>
<div class="tab" data-group="primary" data-tab="spells">
<div class="cde-card cde-data-table">
{{> "systems/fvtt-chroniques-de-l-etrange/templates/actor/parts/cde-character-spells.html"}}
</div>
</div>
<div class="tab" data-group="primary" data-tab="kungfus">
<div class="cde-card cde-data-table">
{{> "systems/fvtt-chroniques-de-l-etrange/templates/actor/parts/cde-character-kungfus.html"}}

View File

@@ -76,7 +76,7 @@
</div>
</div>
<div class="cde-tag">
<span class="cde-pill npc">{{ localize "CDE.NPCName" }}</span>
<span class="cde-pill npc">{{ localize "CDE.PNJ" }}</span>
<span>Chroniques de l'Étrange</span>
</div>
</div>

View File

@@ -1,16 +1,83 @@
<ol class="item-list">
{{#each kungfus as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}">
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
<h4 class="item-name">{{item.name}}</h4>
<div class="item-controls">
<a class="item-control cde-roll-trigger" title="{{ localize 'CDE.Roll' }}" data-libel-id="{{item._id}}-itemkungfu"><i class="fas fa-dice"></i></a>
<a class="item-control" title="{{ localize 'CDE.KFEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
<a class="item-control" title="{{ localize 'CDE.KFDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
{{!-- ===================== ARTS MARTIAUX ===================== --}}
<div class="cde-kf-add-row">
<a class="cde-kf-add-btn" data-action="create" data-type="kungfu" title="{{ localize 'CDE.KFCreate' }}">
<i class="fas fa-plus"></i> {{ localize "CDE.KFCreate" }}
</a>
</div>
{{#if kungfus.length}}
{{#each kungfus as |item|}}
<div class="cde-kf-card cde-kf--{{item.system.aspect}}">
<div class="cde-kf-header">
<img class="cde-kf-aspect-icon" src="{{ getElementIcon item.system.aspect }}" alt="{{item.system.aspect}}" />
<img class="cde-kf-orient-icon" src="{{ getOrientationIcon item.system.orientation }}" alt="{{item.system.orientation}}"
title="{{ getOrientationLabel item.system.orientation }}" />
<div class="cde-kf-info">
<span class="cde-kf-name">{{item.name}}</span>
<span class="cde-kf-meta">
{{#if (eq item.system.skill "rangedcombat")}}{{ localize "CDE.RangedCombat" }}{{else}}{{ localize "CDE.SkillKungfu" }}{{/if}}
{{#if item.system.speciality}}&middot; <em>{{item.system.speciality}}</em>{{/if}}
</span>
</div>
<a class="cde-roll-trigger cde-kf-roll-btn" data-libel-id="{{item._id}}-itemkungfu"
title="{{ localize 'CDE.Roll' }} {{item.name}}">
<i class="fas fa-dice-d10"></i>
</a>
<div class="cde-kf-controls">
<a data-action="edit" data-item-id="{{item._id}}" title="{{ localize 'CDE.KFEdit' }}"><i class="fas fa-edit"></i></a>
<a data-action="delete" data-item-id="{{item._id}}" title="{{ localize 'CDE.KFDelete' }}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{!-- Style --}}
{{#if item.system.style}}
<div class="cde-kf-style-row">
<span class="cde-kf-style-label"><i class="fas fa-star"></i> {{ localize "CDE.Style" }}</span>
<span class="cde-kf-style-text">{{item.system.style}}</span>
</div>
{{/if}}
{{!-- Techniques --}}
<ul class="cde-kf-techniques">
{{#with item.system.techniques.technique1 as |tech|}}
{{#if tech.name}}
<li class="cde-kf-tech {{#if tech.check}}cde-kf-tech--mastered{{/if}}">
<span class="cde-kf-tech-mastered" title="{{ localize 'CDE.Masterized' }}">
{{#if tech.check}}<i class="fas fa-check-circle"></i>{{else}}<i class="far fa-circle"></i>{{/if}}
</span>
<span class="cde-act-badge cde-act--{{tech.activation}}" title="{{ getActivationLabel tech.activation }}">{{ getActivationLabel tech.activation }}</span>
<span class="cde-kf-tech-name">{{#if tech.name}}{{tech.name}}{{else}}<em></em>{{/if}}</span>
</li>
{{/each}}
</ol>
<p>
<a class="item-control" title="{{ localize 'CDE.KFCreate' }}" data-action="create" data-type="kungfu"><i class="fas fa-plus"></i> {{ localize "CDE.KFCreate" }}</a>
</p>
{{/if}}
{{/with}}
{{#with item.system.techniques.technique2 as |tech|}}
{{#if tech.name}}
<li class="cde-kf-tech {{#if tech.check}}cde-kf-tech--mastered{{/if}}">
<span class="cde-kf-tech-mastered" title="{{ localize 'CDE.Masterized' }}">
{{#if tech.check}}<i class="fas fa-check-circle"></i>{{else}}<i class="far fa-circle"></i>{{/if}}
</span>
<span class="cde-act-badge cde-act--{{tech.activation}}" title="{{ getActivationLabel tech.activation }}">{{ getActivationLabel tech.activation }}</span>
<span class="cde-kf-tech-name">{{#if tech.name}}{{tech.name}}{{else}}<em></em>{{/if}}</span>
</li>
{{/if}}
{{/with}}
{{#with item.system.techniques.technique3 as |tech|}}
{{#if tech.name}}
<li class="cde-kf-tech {{#if tech.check}}cde-kf-tech--mastered{{/if}}">
<span class="cde-kf-tech-mastered" title="{{ localize 'CDE.Masterized' }}">
{{#if tech.check}}<i class="fas fa-check-circle"></i>{{else}}<i class="far fa-circle"></i>{{/if}}
</span>
<span class="cde-act-badge cde-act--{{tech.activation}}" title="{{ getActivationLabel tech.activation }}">{{ getActivationLabel tech.activation }}</span>
<span class="cde-kf-tech-name">{{#if tech.name}}{{tech.name}}{{else}}<em></em>{{/if}}</span>
</li>
{{/if}}
{{/with}}
</ul>
</div>
{{/each}}
{{else}}
<p class="cde-kf-empty">{{ localize "CDE.KFEmpty" }}</p>
{{/if}}

View File

@@ -1,138 +1,153 @@
<div class="tab-sous-titre">{{ localize "CDE.Components2" }}</div>
<table class="cde-magics-table">
<tr>
<td class="image"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-1.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}1" name="system.component.one.value" value="{{systemData.component.one.value}}" />
</td>
<td class="td-spacer">&nbsp;</td>
<td class="image td-die"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-6.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}6" name="system.component.six.value" value="{{systemData.component.six.value}}" />
</td>
</tr>
<tr>
<td class="image"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-2.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}2" name="system.component.two.value" value="{{systemData.component.two.value}}" />
</td>
<td class="td-spacer">&nbsp;</td>
<td class="image td-die"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-7.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}7" name="system.component.seven.value" value="{{systemData.component.seven.value}}" />
</td>
</tr>
<tr>
<td class="image"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-3.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}3" name="system.component.three.value" value="{{systemData.component.three.value}}" />
</td>
<td class="td-spacer">&nbsp;</td>
<td class="image td-die"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-8.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}8" name="system.component.eight.value" value="{{systemData.component.eight.value}}" />
</td>
</tr>
<tr>
<td class="image"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-4.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}4" name="system.component.four.value" value="{{systemData.component.four.value}}" />
</td>
<td class="td-spacer">&nbsp;</td>
<td class="image td-die"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-9.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}9" name="system.component.nine.value" value="{{systemData.component.nine.value}}" />
</td>
</tr>
<tr>
<td class="image"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-5.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}5" name="system.component.five.value" value="{{systemData.component.five.value}}" />
</td>
<td class="td-spacer">&nbsp;</td>
<td class="image td-die"><img src="systems/fvtt-chroniques-de-l-etrange/images/d10-0.png" alt="Die" /></td>
<td class="value">
<input class="input" type="text" placeholder="{{ localize 'CDE.Component' }}0" name="system.component.zero.value" value="{{systemData.component.zero.value}}" />
</td>
</tr>
</table>
<div class="chancethrow">
<img
class="click img-die-sm"
data-libel-id="randomize-randomize"
src="systems/fvtt-chroniques-de-l-etrange/images/d10-10.png"
title="{{ localize 'CDE.Die' }}{{ localize 'CDE.ChanceThrow' }}"
alt="Die"
/>
<label class="label"><b>&nbsp;{{ localize "CDE.ChanceThrow" }}</b></label>
{{!-- ======================== COMPOSANTS & INGRÉDIENTS ======================== --}}
<div class="cde-section-label">
<i class="fas fa-flask"></i> {{ localize "CDE.Components2" }}
</div>
<div class="tab-sous-titre">{{ localize "CDE.TypesOfMagic" }}</div>
<div class="cde-components-grid">
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-1.png" alt="1" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}1" name="system.component.one.value" value="{{systemData.component.one.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-6.png" alt="6" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}6" name="system.component.six.value" value="{{systemData.component.six.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-2.png" alt="2" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}2" name="system.component.two.value" value="{{systemData.component.two.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-7.png" alt="7" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}7" name="system.component.seven.value" value="{{systemData.component.seven.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-3.png" alt="3" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}3" name="system.component.three.value" value="{{systemData.component.three.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-8.png" alt="8" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}8" name="system.component.eight.value" value="{{systemData.component.eight.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-4.png" alt="4" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}4" name="system.component.four.value" value="{{systemData.component.four.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-9.png" alt="9" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}9" name="system.component.nine.value" value="{{systemData.component.nine.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-5.png" alt="5" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}5" name="system.component.five.value" value="{{systemData.component.five.value}}" />
</div>
<div class="cde-component-cell">
<img class="cde-component-die" src="systems/fvtt-chroniques-de-l-etrange/images/d10-0.png" alt="0" />
<input type="text" class="cde-component-input" placeholder="{{ localize 'CDE.Component' }}0" name="system.component.zero.value" value="{{systemData.component.zero.value}}" />
</div>
</div>
<div class="cde-component-random-row">
<button type="button" class="cde-btn-random-component" data-action="randomize-component"
title="{{ localize 'CDE.ChanceThrow' }}">
<i class="fas fa-dice"></i>
<span>{{ localize "CDE.ChanceThrow" }}</span>
</button>
</div>
{{!-- ======================== TYPES DE MAGIE ======================== --}}
<div class="cde-section-label cde-section-label--top-margin">
<i class="fas fa-hat-wizard"></i> {{ localize "CDE.TypesOfMagic" }}
</div>
{{#each magicsDisplay as |magic key|}}
<div class="cde-magic-card cde-magic--{{key}}">
<div class="cde-magic-header">
<img class="cde-magic-aspect-icon" src="{{getMagicAspectIcon key}}" alt="{{getMagicAspectLabel key}}" />
<div class="cde-magic-info">
<span class="cde-magic-name">{{getMagicLabel key}}</span>
<span class="cde-magic-aspect-name">{{getMagicAspectLabel key}}</span>
</div>
<input class="cde-circle-input cde-magic-value-input" type="number" min="0"
name="system.magics.{{key}}.value" value="{{magic.value}}" />
<a class="cde-roll-trigger cde-magic-roll-btn"
data-libel-id="{{key}}-magic"
title="{{ localize 'CDE.Roll' }} {{getMagicLabel key}}">
<i class="fas fa-dice-d10"></i>
</a>
<label class="cde-magic-toggle" title="{{ localize 'CDE.PracticeSpecialty' }}">
<input type="checkbox" name="system.magics.{{key}}.visible" {{checked magic.visible}} />
<i class="fas {{#if magic.visible}}fa-chevron-up{{else}}fa-chevron-down{{/if}}"></i>
</label>
</div>
{{#each systemData.magics as |magic key|}}
{{log 'magic' key magic}}
<table class="{{getMagicBackground key}}">
<tr>
<td class="check visible">
<input
type="checkbox"
name="system.magics.{{key}}.visible"
{{
checked
magic.visible
}}
title="{{ localize 'CDE.Visible' }}"
/>
</td>
<td class="click" data-libel-id="{{key}}-magic">
<img
id="system.magics.{{@key}}.click"
src="systems/fvtt-chroniques-de-l-etrange/images/d10-10.png"
title="{{ localize 'CDE.Die' }}{{getMagicLabel key}}"
alt="{{ getMagicAspectLabel key }}"
/>
</td>
<td class="label"><b>&nbsp;&nbsp;{{getMagicLabel key}}</b></td>
<td class="image">
<img id="system.magics.{{@key}}.cercle.value" src="systems/fvtt-chroniques-de-l-etrange/images/cercle.png" title="Circle" alt="Cercle" />
<div class="stick">&nbsp;</div>
<input class="input" type="number" placeholder="0" name="system.magics.{{@key}}.value" value="{{magic.value}}" />
</td>
<td class="label"><b>&nbsp;&nbsp;,&nbsp;{{ getMagicAspectLabel key }}</b></td>
<td>
{{#if magic.visible}}
<table>
<div class="cde-magic-specialities">
{{#each magic.speciality as |special key2|}}
{{log 'speciality' special key key2}}
<tr class="clickondie">
<td class="check">
<input
type="checkbox"
name="system.magics.{{key}}.speciality.{{key2}}.check"
{{
checked
special.check
}}
title="{{ localize 'CDE.PracticeSpecialty' }}{{ getMagicSpecialityLabel key key2 }}"
/>
</td>
<td class="label"><b>{{ getMagicSpecialityLabel key key2 }}</b></td>
<td class="icon-element"><img src="{{getMagicSpecialityElementIcon key key2}}" title="{{ getMagicSpecialityLabelElement key key2 }}" alt="{{getMagicSpecialityLabelElement key key2}}" /></td>
<td class="{{getMagicSpecialityClassIcon key key2}}"><img src="{{ getMagicSpecialityIcon key key2 }}" title="{{getMagicSpecialityLabelIcon key key2}}" alt="{{getMagicSpecialityLabelIcon key key2}}" /></td>
<td class="click icon-d" data-libel-id="{{key}}-magicspecial-{{key2}}">
<img
id="{{system.magics.magic.speciality.special.click}}"
src="systems/fvtt-chroniques-de-l-etrange/images/d10-10.png"
title="{{ localize 'CDE.DieSP' }}{{ getMagicSpecialityLabel key key2 }}"
alt="Die"
/>
</td>
</tr>
<div class="cde-magic-spec-row {{#if special.check}}cde-magic-spec-row--active{{/if}}">
<label class="cde-magic-spec-check-label" title="{{ localize 'CDE.PracticeSpecialty' }}{{ getMagicSpecialityLabel key key2 }}">
<input type="checkbox" name="system.magics.{{key}}.speciality.{{key2}}.check" {{checked special.check}} />
<span class="cde-spec-checkbox-ui"></span>
</label>
<img class="cde-magic-spec-element" src="{{getMagicSpecialityElementIcon key key2}}"
alt="{{getMagicSpecialityLabelElement key key2}}"
title="{{getMagicSpecialityLabelElement key key2}}" />
<span class="cde-magic-spec-polarity {{getMagicSpecialityClassIcon key key2}}">
{{getMagicSpecialityLabelIcon key key2}}
</span>
<span class="cde-magic-spec-name">{{getMagicSpecialityLabel key key2}}</span>
<a class="cde-roll-trigger cde-magic-spec-roll-btn"
data-libel-id="{{key}}-magicspecial-{{key2}}"
title="{{ localize 'CDE.DieSP' }}{{getMagicSpecialityLabel key key2}}">
<i class="fas fa-dice-d10"></i>
</a>
</div>
{{/each}}
</table>
</div>
{{/if}}
</td>
</tr>
</table>
{{!-- ======================== GRIMOIRE — sorts de cette discipline ======================== --}}
<div class="cde-grimoire-section">
<div class="cde-grimoire-header">
<i class="fas fa-book-open"></i>
<span>{{ localize "CDE.Grimoire" }}</span>
<a class="cde-grimoire-add" data-action="create" data-type="spell" data-discipline="{{key}}"
title="{{ localize 'CDE.SpellCreate' }}">
<i class="fas fa-plus"></i>
</a>
</div>
{{#if magic.grimoire.length}}
<ul class="cde-grimoire-list">
{{#each magic.grimoire as |spell|}}
<li class="cde-grimoire-entry">
<img class="cde-grimoire-img" src="{{spell.img}}" alt="{{spell.name}}" width="20" height="20" />
<span class="cde-grimoire-name">{{spell.name}}</span>
<span class="cde-grimoire-meta">
{{#if spell.system.specialityname}}<em>{{spell.system.specialityname}}</em>{{/if}}
<span class="cde-grimoire-diff" title="{{ localize 'CDE.Difficulty' }}">
<i class="fas fa-layer-group"></i> {{spell.system.difficulty}}
</span>
<span class="cde-grimoire-hei" title="{{ localize 'CDE.HeiCost' }}">
<i class="fas fa-fire"></i> {{spell.system.heiCost}}
</span>
</span>
<div class="cde-grimoire-controls">
<a class="item-control" data-action="edit" data-item-id="{{spell._id}}" title="{{ localize 'CDE.SpellEdit' }}"><i class="fas fa-edit"></i></a>
<a class="item-control" data-action="delete" data-item-id="{{spell._id}}" title="{{ localize 'CDE.SpellDelete' }}"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
{{else}}
<p class="cde-grimoire-empty">{{ localize "CDE.GrimoireEmpty" }}</p>
{{/if}}
</div>
</div>
{{/each}}

View File

@@ -21,11 +21,30 @@
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusMalus" }}</label>
<input class="cde-roll-input" type="number" name="bonusmalusskill" value="{{bonusmalusskill}}" />
<select name="bonusmalusskill">
<option value="-5" {{#if (eq bonusmalusskill -5)}}selected{{/if}}>5 dés</option>
<option value="-4" {{#if (eq bonusmalusskill -4)}}selected{{/if}}>4 dés</option>
<option value="-3" {{#if (eq bonusmalusskill -3)}}selected{{/if}}>3 dés</option>
<option value="-2" {{#if (eq bonusmalusskill -2)}}selected{{/if}}>2 dés</option>
<option value="-1" {{#if (eq bonusmalusskill -1)}}selected{{/if}}>1 dé</option>
<option value="0" {{#if (eq bonusmalusskill 0)}}selected{{/if}}>0 (aucun)</option>
<option value="1" {{#if (eq bonusmalusskill 1)}}selected{{/if}}>+1 dé</option>
<option value="2" {{#if (eq bonusmalusskill 2)}}selected{{/if}}>+2 dés</option>
<option value="3" {{#if (eq bonusmalusskill 3)}}selected{{/if}}>+3 dés</option>
<option value="4" {{#if (eq bonusmalusskill 4)}}selected{{/if}}>+4 dés</option>
<option value="5" {{#if (eq bonusmalusskill 5)}}selected{{/if}}>+5 dés</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusAuspiciousDice" }}</label>
<input class="cde-roll-input" type="number" name="bonusauspiciousdice" min="0" max="15" value="{{bonusauspiciousdice}}" />
<select name="bonusauspiciousdice">
<option value="0" {{#if (eq bonusauspiciousdice 0)}}selected{{/if}}>0 dé-faste</option>
<option value="1" {{#if (eq bonusauspiciousdice 1)}}selected{{/if}}>1 dé-faste</option>
<option value="2" {{#if (eq bonusauspiciousdice 2)}}selected{{/if}}>2 dés-fastes</option>
<option value="3" {{#if (eq bonusauspiciousdice 3)}}selected{{/if}}>3 dés-fastes</option>
<option value="4" {{#if (eq bonusauspiciousdice 4)}}selected{{/if}}>4 dés-fastes</option>
<option value="5" {{#if (eq bonusauspiciousdice 5)}}selected{{/if}}>5 dés-fastes</option>
</select>
</div>
</div>
<p class="cde-roll-hint"><i>{{ localize "CDE.DoNotModify" }}</i></p>
@@ -47,15 +66,40 @@
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.RollDifficulty" }} (×)</label>
<input class="cde-roll-input" type="number" name="rolldifficulty" value="{{rolldifficulty}}" />
<select name="rolldifficulty">
<option value="1" {{#if (eq rolldifficulty 1)}}selected{{/if}}>1 — Action moyenne</option>
<option value="2" {{#if (eq rolldifficulty 2)}}selected{{/if}}>2 — Action complexe</option>
<option value="3" {{#if (eq rolldifficulty 3)}}selected{{/if}}>3 — Action difficile</option>
<option value="4" {{#if (eq rolldifficulty 4)}}selected{{/if}}>4 — Action héroïque</option>
<option value="5" {{#if (eq rolldifficulty 5)}}selected{{/if}}>5 — Action légendaire</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusMalus" }}</label>
<input class="cde-roll-input" type="number" name="bonusmalusspeciality" value="{{bonusmalusspeciality}}" />
<select name="bonusmalusspeciality">
<option value="-5" {{#if (eq bonusmalusspeciality -5)}}selected{{/if}}>5 dés</option>
<option value="-4" {{#if (eq bonusmalusspeciality -4)}}selected{{/if}}>4 dés</option>
<option value="-3" {{#if (eq bonusmalusspeciality -3)}}selected{{/if}}>3 dés</option>
<option value="-2" {{#if (eq bonusmalusspeciality -2)}}selected{{/if}}>2 dés</option>
<option value="-1" {{#if (eq bonusmalusspeciality -1)}}selected{{/if}}>1 dé</option>
<option value="0" {{#if (eq bonusmalusspeciality 0)}}selected{{/if}}>0 (aucun)</option>
<option value="1" {{#if (eq bonusmalusspeciality 1)}}selected{{/if}}>+1 dé</option>
<option value="2" {{#if (eq bonusmalusspeciality 2)}}selected{{/if}}>+2 dés</option>
<option value="3" {{#if (eq bonusmalusspeciality 3)}}selected{{/if}}>+3 dés</option>
<option value="4" {{#if (eq bonusmalusspeciality 4)}}selected{{/if}}>+4 dés</option>
<option value="5" {{#if (eq bonusmalusspeciality 5)}}selected{{/if}}>+5 dés</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.HeiSpend" }}</label>
<input class="cde-roll-input" type="number" name="heispend" min="0" value="{{heispend}}" />
<select name="heispend">
<option value="0" {{#if (eq heispend 0)}}selected{{/if}}>0 Hei</option>
<option value="1" {{#if (eq heispend 1)}}selected{{/if}}>1 Hei</option>
<option value="2" {{#if (eq heispend 2)}}selected{{/if}}>2 Hei</option>
<option value="3" {{#if (eq heispend 3)}}selected{{/if}}>3 Hei</option>
<option value="4" {{#if (eq heispend 4)}}selected{{/if}}>4 Hei</option>
<option value="5" {{#if (eq heispend 5)}}selected{{/if}}>5 Hei</option>
</select>
</div>
</div>
<p class="cde-roll-hint"><i>{{ localize "CDE.DoNotModify" }}</i></p>

View File

@@ -18,18 +18,42 @@
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusMalus" }}</label>
<input class="cde-roll-input" type="number" name="bonusmalus" value="{{bonusmalus}}" />
<select name="bonusmalus">
<option value="-5" {{#if (eq bonusmalus -5)}}selected{{/if}}>5 dés</option>
<option value="-4" {{#if (eq bonusmalus -4)}}selected{{/if}}>4 dés</option>
<option value="-3" {{#if (eq bonusmalus -3)}}selected{{/if}}>3 dés</option>
<option value="-2" {{#if (eq bonusmalus -2)}}selected{{/if}}>2 dés</option>
<option value="-1" {{#if (eq bonusmalus -1)}}selected{{/if}}>1 dé</option>
<option value="0" {{#if (eq bonusmalus 0)}}selected{{/if}}>0 (aucun)</option>
<option value="1" {{#if (eq bonusmalus 1)}}selected{{/if}}>+1 dé</option>
<option value="2" {{#if (eq bonusmalus 2)}}selected{{/if}}>+2 dés</option>
<option value="3" {{#if (eq bonusmalus 3)}}selected{{/if}}>+3 dés</option>
<option value="4" {{#if (eq bonusmalus 4)}}selected{{/if}}>+4 dés</option>
<option value="5" {{#if (eq bonusmalus 5)}}selected{{/if}}>+5 dés</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.WoundMalus" }}</label>
<input class="cde-roll-input" type="number" name="woundmalus" value="{{woundmalus}}" />
<select name="woundmalus">
<option value="0" {{#if (eq woundmalus 0)}}selected{{/if}}>0 — Indemne</option>
<option value="-1" {{#if (eq woundmalus -1)}}selected{{/if}}>1 dé — Blessé</option>
<option value="-2" {{#if (eq woundmalus -2)}}selected{{/if}}>2 dés — Gravement blessé</option>
<option value="-3" {{#if (eq woundmalus -3)}}selected{{/if}}>3 dés — Critique</option>
</select>
</div>
</div>
<div class="cde-roll-section">
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusAuspiciousDice" }}</label>
<input class="cde-roll-input" type="number" name="bonusauspiciousdice" min="0" max="15" value="{{bonusauspiciousdice}}" />
<select name="bonusauspiciousdice">
<option value="0" {{#if (eq bonusauspiciousdice 0)}}selected{{/if}}>0 dé-faste</option>
<option value="1" {{#if (eq bonusauspiciousdice 1)}}selected{{/if}}>1 dé-faste</option>
<option value="2" {{#if (eq bonusauspiciousdice 2)}}selected{{/if}}>2 dés-fastes</option>
<option value="3" {{#if (eq bonusauspiciousdice 3)}}selected{{/if}}>3 dés-fastes</option>
<option value="4" {{#if (eq bonusauspiciousdice 4)}}selected{{/if}}>4 dés-fastes</option>
<option value="5" {{#if (eq bonusauspiciousdice 5)}}selected{{/if}}>5 dés-fastes</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.TypeOfThrow" }}</label>

View File

@@ -18,18 +18,42 @@
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusMalus" }}</label>
<input class="cde-roll-input" type="number" name="bonusmalus" value="{{bonusmalus}}" />
<select name="bonusmalus">
<option value="-5" {{#if (eq bonusmalus -5)}}selected{{/if}}>5 dés</option>
<option value="-4" {{#if (eq bonusmalus -4)}}selected{{/if}}>4 dés</option>
<option value="-3" {{#if (eq bonusmalus -3)}}selected{{/if}}>3 dés</option>
<option value="-2" {{#if (eq bonusmalus -2)}}selected{{/if}}>2 dés</option>
<option value="-1" {{#if (eq bonusmalus -1)}}selected{{/if}}>1 dé</option>
<option value="0" {{#if (eq bonusmalus 0)}}selected{{/if}}>0 (aucun)</option>
<option value="1" {{#if (eq bonusmalus 1)}}selected{{/if}}>+1 dé</option>
<option value="2" {{#if (eq bonusmalus 2)}}selected{{/if}}>+2 dés</option>
<option value="3" {{#if (eq bonusmalus 3)}}selected{{/if}}>+3 dés</option>
<option value="4" {{#if (eq bonusmalus 4)}}selected{{/if}}>+4 dés</option>
<option value="5" {{#if (eq bonusmalus 5)}}selected{{/if}}>+5 dés</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.WoundMalus" }}</label>
<input class="cde-roll-input" type="number" name="woundmalus" value="{{woundmalus}}" />
<select name="woundmalus">
<option value="0" {{#if (eq woundmalus 0)}}selected{{/if}}>0 — Indemne</option>
<option value="-1" {{#if (eq woundmalus -1)}}selected{{/if}}>1 dé — Blessé</option>
<option value="-2" {{#if (eq woundmalus -2)}}selected{{/if}}>2 dés — Gravement blessé</option>
<option value="-3" {{#if (eq woundmalus -3)}}selected{{/if}}>3 dés — Critique</option>
</select>
</div>
</div>
<div class="cde-roll-section">
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusAuspiciousDice" }}</label>
<input class="cde-roll-input" type="number" name="bonusauspiciousdice" min="0" max="15" value="{{bonusauspiciousdice}}" />
<select name="bonusauspiciousdice">
<option value="0" {{#if (eq bonusauspiciousdice 0)}}selected{{/if}}>0 dé-faste</option>
<option value="1" {{#if (eq bonusauspiciousdice 1)}}selected{{/if}}>1 dé-faste</option>
<option value="2" {{#if (eq bonusauspiciousdice 2)}}selected{{/if}}>2 dés-fastes</option>
<option value="3" {{#if (eq bonusauspiciousdice 3)}}selected{{/if}}>3 dés-fastes</option>
<option value="4" {{#if (eq bonusauspiciousdice 4)}}selected{{/if}}>4 dés-fastes</option>
<option value="5" {{#if (eq bonusauspiciousdice 5)}}selected{{/if}}>5 dés-fastes</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.TypeOfThrow" }}</label>

View File

@@ -50,18 +50,42 @@
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusMalus" }}</label>
<input class="cde-roll-input" type="number" name="bonusmalus" value="{{bonusmalus}}" />
<select name="bonusmalus">
<option value="-5" {{#if (eq bonusmalus -5)}}selected{{/if}}>5 dés</option>
<option value="-4" {{#if (eq bonusmalus -4)}}selected{{/if}}>4 dés</option>
<option value="-3" {{#if (eq bonusmalus -3)}}selected{{/if}}>3 dés</option>
<option value="-2" {{#if (eq bonusmalus -2)}}selected{{/if}}>2 dés</option>
<option value="-1" {{#if (eq bonusmalus -1)}}selected{{/if}}>1 dé</option>
<option value="0" {{#if (eq bonusmalus 0)}}selected{{/if}}>0 (aucun)</option>
<option value="1" {{#if (eq bonusmalus 1)}}selected{{/if}}>+1 dé</option>
<option value="2" {{#if (eq bonusmalus 2)}}selected{{/if}}>+2 dés</option>
<option value="3" {{#if (eq bonusmalus 3)}}selected{{/if}}>+3 dés</option>
<option value="4" {{#if (eq bonusmalus 4)}}selected{{/if}}>+4 dés</option>
<option value="5" {{#if (eq bonusmalus 5)}}selected{{/if}}>+5 dés</option>
</select>
</div>
</div>
<div class="cde-roll-section">
<div class="cde-roll-field">
<label>{{ localize "CDE.WoundMalus" }}</label>
<input class="cde-roll-input" type="number" name="woundmalus" value="{{woundmalus}}" />
<select name="woundmalus">
<option value="0" {{#if (eq woundmalus 0)}}selected{{/if}}>0 — Indemne</option>
<option value="-1" {{#if (eq woundmalus -1)}}selected{{/if}}>1 dé — Blessé</option>
<option value="-2" {{#if (eq woundmalus -2)}}selected{{/if}}>2 dés — Gravement blessé</option>
<option value="-3" {{#if (eq woundmalus -3)}}selected{{/if}}>3 dés — Critique</option>
</select>
</div>
<div class="cde-roll-field">
<label>{{ localize "CDE.BonusAuspiciousDice" }}</label>
<input class="cde-roll-input" type="number" name="bonusauspiciousdice" min="0" max="15" value="{{bonusauspiciousdice}}" />
<select name="bonusauspiciousdice">
<option value="0" {{#if (eq bonusauspiciousdice 0)}}selected{{/if}}>0 dé-faste</option>
<option value="1" {{#if (eq bonusauspiciousdice 1)}}selected{{/if}}>1 dé-faste</option>
<option value="2" {{#if (eq bonusauspiciousdice 2)}}selected{{/if}}>2 dés-fastes</option>
<option value="3" {{#if (eq bonusauspiciousdice 3)}}selected{{/if}}>3 dés-fastes</option>
<option value="4" {{#if (eq bonusauspiciousdice 4)}}selected{{/if}}>4 dés-fastes</option>
<option value="5" {{#if (eq bonusauspiciousdice 5)}}selected{{/if}}>5 dés-fastes</option>
</select>
</div>
</div>

View File

@@ -25,10 +25,10 @@
<div class="cde-stat-cell">
<span class="cde-stat-label">{{ localize "CDE.Discipline" }}</span>
<select name="system.discipline">
<option value="cinabre" {{#if (eq systemData.discipline "cinabre")}}selected{{/if}}>{{ localize "CDE.SchoolCinabre" }}</option>
<option value="internalcinnabar" {{#if (eq systemData.discipline "internalcinnabar")}}selected{{/if}}>{{ localize "CDE.SchoolCinabre" }}</option>
<option value="alchemy" {{#if (eq systemData.discipline "alchemy")}}selected{{/if}}>{{ localize "CDE.SchoolAlchemy" }}</option>
<option value="voie" {{#if (eq systemData.discipline "voie")}}selected{{/if}}>{{ localize "CDE.SchoolVoie" }}</option>
<option value="exorcisme" {{#if (eq systemData.discipline "exorcisme")}}selected{{/if}}>{{ localize "CDE.SchoolExorcisme" }}</option>
<option value="masteryoftheway" {{#if (eq systemData.discipline "masteryoftheway")}}selected{{/if}}>{{ localize "CDE.SchoolVoie" }}</option>
<option value="exorcism" {{#if (eq systemData.discipline "exorcism")}}selected{{/if}}>{{ localize "CDE.SchoolExorcisme" }}</option>
<option value="geomancy" {{#if (eq systemData.discipline "geomancy")}}selected{{/if}}>{{ localize "CDE.SchoolGeomancy" }}</option>
</select>
</div>