Compare commits

..

9 Commits

Author SHA1 Message Date
uberwald 4865cb9635 CLeanup old images 2026-07-01 17:21:48 +02:00
uberwald af72ca5ceb fix: overlapping "10" sur d10, hover, suppression dice-so-nice
Plage de des dans la feuille
- "10" superpose sur l'icone d10 (plus de colonne verticale)
- Passe de 40x56px a 40x40px (carre)
- Couleur hover (bordure + texte violets, glow)

Boutons fa-dice-d10 (magies, kung-fu, armes, initiative)
- Override CSS : affiche "10" + icone d10 SVG superposes
- Couleur hover sur le texte "10"

Suppression images dice-so-nice inutilisees
- src/ui/dice.js supprime (referencait des images manquantes)
- Import et appel registerDice retires de system.js

Divers
- Retire img-die-sm des templates skills/nghang (ecrasait la taille des plaques)
- Reduit padding/gaps de la grille de faces dans le chat
- Supprime overflow:hidden sur cde-roll-result
2026-07-01 17:21:12 +02:00
uberwald a5406ea901 Sync compendiums 2026-06-28 19:21:42 +02:00
uberwald 6b2ead8fbb feat: portée armes, récupération 3T, socket loksyu, import batch
Portée des armes
- Suppression des malus de portée (mediane/longue/extreme)
- Sélecteur filtré : seules les portées <= portée max de l'arme

Récupération (3 Trésors)
- Nouveau bouton dans l'onglet Trésors
- Jet basé sur l'aspect du Gardien Céleste
- Dé pair : +1 Hei Yang, +1 San
- Dé impair : +1 Hei Yin, +1 Zing
- Fenêtre de bonus dice pour les pouvoirs (Acupuncture...)
- Ignore les malus de palier San/Zing

Socket Loksyu/TinJi
- Les joueurs peuvent mettre à jour Loksyu/TinJi via socket
- Le MJ proxy les écritures (game.settings world = GM only)
- Opérations atomiques pour éviter les races conditions (roll simultanés)

Import batch
- 4 nouveaux migrators item (weapon/armor/sanhei/ingredient)
- magicOrder dans la migration character
- Confirmation en 2 clics avant l'import
- Détection des doublons avec le monde
- Progression en direct pendant l'import
- Dédoublonnage non-silencieux + flag _duplicate calculé en direct

UI
- Noms d'items en Signika (plus lisible qu'Averia)
- ASCII art au lancement dans la console
- Clés i18n manquantes ajoutées (BonusMalus, EnablePrompt, Material, Roll, ThrowType)

Fix divers
- Calcul puissance sort : utilise l'élément de la spécialité, pas celui de l'école
- preLocalizeConfig préserve labelelementkey pour la résolution d'aspect
- combat.js: guard undefined ids dans rollInitiative
2026-06-28 19:18:03 +02:00
uberwald 9c4f5948fd Cleanup suspicious pictures from the previous system. Redesign of icons, removal of unused pictures and background 2026-06-23 22:55:06 +02:00
uberwald 98c319767e Use socket to manage loksyu
Release Creation / build (release) Successful in 1m3s
2026-06-14 22:55:26 +02:00
uberwald 50038a13f9 Use socket to manage loksyu 2026-06-14 22:54:37 +02:00
uberwald 4cb8e26333 Correction sur police des equipements
Release Creation / build (release) Successful in 1m3s
2026-06-14 22:33:49 +02:00
uberwald faf8c4ca92 Import de masse des PNJ ancien système
Release Creation / build (release) Successful in 1m13s
2026-06-10 22:16:25 +02:00
178 changed files with 1600 additions and 1022 deletions
+1 -3
View File
@@ -11,9 +11,7 @@ Vous pouvez retrouver le nom de leurs auteurs respectifs sur ce site.
- 'carte_hk.jpg', d'après 'wahaha2005', est sous GNU Free Documentation License
version 1.2 ou toute version ultérieure publiée par la Free Software Foundation,
https://commons.wikimedia.org/wiki/File:Hong_Kong_18_Districts_Blank_Map.svg
- 'loksyu_roue_d_initiative.jpg' est une création originale de 'Darkwin'.
- La version 14.02 contenait des icones produites par David R.D. 'Mystery Man From Outerspace' Bercovici (merci à lui)
- Les versions suivantes contiennent des icones produites par LeRatierBretonnien
- Les icones produites par LeRatierBretonnien depuis games-icons.org, sous licence Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
Code Author :
- Developed by LeRatierBretonnien / www.uberwald.me
+280 -55
View File
@@ -1,4 +1,4 @@
/* -------------------------------------------
/* -------------------------------------------
Fonts
---------------------------------------------*/
@font-face {
@@ -396,22 +396,17 @@ section.npc .cde-neon-tabs .item.active {
.cde-tab-body {
flex: 1 1 0;
min-height: 0;
display: flex;
flex-direction: column;
padding: 12px;
background: #0d1520;
border: 1px solid #1a2436;
border-top: none;
border-radius: 0 0 8px 8px;
overflow: hidden;
overflow-y: auto;
}
.cde-tab-body .tab {
display: none;
flex: 1 1 0;
min-height: 0;
flex-direction: column;
gap: 12px;
overflow-y: auto;
}
.cde-tab-body .tab.active {
display: flex;
@@ -452,25 +447,12 @@ section.npc .cde-neon-tabs .item.active {
flex-direction: column;
}
.cde-notes-editor .editor {
flex: 1 1 auto;
flex: 1 1 0;
min-height: 200px;
height: 100%;
border-radius: 8px;
border: 1px solid #1a2436;
background: #101622;
}
.cde-notes-editor .editor .tox {
height: 100% !important;
min-height: 100% !important;
}
.cde-notes-editor .editor .tox-editor-container {
height: 100% !important;
min-height: 100% !important;
}
.cde-notes-editor .editor iframe {
height: 100% !important;
min-height: 100% !important;
}
.cde-technique-card {
border-left: 3px solid #ff3d5a;
background: rgba(16, 22, 34, 0.8);
@@ -2179,25 +2161,6 @@ section.npc .cde-neon-tabs .item.active {
.cde-magic-toggle:hover i {
color: #e2e8f4;
}
.cde-magic-order-btn {
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: #7d94b8;
border-radius: 3px;
flex-shrink: 0;
transition: color 0.12s, background 0.12s;
}
.cde-magic-order-btn i {
font-size: 9px;
}
.cde-magic-order-btn:hover {
color: #e2e8f4;
background: rgba(38, 56, 83, 0.25);
}
.cde-magic-specialities {
border-top: 1px solid #1a2436;
padding: 4px 0;
@@ -2813,7 +2776,7 @@ section.npc .cde-neon-tabs .item.active {
margin-top: -2px;
}
#pause > img {
content: url("/systems/fvtt-chroniques-de-l-etrange/images/wheel.webp");
content: url("/systems/fvtt-chroniques-de-l-etrange/images/logo_cde.webp");
height: 192px;
width: 192px;
top: -45px;
@@ -3433,7 +3396,6 @@ ol.item-list li.item .item-controls a.item-control:hover {
font-family: 'Share Tech Mono', monospace;
border-radius: 4px;
border: 1px solid #1a2436;
overflow: hidden;
}
.cde-roll-result .cde-rr-header {
display: flex;
@@ -3542,12 +3504,6 @@ ol.item-list li.item .item-controls a.item-control:hover {
color: var(--rr-accent, #e2e8f4);
text-shadow: 0 0 12px var(--rr-accent, transparent);
}
.cde-roll-result .cde-rr-hero .cde-rr-spell-power .cde-rr-spell-power-formula {
font-size: 10px;
color: #7d94b8;
margin: 2px 0;
white-space: nowrap;
}
.cde-roll-result .cde-rr-hero .cde-rr-spell-power .cde-rr-spell-power-label {
font-size: 9px;
font-weight: 700;
@@ -3666,8 +3622,8 @@ ol.item-list li.item .item-controls a.item-control:hover {
.cde-roll-result .cde-dice-grid {
display: grid;
grid-template-columns: repeat(10, 1fr);
gap: 3px;
padding: 8px 8px 6px;
gap: 1px;
padding: 6px 4px 4px;
border-top: 1px solid #1a2436;
}
.cde-roll-result .cde-dice-grid .cde-dice-cell {
@@ -3682,11 +3638,6 @@ ol.item-list li.item .item-controls a.item-control:hover {
color: #e2e8f4;
line-height: 1;
}
.cde-roll-result .cde-dice-grid .cde-dice-cell .cde-dice-plate {
width: 100%;
border: none;
opacity: 0.65;
}
.cde-initiative-prompt .cde-roll-field {
flex-direction: column;
align-items: stretch;
@@ -4499,3 +4450,277 @@ ol.item-list li.item .item-controls a.item-control:hover {
.cde-welcome-help-btn:hover {
filter: brightness(1.2);
}
i.fas.fa-dice-d10,
i.fa-solid.fa-dice-d10 {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.4em;
height: 1.4em;
font-size: inherit;
vertical-align: middle;
}
i.fas.fa-dice-d10:before,
i.fa-solid.fa-dice-d10:before {
content: "10";
font-family: "Averia", sans-serif;
font-size: 0.55em;
font-weight: 700;
color: #e2e8f4;
z-index: 1;
position: relative;
line-height: 1;
}
i.fas.fa-dice-d10:after,
i.fa-solid.fa-dice-d10:after {
content: "";
position: absolute;
inset: 0;
background: url('../../../icons/svg/d10-grey.svg') center / contain no-repeat;
opacity: 0.5;
}
a.cde-roll-trigger:hover i.fas.fa-dice-d10:after,
a.cde-roll-trigger:hover i.fa-solid.fa-dice-d10:after,
button:hover i.fas.fa-dice-d10:after,
button:hover i.fa-solid.fa-dice-d10:after {
opacity: 0.7;
}
.cde-roll-cell i.fas.fa-dice-d10 {
width: 20px;
height: 20px;
font-size: 16px;
}
.cde-dice-plate-css {
position: relative;
display: inline-flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 50px;
height: 70px;
background: #080c14;
border-radius: 8px;
border: 1px solid #1a2436;
color: #e2e8f4;
font-family: "Averia", sans-serif;
font-size: 24px;
font-weight: 700;
margin: 2px;
line-height: 1;
}
.cde-dice-plate-css::before {
content: attr(data-value);
display: block;
line-height: 1;
padding-top: 4px;
}
.cde-dice-plate-css::after {
content: "";
display: block;
width: 32px;
height: 32px;
background-image: url('../../../icons/svg/d10-grey.svg');
background-size: contain;
background-repeat: no-repeat;
background-position: center;
margin-top: 4px;
opacity: 0.85;
}
.cde-dice-plate-css.small {
width: 40px;
height: 40px;
font-size: 14px;
border-radius: 5px;
}
.cde-dice-plate-css.small::before {
position: relative;
z-index: 1;
padding-top: 0;
font-size: inherit;
}
.cde-dice-plate-css.small::after {
position: absolute;
inset: 0;
width: auto;
height: auto;
margin-top: 0;
border-radius: 5px;
}
.cde-dice-plate-css.large {
width: 60px;
height: 84px;
font-size: 30px;
}
.cde-dice-plate-css.large::after {
width: 38px;
height: 38px;
}
.cde-dice-plate-css.wood {
border-color: #41a436;
}
.cde-dice-plate-css.wood::before {
color: #7ad070;
}
.cde-dice-plate-css.fire {
border-color: #cd171a;
}
.cde-dice-plate-css.fire::before {
color: #ed5d60;
}
.cde-dice-plate-css.earth {
border-color: #a85747;
}
.cde-dice-plate-css.earth::before {
color: #cd9488;
}
.cde-dice-plate-css.metal {
border-color: #70706e;
}
.cde-dice-plate-css.metal::before {
color: #a3a3a1;
}
.cde-dice-plate-css.water {
border-color: #009fe2;
}
.cde-dice-plate-css.water::before {
color: #49c9ff;
}
.cde-roll-trigger:hover .cde-dice-plate-css.small,
.cde-die-cell:hover .cde-dice-plate-css.small {
border-color: #cc44ff;
box-shadow: 0 0 8px rgba(204, 68, 255, 0.4);
}
.cde-roll-trigger:hover .cde-dice-plate-css.small::before,
.cde-die-cell:hover .cde-dice-plate-css.small::before {
color: #cc44ff;
}
.cde-roll-trigger:hover .cde-dice-plate-css.small::after,
.cde-die-cell:hover .cde-dice-plate-css.small::after {
opacity: 1;
}
a.cde-roll-trigger:hover i.fas.fa-dice-d10::before,
a.cde-roll-trigger:hover i.fa-solid.fa-dice-d10::before,
button:hover i.fas.fa-dice-d10::before,
button:hover i.fa-solid.fa-dice-d10::before {
color: #cc44ff;
}
.cde-dice-plate.cde-dice-plate-css {
width: 24px;
min-width: 24px;
height: 36px;
font-size: 12px;
margin: 1px;
box-shadow: 0 0 0 1px rgba(38, 56, 83, 0.6), inset 0 0 0 1px rgba(226, 232, 244, 0.15);
}
.cde-dice-plate.cde-dice-plate-css::before {
padding-top: 1px;
font-size: 12px;
}
.cde-dice-plate.cde-dice-plate-css::after {
width: 14px;
height: 14px;
margin-top: 2px;
opacity: 0.9;
filter: brightness(0) saturate(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="0"] {
border-color: #70706e;
}
.cde-dice-plate.cde-dice-plate-css[data-value="0"]::before {
color: #afafae;
}
.cde-dice-plate.cde-dice-plate-css[data-value="0"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(0%) saturate(100%) hue-rotate(200deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="1"] {
border-color: #009fe2;
}
.cde-dice-plate.cde-dice-plate-css[data-value="1"]::before {
color: #62d1ff;
}
.cde-dice-plate.cde-dice-plate-css[data-value="1"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(200deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="2"] {
border-color: #41a436;
}
.cde-dice-plate.cde-dice-plate-css[data-value="2"]::before {
color: #8cd683;
}
.cde-dice-plate.cde-dice-plate-css[data-value="2"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(120deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="3"] {
border-color: #a85747;
}
.cde-dice-plate.cde-dice-plate-css[data-value="3"]::before {
color: #d4a49a;
}
.cde-dice-plate.cde-dice-plate-css[data-value="3"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(20deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="4"] {
border-color: #cd171a;
}
.cde-dice-plate.cde-dice-plate-css[data-value="4"]::before {
color: #ef7476;
}
.cde-dice-plate.cde-dice-plate-css[data-value="4"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(0deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="5"] {
border-color: #70706e;
}
.cde-dice-plate.cde-dice-plate-css[data-value="5"]::before {
color: #afafae;
}
.cde-dice-plate.cde-dice-plate-css[data-value="5"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(0%) saturate(100%) hue-rotate(200deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="6"] {
border-color: #009fe2;
}
.cde-dice-plate.cde-dice-plate-css[data-value="6"]::before {
color: #62d1ff;
}
.cde-dice-plate.cde-dice-plate-css[data-value="6"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(200deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="7"] {
border-color: #41a436;
}
.cde-dice-plate.cde-dice-plate-css[data-value="7"]::before {
color: #8cd683;
}
.cde-dice-plate.cde-dice-plate-css[data-value="7"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(120deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="8"] {
border-color: #a85747;
}
.cde-dice-plate.cde-dice-plate-css[data-value="8"]::before {
color: #d4a49a;
}
.cde-dice-plate.cde-dice-plate-css[data-value="8"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(20deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="9"] {
border-color: #cd171a;
}
.cde-dice-plate.cde-dice-plate-css[data-value="9"]::before {
color: #ef7476;
}
.cde-dice-plate.cde-dice-plate-css[data-value="9"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(0deg) brightness(100%);
}
.cde-dice-plate.cde-dice-plate-css[data-value="10"] {
border-color: #cd171a;
}
.cde-dice-plate.cde-dice-plate-css[data-value="10"]::before {
color: #ef7476;
font-size: 13px;
}
.cde-dice-plate.cde-dice-plate-css[data-value="10"]::after {
filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(0deg) brightness(100%);
}
+246 -56
View File
@@ -1,5 +1,5 @@
/* -------------------------------------------
/* -------------------------------------------
Fonts
---------------------------------------------*/
@@ -381,22 +381,17 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
.cde-tab-body {
flex: 1 1 0;
min-height: 0;
display: flex;
flex-direction: column;
padding: @cde-gap;
background: @cde-surface2;
border: 1px solid @cde-border;
border-top: none;
border-radius: 0 0 @cde-radius @cde-radius;
overflow: hidden;
overflow-y: auto;
.tab {
display: none;
flex: 1 1 0;
min-height: 0;
flex-direction: column;
gap: @cde-gap;
overflow-y: auto;
}
.tab.active {
@@ -450,26 +445,11 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
flex-direction: column;
.editor {
flex: 1 1 auto;
flex: 1 1 0;
min-height: 200px;
height: 100%;
border-radius: @cde-radius;
border: 1px solid @cde-border;
background: @cde-surface;
// Force TinyMCE to fill the container
.tox {
height: 100% !important;
min-height: 100% !important;
}
.tox-editor-container {
height: 100% !important;
min-height: 100% !important;
}
iframe {
height: 100% !important;
min-height: 100% !important;
}
}
}
@@ -2253,23 +2233,6 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
&:hover i { color: @cde-text; }
}
.cde-magic-order-btn {
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: @cde-muted;
border-radius: 3px;
flex-shrink: 0;
transition: color 0.12s, background 0.12s;
i { font-size: 9px; }
&:hover { color: @cde-text; background: fade(@cde-border-hi, 25%); }
}
// Specialities list
.cde-magic-specialities {
border-top: 1px solid @cde-border;
@@ -2844,7 +2807,7 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
}
#pause > img {
content: url("/systems/fvtt-chroniques-de-l-etrange/images/wheel.webp");
content: url("/systems/fvtt-chroniques-de-l-etrange/images/logo_cde.webp");
height: 192px;
width: 192px;
top: -45px;
@@ -3473,7 +3436,6 @@ ol.item-list {
font-family: 'Share Tech Mono', monospace;
border-radius: 4px;
border: 1px solid @cde-border;
overflow: hidden;
// ---- Header ----
.cde-rr-header {
@@ -3599,13 +3561,6 @@ ol.item-list {
text-shadow: 0 0 12px var(--rr-accent, transparent);
}
.cde-rr-spell-power-formula {
font-size: 10px;
color: @cde-muted;
margin: 2px 0;
white-space: nowrap;
}
.cde-rr-spell-power-label {
font-size: 9px;
font-weight: 700;
@@ -3740,8 +3695,8 @@ ol.item-list {
.cde-dice-grid {
display: grid;
grid-template-columns: repeat(10, 1fr);
gap: 3px;
padding: 8px 8px 6px;
gap: 1px;
padding: 6px 4px 4px;
border-top: 1px solid @cde-border;
.cde-dice-cell {
@@ -3757,11 +3712,6 @@ ol.item-list {
line-height: 1;
}
.cde-dice-plate {
width: 100%;
border: none;
opacity: 0.65;
}
}
}
}
@@ -4698,3 +4648,243 @@ ol.item-list {
filter: brightness(1.2);
}
}
// ============================================================
// Override fa-dice-d10 to show Foundry d10 SVG + "10" overlay
// ============================================================
i.fas.fa-dice-d10,
i.fa-solid.fa-dice-d10 {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.4em;
height: 1.4em;
font-size: inherit;
vertical-align: middle;
// Replace FA glyph with "10" text
&:before {
content: "10";
font-family: "Averia", sans-serif;
font-size: 0.55em;
font-weight: 700;
color: @cde-text;
z-index: 1;
position: relative;
line-height: 1;
}
// d10 SVG behind the text
&:after {
content: "";
position: absolute;
inset: 0;
background: url('../../../icons/svg/d10-grey.svg') center / contain no-repeat;
opacity: 0.5;
}
}
// Hover effect trickle-up: the parent hover changes background,
// the ::after inherits opacity change via the wrapper
a.cde-roll-trigger:hover i.fas.fa-dice-d10,
a.cde-roll-trigger:hover i.fa-solid.fa-dice-d10,
button:hover i.fas.fa-dice-d10,
button:hover i.fa-solid.fa-dice-d10 {
&:after { opacity: 0.7; }
}
// Nested in NPC roll cell — keep the 24x24 size
.cde-roll-cell i.fas.fa-dice-d10 {
width: 20px;
height: 20px;
font-size: 16px;
}
// ============================================================
// Dice plate - CSS-only dice display (chiffre + dé SVG)
// Utilise les icônes de base de FoundryVTT : icons/svg/d10-grey.svg
// ============================================================
.cde-dice-plate-css {
position: relative;
display: inline-flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 50px;
height: 70px;
background: @cde-bg;
border-radius: @cde-radius;
border: 1px solid @cde-border;
color: @cde-text;
font-family: "Averia", sans-serif;
font-size: 24px;
font-weight: 700;
margin: 2px;
line-height: 1;
&::before {
content: attr(data-value);
display: block;
line-height: 1;
padding-top: 4px;
}
&::after {
content: "";
display: block;
width: 32px;
height: 32px;
background-image: url('../../../icons/svg/d10-grey.svg');
background-size: contain;
background-repeat: no-repeat;
background-position: center;
margin-top: 4px;
opacity: 0.85;
}
// Variantes de taille
&.small {
width: 40px;
height: 40px;
font-size: 14px;
border-radius: @cde-radius-sm;
&::before {
position: relative;
z-index: 1;
padding-top: 0;
font-size: inherit;
}
&::after {
position: absolute;
inset: 0;
width: auto;
height: auto;
margin-top: 0;
border-radius: @cde-radius-sm;
}
}
&.large {
width: 60px;
height: 84px;
font-size: 30px;
&::after {
width: 38px;
height: 38px;
}
}
// Couleurs par élément Wu Xing
&.wood { border-color: @wu-green; &::before { color: lighten(@wu-green, 20%); } }
&.fire { border-color: @wu-red; &::before { color: lighten(@wu-red, 20%); } }
&.earth { border-color: @wu-brown; &::before { color: lighten(@wu-brown, 20%); } }
&.metal { border-color: @wu-gray; &::before { color: lighten(@wu-gray, 20%); } }
&.water { border-color: @wu-blue; &::before { color: lighten(@wu-blue, 20%); } }
}
// Hover effect for sheet dice plates
.cde-roll-trigger:hover .cde-dice-plate-css.small,
.cde-die-cell:hover .cde-dice-plate-css.small {
border-color: @cde-supernatural;
box-shadow: 0 0 8px fade(@cde-supernatural, 40%);
&::before { color: @cde-supernatural; }
&::after { opacity: 1; }
}
// Hover color for the "10" text on fa-dice-d10 override
a.cde-roll-trigger:hover i.fas.fa-dice-d10::before,
a.cde-roll-trigger:hover i.fa-solid.fa-dice-d10::before,
button:hover i.fas.fa-dice-d10::before,
button:hover i.fa-solid.fa-dice-d10::before {
color: @cde-supernatural;
}
// ============================================================
// Dice plate specific styling (for chat messages)
// Compact dice with colored borders per value + colored die icon
// ============================================================
.cde-dice-plate.cde-dice-plate-css {
width: 24px;
min-width: 24px;
height: 36px;
font-size: 12px;
margin: 1px;
box-shadow:
0 0 0 1px fade(@cde-border-hi, 60%),
inset 0 0 0 1px fade(@cde-text, 15%);
&::before {
padding-top: 1px;
font-size: 12px;
}
&::after {
width: 14px;
height: 14px;
margin-top: 2px;
opacity: 0.9;
filter: brightness(0) saturate(100%);
}
// Couleur par valeur de dé (0-10) + couleur du SVG
&[data-value="0"] {
border-color: @wu-gray;
&::before { color: lighten(@wu-gray, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(0%) saturate(100%) hue-rotate(200deg) brightness(100%); }
}
&[data-value="1"] {
border-color: @wu-blue;
&::before { color: lighten(@wu-blue, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(200deg) brightness(100%); }
}
&[data-value="2"] {
border-color: @wu-green;
&::before { color: lighten(@wu-green, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(120deg) brightness(100%); }
}
&[data-value="3"] {
border-color: @wu-brown;
&::before { color: lighten(@wu-brown, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(20deg) brightness(100%); }
}
&[data-value="4"] {
border-color: @wu-red;
&::before { color: lighten(@wu-red, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(0deg) brightness(100%); }
}
&[data-value="5"] {
border-color: @wu-gray;
&::before { color: lighten(@wu-gray, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(0%) saturate(100%) hue-rotate(200deg) brightness(100%); }
}
&[data-value="6"] {
border-color: @wu-blue;
&::before { color: lighten(@wu-blue, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(200deg) brightness(100%); }
}
&[data-value="7"] {
border-color: @wu-green;
&::before { color: lighten(@wu-green, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(120deg) brightness(100%); }
}
&[data-value="8"] {
border-color: @wu-brown;
&::before { color: lighten(@wu-brown, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(20deg) brightness(100%); }
}
&[data-value="9"] {
border-color: @wu-red;
&::before { color: lighten(@wu-red, 25%); }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(0deg) brightness(100%); }
}
&[data-value="10"] {
border-color: @wu-red;
&::before { color: lighten(@wu-red, 25%); font-size: 13px; }
&::after { filter: brightness(0) saturate(100%) invert(75%) sepia(24%) saturate(1200%) hue-rotate(0deg) brightness(100%); }
}
}
+375 -95
View File
@@ -311,6 +311,89 @@ function migrateSupernaturalItem(oldItem) {
}
};
}
function migrateWeaponItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "weapon",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
hasSpeciality: Boolean(s.hasSpeciality),
weaponType: s.weaponType || "melee",
material: s.material ?? "",
damageAspect: elementKey(s.damageAspect ?? ""),
damageBase: Number(s.damageBase ?? 0),
range: s.range || "contact",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? ""
}
};
}
function migrateArmorItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "armor",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
protectionValue: Number(s.protectionValue ?? 0),
domain: s.domain ?? "",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? ""
}
};
}
function migrateSanheiItem(oldItem) {
const s = oldItem.system ?? {};
const props = s.properties ?? {};
const propSchema = (p) => ({
name: p?.name ?? "",
heiCost: Number(p?.heiCost ?? 0),
heiType: heiKey(p?.heiType ?? ""),
description: p?.description ?? ""
});
return {
name: oldItem.name,
type: "sanhei",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
heiType: heiKey(s.heiType ?? ""),
properties: {
prop1: propSchema(props.prop1),
prop2: propSchema(props.prop2),
prop3: propSchema(props.prop3)
},
notes: s.notes ?? ""
}
};
}
function migrateIngredientItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "ingredient",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
school: s.school ?? "all",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? ""
}
};
}
function migrateItem(oldItem) {
switch (oldItem.type) {
case "item":
@@ -321,6 +404,14 @@ function migrateItem(oldItem) {
return migrateSpellItem(oldItem);
case "supernatural":
return migrateSupernaturalItem(oldItem);
case "weapon":
return migrateWeaponItem(oldItem);
case "armor":
return migrateArmorItem(oldItem);
case "sanhei":
return migrateSanheiItem(oldItem);
case "ingredient":
return migrateIngredientItem(oldItem);
default:
return migrateEquipmentItem({ ...oldItem, type: "item" });
}
@@ -394,6 +485,7 @@ function migrateCharacter(old) {
resources,
component,
magics,
magicOrder: [],
threetreasures,
experience: {
value: Number(s.experience?.value ?? 0),
@@ -471,10 +563,12 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
icon: "fas fa-file-import",
resizable: false
},
position: { width: 560, height: "auto" },
position: { width: 600, height: "auto" },
actions: {
clearFiles: _CDEMigrationApp.#clearFiles,
doImport: _CDEMigrationApp.#doImport
doImport: _CDEMigrationApp.#doImport,
confirmImport: _CDEMigrationApp.#confirmImport,
cancelImport: _CDEMigrationApp.#cancelImport
}
};
static PARTS = {
@@ -484,13 +578,28 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
#pending = [];
/** @type {string[]} - error messages per file */
#errors = [];
/** @type {"idle"|"confirm"|"importing"} */
#importState = "idle";
/** @type {number} - actors created so far (during importing) */
#progress = 0;
async _prepareContext(options) {
const enrichDuplicate = (a) => ({
...a,
_duplicate: game.actors?.getName(a.name) !== null
});
const pending = this.#pending.map(enrichDuplicate);
const duplicateCount = pending.filter((a) => a._duplicate).length;
return {
pending: this.#pending,
pending,
errors: this.#errors,
hasPending: this.#pending.length > 0,
hasErrors: this.#errors.length > 0,
count: this.#pending.length
hasDuplicates: duplicateCount > 0,
duplicateCount,
count: this.#pending.length,
importState: this.#importState,
progress: this.#progress,
total: this.#pending.length
};
}
/** After render, wire up the file input. */
@@ -528,37 +637,59 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
const actors = parseLegacyJson(text);
for (const actor of actors) {
actor._srcFile = file.name;
if (!this.#pending.some((p) => p.name === actor.name)) {
this.#pending.push(actor);
if (this.#pending.some((p) => p.name === actor.name)) {
this.#errors.push(`\xAB ${actor.name} \xBB ignor\xE9 (nom d\xE9j\xE0 dans la liste d'attente, fichier \xAB ${file.name} \xBB)`);
continue;
}
this.#pending.push(actor);
}
} catch (err) {
this.#errors.push(game.i18n.format("CDE.MigrationErrorParse", { file: file.name, error: err.message }));
}
}
this.#importState = "idle";
this.render();
}
static async #clearFiles() {
this.#pending = [];
this.#errors = [];
this.#importState = "idle";
this.#progress = 0;
this.render();
}
/** First click: switch to confirmation state instead of importing immediately. */
static async #doImport() {
if (!this.#pending.length) return;
this.#importState = "confirm";
this.render();
}
/** Second click: actually perform the import. */
static async #confirmImport() {
if (!this.#pending.length) return;
this.#importState = "importing";
this.#progress = 0;
this.render();
const total = this.#pending.length;
const created = [];
const failed = [];
for (const data of this.#pending) {
for (let i = 0; i < total; i++) {
const data = this.#pending[i];
try {
const { _srcFile, ...actorData } = data;
const actor = await Actor.create(actorData);
created.push(actor.name);
} catch (err) {
failed.push(`${data.name}: ${err.message}`);
console.error(`CHRONIQUESDELETRANGE | Migration failed for "${data.name}":`, err);
console.error(`CHRONIQUESDELETRANGE | Import failed for "${data.name}":`, err);
}
this.#progress = i + 1;
const progEl = this.element?.querySelector(".cde-migration-progress-count");
if (progEl) progEl.textContent = `${this.#progress}/${total}`;
}
this.#pending = [];
this.#errors = failed;
this.#importState = "idle";
this.#progress = 0;
this.render();
if (created.length) {
ui.notifications.info(
@@ -571,6 +702,10 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
);
}
}
static async #cancelImport() {
this.#importState = "idle";
this.render();
}
};
// src/config/settings.js
@@ -669,15 +804,6 @@ function preLocalizeConfig() {
// src/config/runtime.js
function configureRuntime() {
CONFIG.Actor.compendiumBanner = "/systems/fvtt-chroniques-de-l-etrange/images/banners/actor-banner.webp";
CONFIG.Adventure.compendiumBanner = "/systems/fvtt-chroniques-de-l-etrange/images/banners/adventure-banner.webp";
CONFIG.Cards.compendiumBanner = "ui/banners/cards-banner.webp";
CONFIG.Item.compendiumBanner = "/systems/fvtt-chroniques-de-l-etrange/images/banners/item-banner.webp";
CONFIG.JournalEntry.compendiumBanner = "/systems/fvtt-chroniques-de-l-etrange/images/banners/journalentry-banner.webp";
CONFIG.Macro.compendiumBanner = "ui/banners/macro-banner.webp";
CONFIG.Playlist.compendiumBanner = "ui/banners/playlist-banner.webp";
CONFIG.RollTable.compendiumBanner = "ui/banners/rolltable-banner.webp";
CONFIG.Scene.compendiumBanner = "/systems/fvtt-chroniques-de-l-etrange/images/banners/scene-banner.webp";
}
// src/data/actors/character.js
@@ -1139,53 +1265,6 @@ var CDEItem = class extends Item {
}
};
// src/ui/dice.js
var DIGIT_LABELS = [
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-1.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-2.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-3.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-4.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-5.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-6.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-7.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-8.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-9.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/digit/d10-10.webp"
];
var CLASSIC_LABELS = [
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-1.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-2.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-3.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-4.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-5.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-6.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-7.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-8.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-9.webp",
"systems/fvtt-chroniques-de-l-etrange/images/dice-so-nice/d10-10.webp"
];
function registerDice() {
Hooks.once("diceSoNiceReady", (dice3d) => {
dice3d.addColorset(
{
name: "cde",
description: "CdE",
foreground: "#000000",
background: "#ffffff",
edge: "#ffffff",
font: "DeliusUnicase",
texture: "ice",
material: "plastic"
},
"preferred"
);
dice3d.addSystem({ id: "fvtt-chroniques-de-l-etrangedigit", name: "Chroniques de l'\xE9trange digits" }, "preferred");
dice3d.addDicePreset({ type: "d10", labels: DIGIT_LABELS, system: "fvtt-chroniques-de-l-etrangedigit" });
dice3d.addSystem({ id: "fvtt-chroniques-de-l-etrange", name: "Chroniques de l'\xE9trange" }, "preferred");
dice3d.addDicePreset({ type: "d10", labels: CLASSIC_LABELS, system: "fvtt-chroniques-de-l-etrange" });
});
}
// src/ui/helpers.js
function registerHandlebarsHelpers() {
const { Handlebars } = globalThis;
@@ -1426,6 +1505,7 @@ async function rollInitiativeNPC(actor) {
}
// src/ui/apps/singletons.js
var SOCKET_CHANNEL = `system.${SYSTEM_ID}`;
function getLoksyuData() {
return game.settings.get(SYSTEM_ID, "loksyuData") ?? {
wood: { yin: 0, yang: 0 },
@@ -1435,16 +1515,75 @@ function getLoksyuData() {
water: { yin: 0, yang: 0 }
};
}
async function setLoksyuData(data) {
async function writeLoksyuData(data) {
await game.settings.set(SYSTEM_ID, "loksyuData", data);
Hooks.callAll("cde:loksyuUpdated", data);
}
async function writeTinjiValue(value) {
value = Math.max(0, value);
await game.settings.set(SYSTEM_ID, "tinjiData", value);
Hooks.callAll("cde:tinjiUpdated", value);
}
async function setLoksyuData(data) {
if (game.user.isGM) return writeLoksyuData(data);
game.socket.emit(SOCKET_CHANNEL, { action: "setLoksyuData", data });
}
function getTinjiValue() {
return game.settings.get(SYSTEM_ID, "tinjiData") ?? 0;
}
async function setTinjiValue(value) {
await game.settings.set(SYSTEM_ID, "tinjiData", Math.max(0, value));
Hooks.callAll("cde:tinjiUpdated", Math.max(0, value));
if (game.user.isGM) return writeTinjiValue(value);
game.socket.emit(SOCKET_CHANNEL, { action: "setTinjiValue", value });
}
function requestLoksyuDraw(aspect, order) {
game.socket.emit(SOCKET_CHANNEL, { action: "loksyuDraw", aspect, order });
}
function requestTinjiSpend() {
game.socket.emit(SOCKET_CHANNEL, { action: "tinjiSpend" });
}
function registerSingletonSocket() {
game.socket.on(SOCKET_CHANNEL, async (payload) => {
if (!game.user.isGM) return;
switch (payload.action) {
case "setLoksyuData":
await writeLoksyuData(payload.data);
break;
case "setTinjiValue":
await writeTinjiValue(payload.value);
break;
case "updateLoksyuFromRoll":
await updateLoksyuFromRoll(payload.activeAspect, payload.faces);
break;
case "updateTinjiFromRoll":
await updateTinjiFromRoll(payload.delta);
break;
case "loksyuDraw": {
const data = getLoksyuData();
const entry = data[payload.aspect] ?? { yin: 0, yang: 0 };
const order = payload.order ?? "yang-first";
if (order === "yin-first") {
if (entry.yin > 0) entry.yin--;
else entry.yang--;
} else if (order === "balanced") {
if (entry.yin > entry.yang) entry.yin--;
else if (entry.yang > entry.yin) entry.yang--;
else if (entry.yang > 0) entry.yang--;
else entry.yin--;
} else {
if (entry.yang > 0) entry.yang--;
else entry.yin--;
}
data[payload.aspect] = entry;
await writeLoksyuData(data);
break;
}
case "tinjiSpend": {
const cur = getTinjiValue();
if (cur > 0) await writeTinjiValue(cur - 1);
break;
}
}
});
}
async function updateLoksyuFromRoll(activeAspect, faces) {
const cycle = WU_XING_CYCLE[activeAspect];
@@ -1455,18 +1594,23 @@ async function updateLoksyuFromRoll(activeAspect, faces) {
const yinCount = faces[yinFace] ?? 0;
const yangCount = faces[yangFace] ?? 0;
if (yinCount === 0 && yangCount === 0) return;
const data = getLoksyuData();
const current = data[lokAspect] ?? { yin: 0, yang: 0 };
data[lokAspect] = {
yin: (current.yin ?? 0) + yinCount,
yang: (current.yang ?? 0) + yangCount
};
await setLoksyuData(data);
if (game.user.isGM) {
const data = getLoksyuData();
const current = data[lokAspect] ?? { yin: 0, yang: 0 };
data[lokAspect] = { yin: (current.yin ?? 0) + yinCount, yang: (current.yang ?? 0) + yangCount };
await writeLoksyuData(data);
} else {
game.socket.emit(SOCKET_CHANNEL, { action: "updateLoksyuFromRoll", activeAspect, faces });
}
}
async function updateTinjiFromRoll(count) {
if (!count || count <= 0) return;
const current = getTinjiValue();
await setTinjiValue(current + count);
if (game.user.isGM) {
const current = getTinjiValue();
await writeTinjiValue(current + count);
} else {
game.socket.emit(SOCKET_CHANNEL, { action: "updateTinjiFromRoll", delta: count });
}
}
// src/ui/rolling.js
@@ -1482,12 +1626,13 @@ var LABELELEMENT_TO_ASPECT = {
"CDE.Fire": "fire",
"CDE.Wood": "wood"
};
var RANGE_MALUS = {
contact: 0,
courte: 0,
mediane: -1,
longue: -2,
extreme: -3
var RANGE_ORDER = ["contact", "courte", "mediane", "longue", "extreme"];
var RANGE_LABELS = {
contact: "CDE.RangeContact",
courte: "CDE.RangeCourte",
mediane: "CDE.RangeMediane",
longue: "CDE.RangeLongue",
extreme: "CDE.RangeExtreme"
};
var WEAPON_TYPE_SKILL = {
melee: "kungfu",
@@ -1587,6 +1732,13 @@ async function showMagicPrompt(params) {
});
}
async function showWeaponPrompt(params) {
const maxRange = params.effectiverange ?? "contact";
const maxIdx = RANGE_ORDER.indexOf(maxRange);
const validRanges = RANGE_ORDER.slice(0, maxIdx + 1).map((r) => ({
value: r,
label: RANGE_LABELS[r],
selected: r === maxRange
}));
return showRollPrompt({
title: params.title,
template: WEAPON_PROMPT_TEMPLATE,
@@ -1600,6 +1752,7 @@ async function showWeaponPrompt(params) {
weaponskill: params.weaponskill ?? "kungfu",
aspect: Number(params.aspect ?? 0),
effectiverange: params.effectiverange ?? "contact",
validRanges,
bonusmalus: params.bonusmalus ?? 0,
woundmalus: params.woundmalus ?? 0,
bonusauspiciousdice: params.bonusauspiciousdice ?? 0,
@@ -1756,14 +1909,13 @@ async function rollForActor(actor, rollKey) {
const wpSkillDice = sys.skills?.[wpChosenSkill]?.value ?? 0;
const wpAspFinal = Number(wParams.aspect ?? wpAspectIdx);
const wpAspectDice = sys.aspect[ASPECT_NAMES[wpAspFinal]]?.value ?? 0;
const wpRangeMalus = RANGE_MALUS[wParams.effectiverange ?? "contact"] ?? 0;
const wpBonusMalus = Number(wParams.bonusmalus ?? 0);
const wpWoundMalus = Number(wParams.woundmalus ?? 0);
const wpBonusAusp = Number(wParams.bonusauspiciousdice ?? 0);
const wpThrowMode = Number(wParams.typeofthrow ?? 0);
const wpDamageBase = wpItem.system.damageBase ?? 0;
const wpSpecialtyBonus = wpItem.system.hasSpeciality ? 1 : 0;
const wpTotalDice = wpSkillDice + wpAspectDice + wpRangeMalus + wpBonusMalus - wpWoundMalus + wpSpecialtyBonus;
const wpTotalDice = wpSkillDice + wpAspectDice + wpBonusMalus - wpWoundMalus + wpSpecialtyBonus;
if (wpTotalDice <= 0) {
ui.notifications.warn(game.i18n.localize("CDE.Error0"));
return;
@@ -1775,7 +1927,6 @@ async function rollForActor(actor, rollKey) {
const wpResults = computeWuXingResults(wpFaces, wpAspectName, wpBonusAusp);
if (!wpResults) return;
const wpModParts = [];
if (wpRangeMalus !== 0) wpModParts.push(`${wpRangeMalus} ${game.i18n.localize("CDE.RangePenalty")}`);
if (wpBonusMalus !== 0) wpModParts.push(`${wpBonusMalus > 0 ? "+" : ""}${wpBonusMalus} ${game.i18n.localize("CDE.BonusMalus")}`);
if (wpWoundMalus !== 0) wpModParts.push(`-${wpWoundMalus} ${game.i18n.localize("CDE.WoundMalus")}`);
if (wpBonusAusp !== 0) wpModParts.push(`+${wpBonusAusp} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`);
@@ -2077,7 +2228,8 @@ var CDECharacterSheet = class _CDECharacterSheet extends CDEBaseActorSheet {
classes: ["character"],
actions: {
moveMagicUp: _CDECharacterSheet.#onMoveMagicUp,
moveMagicDown: _CDECharacterSheet.#onMoveMagicDown
moveMagicDown: _CDECharacterSheet.#onMoveMagicDown,
recovery: _CDECharacterSheet.#onRecovery
}
};
static PARTS = {
@@ -2247,6 +2399,102 @@ var CDECharacterSheet = class _CDECharacterSheet extends CDEBaseActorSheet {
[order[idx], order[idx + 1]] = [order[idx + 1], order[idx]];
await this.document.update({ "system.magicOrder": order });
}
static async #onRecovery(event, target) {
const actor = this.document;
const sys = actor.system;
const guardian = Number(sys.guardian ?? 0);
if (guardian < 1 || guardian > 5) {
ui.notifications.warn(game.i18n.localize("CDE.RecoveryNoGuardian"));
return;
}
const aspectName = ASPECT_NAMES[guardian - 1];
const aspectLabel = game.i18n.localize(ASPECT_LABELS[aspectName]);
const aspectValue = sys.aspect?.[aspectName]?.value ?? 0;
if (aspectValue <= 0) {
ui.notifications.warn(game.i18n.localize("CDE.RecoveryNoAspect"));
return;
}
const RECOVERY_PROMPT = `systems/${SYSTEM_ID}/templates/form/cde-recovery-prompt.html`;
const content = await foundry.applications.handlebars.renderTemplate(RECOVERY_PROMPT, {
basedice: aspectValue
});
const params = await foundry.applications.api.DialogV2.prompt({
window: { title: game.i18n.localize("CDE.Recovery") },
content,
rejectClose: false,
ok: {
label: game.i18n.localize("CDE.Validate"),
callback: (event2, button, dialog) => {
const root = dialog.element ?? dialog;
return { bonusdice: Number(root.querySelector("[name=bonusdice]")?.value ?? 0) };
}
}
});
if (params === void 0) return;
const totalDice = aspectValue + Math.max(0, Number(params.bonusdice ?? 0));
const roll = new Roll(`${totalDice}d10`);
await roll.evaluate();
const results = roll.dice[0].results.map((r) => r.result);
const evenCount = results.filter((r) => r % 2 === 0).length;
const oddCount = results.filter((r) => r % 2 !== 0).length;
const cap = (max) => max > 0 ? max : Infinity;
const heiYang = Math.min(
(sys.threetreasures?.heiyang?.value ?? 0) + evenCount,
cap(sys.threetreasures?.heiyang?.max)
);
const heiYin = Math.min(
(sys.threetreasures?.heiyin?.value ?? 0) + oddCount,
cap(sys.threetreasures?.heiyin?.max)
);
const san = Math.min(
(sys.threetreasures?.dicelevel?.level0d?.san?.value ?? 0) + evenCount,
cap(sys.threetreasures?.dicelevel?.level0d?.san?.max)
);
const zing = Math.min(
(sys.threetreasures?.dicelevel?.level0d?.zing?.value ?? 0) + oddCount,
cap(sys.threetreasures?.dicelevel?.level0d?.zing?.max)
);
await actor.update({
"system.threetreasures.heiyang.value": heiYang,
"system.threetreasures.heiyin.value": heiYin,
"system.threetreasures.dicelevel.level0d.san.value": san,
"system.threetreasures.dicelevel.level0d.zing.value": zing
});
const rollLabel = `${game.i18n.localize("CDE.Recovery")} \u2014 ${aspectLabel}`;
const diceStr = results.join(" \xB7 ");
const typeOfThrow = Number(sys.prefs?.typeofthrow?.choice ?? 0);
const ROLL_MODES2 = ["roll", "gmroll", "blindroll", "selfroll"];
const rollMode = ROLL_MODES2[typeOfThrow] ?? "roll";
await ChatMessage.create({
user: game.user.id,
speaker: ChatMessage.getSpeaker({ actor }),
content: `
<div class="cde-chat-recovery">
<div class="cde-chat-recovery-header">
<img src="${ASPECT_ICONS[aspectName]}" class="cde-chat-recovery-icon" alt="${aspectLabel}"/>
<span class="cde-chat-recovery-title">${rollLabel}</span>
</div>
<div class="cde-chat-recovery-dice">
<span class="cde-chat-recovery-dice-label">${totalDice}d10</span>
<span class="cde-chat-recovery-dice-results">${diceStr}</span>
</div>
<div class="cde-chat-recovery-results">
<div class="cde-chat-recovery-even">
<span class="cde-chat-recovery-count">${evenCount}</span>
<span><strong>${game.i18n.localize("CDE.RecoveryEvenLabel")}</strong></span>
<span>\u2192 +${evenCount} Hei Yang, +${evenCount} San</span>
</div>
<div class="cde-chat-recovery-odd">
<span class="cde-chat-recovery-count">${oddCount}</span>
<span><strong>${game.i18n.localize("CDE.RecoveryOddLabel")}</strong></span>
<span>\u2192 +${oddCount} Hei Yin, +${oddCount} Zing</span>
</div>
</div>
</div>`,
rolls: [roll],
rollMode
});
}
#bindComponentRandomize() {
const btn = this.element?.querySelector("[data-action='randomize-component']");
if (!btn) return;
@@ -2550,6 +2798,8 @@ var CDELoksyuApp = class _CDELoksyuApp extends foundry.applications.api.Handleba
};
/** @type {Function|null} bound hook handler */
_updateHook = null;
/** @type {Function|null} updateSetting hook handler (for socket-propagated writes) */
_settingHook = null;
/** Singleton accessor — open or bring to front */
static open() {
const existing = Array.from(foundry.applications.instances.values()).find(
@@ -2584,13 +2834,24 @@ var CDELoksyuApp = class _CDELoksyuApp extends foundry.applications.api.Handleba
_onRender(context, options) {
super._onRender(context, options);
this.#bindInputs();
this._updateHook = Hooks.on("cde:loksyuUpdated", () => this.render());
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:loksyuUpdated", () => this.render());
}
if (!this._settingHook) {
this._settingHook = Hooks.on("updateSetting", (setting) => {
if (setting.key === `${SYSTEM_ID}.loksyuData`) this.render();
});
}
}
_onClose(options) {
if (this._updateHook !== null) {
Hooks.off("cde:loksyuUpdated", this._updateHook);
this._updateHook = null;
}
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook);
this._settingHook = null;
}
super._onClose(options);
}
#bindInputs() {
@@ -2659,6 +2920,8 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
};
/** @type {Function|null} */
_updateHook = null;
/** @type {Function|null} */
_settingHook = null;
static open() {
const existing = Array.from(foundry.applications.instances.values()).find(
(app2) => app2 instanceof _CDETinjiApp
@@ -2680,13 +2943,24 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
_onRender(context, options) {
super._onRender(context, options);
this.#bindDirectInput();
this._updateHook = Hooks.on("cde:tinjiUpdated", () => this.render());
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:tinjiUpdated", () => this.render());
}
if (!this._settingHook) {
this._settingHook = Hooks.on("updateSetting", (setting) => {
if (setting.key === `${SYSTEM_ID}.tinjiData`) this.render();
});
}
}
_onClose(options) {
if (this._updateHook !== null) {
Hooks.off("cde:tinjiUpdated", this._updateHook);
this._updateHook = null;
}
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook);
this._settingHook = null;
}
super._onClose(options);
}
#bindDirectInput() {
@@ -2943,8 +3217,7 @@ function refreshRollActions(rollCard, aspect, message) {
const tinji = getTinjiValue();
const successAvail = (loksyu[aspect]?.yin ?? 0) + (loksyu[aspect]?.yang ?? 0);
const fasteAvail = (loksyu[fasteAspect]?.yin ?? 0) + (loksyu[fasteAspect]?.yang ?? 0);
const isGM = game.user.isGM;
const hasSomething = successAvail > 0 || fasteAvail > 0 || isGM && tinji > 0;
const hasSomething = successAvail > 0 || fasteAvail > 0 || tinji > 0;
if (!hasSomething) return;
const aspLabel = game.i18n.localize(ASPECT_LABELS[aspect]);
const fasteLabel = game.i18n.localize(ASPECT_LABELS[fasteAspect]);
@@ -2963,7 +3236,7 @@ function refreshRollActions(rollCard, aspect, message) {
<span class="cde-roll-action-count">${fasteAvail}</span>
</button>`;
}
if (isGM && tinji > 0) {
if (tinji > 0) {
btns += `<button class="cde-roll-action-btn cde-roll-action--tinji" data-action="tinji">
<span class="cde-roll-action-tinji-char">\u5929</span>
<span class="cde-roll-action-label">${game.i18n.localize("CDE.TinJi2")}</span>
@@ -3016,7 +3289,11 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
else entry.yin--;
}
data[aspect] = entry;
await setLoksyuData(data);
if (game.user.isGM) {
await setLoksyuData(data);
} else {
requestLoksyuDraw(aspect, order);
}
const flags = message?.flags?.[SYSTEM_ID];
if (flags?.rollResult && message.isOwner) {
const updated = foundry.utils.deepClone(flags.rollResult);
@@ -3055,13 +3332,16 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
});
}
async function _spendTinjiPostRoll() {
if (!game.user.isGM) return;
const current = getTinjiValue();
if (current <= 0) {
ui.notifications.warn(game.i18n.localize("CDE.TinjiEmpty"));
return;
}
await setTinjiValue(current - 1);
if (game.user.isGM) {
await setTinjiValue(current - 1);
} else {
requestTinjiSpend();
}
await ChatMessage.create({
user: game.user.id,
content: `<div class="cde-tinji-spend-msg">
@@ -3212,13 +3492,13 @@ Hooks.once("init", async () => {
});
await preloadPartials();
registerHandlebarsHelpers();
registerDice();
console.info(`CHRONIQUESDELETRANGE | Initialized`);
});
Hooks.once("ready", async () => {
await migrateIfNeeded();
await loadWelcomeSceneIfNeeded();
CDEWheelApp.registerHooks();
registerSingletonSocket();
if (game.user.isGM) showWelcomeMessage();
});
Hooks.on("renderChatLog", (_app, html) => {
+4 -4
View File
File diff suppressed because one or more lines are too long
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 523 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

+1 -30
View File
@@ -1,30 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="ar-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#00e5ff" stop-opacity="0.35"/>
<stop offset="100%" stop-color="#00e5ff" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#ar-glow)"/>
<!-- Plastron style écaille de dragon — rangées d'écailles imbriquées -->
<!-- Rangée 1 -->
<path d="M42 24 Q50 18 58 24 Q50 32 42 24Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<!-- Rangée 2 -->
<path d="M30 36 Q38 28 46 36 Q38 44 30 36Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<path d="M54 36 Q62 28 70 36 Q62 44 54 36Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<!-- Rangée 3 -->
<path d="M22 50 Q30 42 38 50 Q30 58 22 50Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<path d="M42 50 Q50 42 58 50 Q50 58 42 50Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<path d="M62 50 Q70 42 78 50 Q70 58 62 50Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<!-- Rangée 4 -->
<path d="M30 64 Q38 56 46 64 Q38 72 30 64Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<path d="M54 64 Q62 56 70 64 Q62 72 54 64Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<!-- Rangée 5 -->
<path d="M42 77 Q50 70 58 77 Q50 84 42 77Z" fill="#00e5ff" fill-opacity="0.22" stroke="#00e5ff" stroke-width="1.6"/>
<!-- Reflets -->
<circle cx="50" cy="24" r="1.5" fill="#00e5ff" opacity="0.9"/>
<circle cx="38" cy="36" r="1.5" fill="#00e5ff" opacity="0.9"/>
<circle cx="62" cy="36" r="1.5" fill="#00e5ff" opacity="0.9"/>
<circle cx="50" cy="50" r="1.5" fill="#00e5ff" opacity="0.9"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="lorc-metal-scales-gradient-0"><stop offset="0%" stop-color="#050000" stop-opacity="0.64"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#lorc-metal-scales-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M38.676 18.352V122.57l129.047 129.045V18.352H79.727l.002 99.343H61.04V18.352H38.675zm147.734 0v244.793h141.496V18.352H186.41zm160.184 0v230.945L473.322 122.57V18.352h-19.818l.002 99.343h-18.69l-.002-99.343h-88.22zm83.152 174.224-18.46 18.46.003 80.677H392.6l-.002-61.992-52.114 52.114h-13.632v122.47L429.746 301.41V192.576zm-347.492.002v108.834l104.408 104.406V281.834h-15.15l-51.627-51.625.002 61.503H101.2l-.003-80.192-18.943-18.942zm124.123 35.125h101.207v18.69H206.377v-18.69zm-1.027 54.13V413.91h102.816V281.834H205.35zm-83.55 85.558v126.346h80.026v-61.138H187.01l-28.08-28.08.002 65.443h-18.69l-.002-84.132-18.44-18.437zm268.343.055-17.15 17.15v85.366h-18.688l-.002-66.677-29.315 29.315h-13.3v61.138h78.455v-126.29zm-164.106 9.52h64.953v18.687h-64.953v-18.687zm-5.52 55.633v61.138H293v-61.138h-72.484z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

+1 -26
View File
@@ -1,26 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="ig-glow" cx="50%" cy="60%" r="50%">
<stop offset="0%" stop-color="#39ff14" stop-opacity="0.35"/>
<stop offset="100%" stop-color="#39ff14" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#ig-glow)"/>
<!-- Mortier de pharmacopée chinoise -->
<path d="M28 62 Q28 76 50 76 Q72 76 72 62 L68 48 Q68 44 50 44 Q32 44 32 48 Z"
fill="#39ff14" fill-opacity="0.15" stroke="#39ff14" stroke-width="2"/>
<!-- Pilon -->
<line x1="50" y1="22" x2="50" y2="54" stroke="#39ff14" stroke-width="3" stroke-linecap="round"/>
<ellipse cx="50" cy="54" rx="7" ry="4" fill="#39ff14" fill-opacity="0.3" stroke="#39ff14" stroke-width="1.8"/>
<!-- Vapeur montante -->
<path d="M38 42 Q34 36 38 30 Q42 24 38 18" fill="none" stroke="#39ff14" stroke-width="1.5" stroke-linecap="round" opacity="0.6"/>
<path d="M50 40 Q46 34 50 28 Q54 22 50 16" fill="none" stroke="#39ff14" stroke-width="1.5" stroke-linecap="round" opacity="0.6"/>
<path d="M62 42 Q58 36 62 30 Q66 24 62 18" fill="none" stroke="#39ff14" stroke-width="1.5" stroke-linecap="round" opacity="0.6"/>
<!-- Petits cristaux/herbes dans le mortier -->
<circle cx="44" cy="58" r="2" fill="#39ff14" opacity="0.7"/>
<circle cx="52" cy="60" r="1.5" fill="#39ff14" opacity="0.7"/>
<circle cx="59" cy="57" r="2" fill="#39ff14" opacity="0.7"/>
<!-- Bande décorative -->
<path d="M32 48 Q50 52 68 48" fill="none" stroke="#39ff14" stroke-width="1" opacity="0.5"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="sbed-nodular-gradient-0"><stop offset="0%" stop-color="#050000" stop-opacity="0.64"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#sbed-nodular-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M256 16a90 90 0 0 0-15 178.593v48.75a60 60 0 0 0 0 115.782v49.688A45 45 0 0 0 256 496a45 45 0 0 0 15-87.188v-50.157a60 60 0 0 0 0-115.78V194.59a90 90 0 0 0-15-178.594zm-2.813 30A60 60 0 0 1 256 46a60 60 0 0 1 0 120 60.017 60.017 0 0 1-2.813-120z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 791 B

+1 -27
View File
@@ -1,27 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="it-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ffd700" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#ffd700" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#it-glow)"/>
<!-- Disque de jade bi (圓璧) — cercle avec trou central -->
<circle cx="50" cy="50" r="32" fill="#ffd700" fill-opacity="0.12" stroke="#ffd700" stroke-width="2.5"/>
<circle cx="50" cy="50" r="22" fill="#101622" stroke="#ffd700" stroke-width="1.5"/>
<circle cx="50" cy="50" r="14" fill="#ffd700" fill-opacity="0.08" stroke="#ffd700" stroke-width="1" opacity="0.6"/>
<!-- Motifs décoratifs — 8 trigrammes stylisés sur le pourtour -->
<circle cx="50" cy="50" r="27" fill="none" stroke="#ffd700" stroke-width="0.8" stroke-dasharray="3 4.2" opacity="0.5"/>
<!-- Encoches décoratives aux 8 directions -->
<line x1="50" y1="18" x2="50" y2="23" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="50" y1="77" x2="50" y2="82" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="18" y1="50" x2="23" y2="50" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="77" y1="50" x2="82" y2="50" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="27.6" y1="27.6" x2="31.1" y2="31.1" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="68.9" y1="68.9" x2="72.4" y2="72.4" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="72.4" y1="27.6" x2="68.9" y2="31.1" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="27.6" y1="72.4" x2="31.1" y2="68.9" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<!-- Reflet jade -->
<path d="M36 30 Q42 28 46 32" fill="none" stroke="#ffd700" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="delapouite-old-lantern-gradient-0"><stop offset="0%" stop-color="#050000" stop-opacity="0.64"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#delapouite-old-lantern-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M256 24c-10.1 0-19.2 1.92-26.7 5.64C221.9 33.35 215 39.72 215 49s6.9 15.65 14.3 19.36c5.2 2.58 11.2 4.27 17.7 5.08v11.28h18V73.44c6.5-.81 12.5-2.5 17.7-5.08C290.1 64.65 297 58.28 297 49s-6.9-15.65-14.3-19.36C275.2 25.92 266.1 24 256 24zm0 18c7.6 0 14.4 1.66 18.6 3.74 3.3 1.63 4.1 2.97 4.3 3.26.1-.1.1-.1.1 0s0 .1-.1 0c-.2.29-1 1.63-4.3 3.26-4.2 2.08-11 3.74-18.6 3.74-7.6 0-14.4-1.66-18.6-3.74-3.3-1.63-4.1-2.97-4.3-3.26-.1.1-.1.1-.1 0s0-.1.1 0c.2-.29 1-1.63 4.3-3.26 4.2-2.08 11-3.74 18.6-3.74zm-40.9 60.7L203.4 152h105.2l-11.7-49.3zm-18.9 1.7c-6.7.3-13.2.8-19.5 1.7-14.9 2.1-28.9 6.4-39.1 16.5-3.1 3.2-3.9 5.8-5.2 9.3-1.3 3.5-2.5 7.7-3.8 12.6-2.4 9.8-4.9 22.6-7.5 37.5-5 29.8-10 67.9-14.1 106.1-4 38.1-7 76.2-7.99 106.1-.51 14.9-.53 27.7.13 37.7.33 5 .82 9.2 1.56 12.9.8 3.7 1.3 6.9 4.9 10.6 7.1 7 15.4 11 24 13.3l6.8-16.9c-6.9-1.5-12.5-4-17.3-8.5-.1-.4-.5-1.1-.8-2.2-.4-2.3-.9-5.9-1.2-10.4-.6-8.9-.6-21.3-.1-35.9 1-29.1 4-67 8-104.9 3.9-37.8 8.9-75.7 13.9-104.9 2.4-14.6 4.9-27.1 7.2-36.1 1.1-4.5 2.2-8.2 3.2-10.7.6-1.8 1.4-3 1.5-3.1 5.9-5.7 15.7-9.4 28.5-11.2 3.9-.6 8.2-1 12.5-1.2zm119.6 0 4.3 18.3c4.4.2 8.6.6 12.6 1.2 12.8 1.8 22.6 5.5 28.5 11.2.1.1.9 1.3 1.5 3.1 1 2.5 2.1 6.2 3.2 10.7 2.3 9 4.8 21.5 7.2 36.1 5 29.2 10 67.1 13.9 104.9 4 37.9 7 75.8 8 104.9.5 14.6.5 27-.1 35.9-.3 4.5-.8 8.1-1.2 10.4-.3 1.1-.7 1.8-.8 2.2-4.8 4.5-10.4 7-17.3 8.5l6.8 16.9c8.6-2.3 16.9-6.3 24-13.3 3.6-3.7 4.1-6.9 4.9-10.6.7-3.7 1.2-7.9 1.6-12.9.6-10 .6-22.8.1-37.7-1-29.9-4-68-8-106.1-4.1-38.2-9.1-76.3-14.1-106.1-2.6-14.9-5.1-27.7-7.5-37.5-1.3-4.9-2.5-9.1-3.8-12.6-1.3-3.5-2.1-6.1-5.2-9.3-10.2-10.1-24.2-14.4-39.1-16.5-6.3-.9-12.9-1.4-19.5-1.7zM213.2 170c-2.9 4.9-11.6 19.8-21.6 41.1 21.9 10.3 43.8 25.6 64.4 42.7 20.7-17.1 42.5-32.4 64.4-42.7-10-21.3-18.7-36.2-21.6-41.1zm-28.8 57.7c-10 24.5-17.6 51.3-15.5 68.2 1 7.7 7.3 19.6 15.1 31 15.6-19.6 35.7-41.2 58.1-61.2-18.9-15.4-38.9-28.9-57.7-38zm143.2 0c-18.8 9.2-38.8 22.6-57.7 38 22.4 20.1 42.5 41.7 58.1 61.2 7.8-11.4 14.1-23.3 15.1-31 2.1-16.9-5.5-43.7-15.5-68.2zM256 277.5c-23.7 21-45.2 44.2-60.7 64.2 7.8 9.4 13.9 15.6 16.5 18.3h88.4c2.6-2.7 8.7-8.9 16.5-18.3-15.5-19.9-37-43.3-60.7-64.2zM225.4 378c2.3 4.8 3.6 9.8 3.6 15 0 5.2-1.3 10.2-3.6 15h61.2c-2.3-4.8-3.6-9.8-3.6-15 0-5.2 1.3-10.2 3.6-15zm-59.3 48-24.8 62h229.4l-24.8-62z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

+1 -29
View File
@@ -1,29 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="kf-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ff2244" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#ff2244" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#kf-glow)"/>
<!-- Silhouette grue — posture sur une jambe, ailes déployées -->
<!-- Tête -->
<circle cx="50" cy="18" r="5" fill="#ff2244" fill-opacity="0.2" stroke="#ff2244" stroke-width="2"/>
<!-- Corps -->
<line x1="50" y1="23" x2="50" y2="52" stroke="#ff2244" stroke-width="2.5" stroke-linecap="round"/>
<!-- Bras gauche déployé vers le haut -->
<path d="M50 33 Q38 26 24 28" fill="none" stroke="#ff2244" stroke-width="2.5" stroke-linecap="round"/>
<!-- Bras droit vers le bas en attaque -->
<path d="M50 33 Q62 36 72 30" fill="none" stroke="#ff2244" stroke-width="2.5" stroke-linecap="round"/>
<!-- Jambe d'appui -->
<line x1="50" y1="52" x2="50" y2="78" stroke="#ff2244" stroke-width="2.5" stroke-linecap="round"/>
<path d="M50 78 Q45 82 40 80" fill="none" stroke="#ff2244" stroke-width="2.5" stroke-linecap="round"/>
<!-- Jambe levée -->
<path d="M50 52 Q60 58 66 52 Q70 46 72 50" fill="none" stroke="#ff2244" stroke-width="2.5" stroke-linecap="round"/>
<!-- Énergie chi — spirales autour du personnage -->
<path d="M20 45 Q18 38 24 34 Q30 30 28 24" fill="none" stroke="#ff2244" stroke-width="1.2" stroke-linecap="round" opacity="0.5"/>
<path d="M78 40 Q82 46 78 52 Q74 58 78 64" fill="none" stroke="#ff2244" stroke-width="1.2" stroke-linecap="round" opacity="0.5"/>
<circle cx="24" cy="28" r="2" fill="#ff2244" opacity="0.8"/>
<circle cx="72" cy="30" r="2" fill="#ff2244" opacity="0.8"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="lorc-triple-beak-gradient-0"><stop offset="0%" stop-color="#050000" stop-opacity="0.64"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#lorc-triple-beak-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M321.457 34.094c-.202 1.93-.294 3.07-.54 5.27-1.51 13.56-3.863 31.932-7.25 51.327-3.385 19.396-7.785 39.79-13.532 57.59-5.747 17.8-12.344 33.076-22.885 42.777-16.16 14.868-43.368 21.36-64.744 18.402-11.006-1.524-21.233-7.727-31.85-15.81-10.6-8.07-21.425-18.31-31.947-29.058-21.74-21.757-26.344-49.552-17.33-72.705 7.058-18.135 21.882-33.398 41.475-42.82-10.92-5.51-23.25-7.14-34.812-4.608-2.986.653-5.33 1.175-7.387 1.944h-.004c-7.268 2.716-14.464 7.406-20.216 13.364v.002c-7.268 7.525-9.54 17.93-13.657 30.626-3.567 11-7.106 21.985-10.583 32.97 12.12 5.532 21.053 16.466 26.004 29.443 5.817 15.243 6.63 33.637 1.66 52.19-4.972 18.554-14.873 34.078-27.532 44.37-10.683 8.688-23.754 13.685-36.9 12.534a695.45 695.45 0 0 0-5.115 30.446c1.797-.812 2.85-1.32 4.91-2.23C61.803 284.55 79 277.276 97.59 270.42c18.59-6.855 38.542-13.3 56.892-17.193 18.35-3.895 34.933-5.744 48.622-1.072 22.058 7.527 40.21 25.817 47.777 47.77 7.098 20.583 1.257 48.603-6.884 77.74-7.98 29.74-29.922 47.663-54.625 51.516-19.37 3.02-40.172-2.124-58.214-14.4 1.436 22.502 17.423 42.414 40.602 48.193 10.465 2.61 20.08-.14 32.892-2.872 12.215-2.603 24.41-5.24 36.57-7.95-.75-12.738 4.2-25.34 12.622-35.694 10.294-12.658 25.816-22.56 44.37-27.53 9.276-2.486 18.513-3.524 27.337-3.215 8.822.31 17.232 1.967 24.854 4.875 12.164 4.64 22.525 12.788 28.332 23.77a706.115 706.115 0 0 0 27.428-10.305c-11.19-8.05-26.56-19.445-45.18-35.028-15.1-12.636-30.535-26.655-43.01-40.566-12.477-13.91-22.33-27.322-25.228-41.43-4.525-22.025 1.693-49.892 15.942-66.657 14.1-16.588 41.71-25.365 70.996-32.88 29.747-7.96 56.285 2.045 72.045 21.484 12.35 15.235 18.354 35.8 16.774 57.556 18.63-12.516 27.63-36.35 21.035-59.342-2.96-10.32-10.267-17.337-19.06-27.09a3892.179 3892.179 0 0 0-23.517-25.88c-9.88 5.055-21.557 6.38-33.084 4.53-16.11-2.585-32.447-11.08-46.028-24.66-13.583-13.583-22.076-29.92-24.66-46.03-1.815-11.31-.576-22.767 4.245-32.525a720.579 720.579 0 0 0-25.98-21.44zm-64.06 15.254c-15.734-.033-31.723 1.863-39.09 4.447l-23.35 6.85c-23.017 6.146-39.594 21.177-46.152 38.025s-4.172 35.405 13.148 52.725l.035.035.035.035c6.1 6.23 12.253 12.203 18.23 17.54 13.744-14.476 31.505-25.465 52.153-30.997a111.903 111.903 0 0 1 33.481-3.742 111.25 111.25 0 0 1 18.297 2.28c4.474-15.147 8.16-32.44 11.064-49.07 2.052-11.755 3.68-23.032 5.006-33.19a191.63 191.63 0 0 0-42.855-4.938zm132.744.34a40.583 40.583 0 0 0-2.007.01c-7.927.23-14.553 2.874-19.37 7.69-6.42 6.422-8.982 16.06-7.113 27.712 1.87 11.65 8.422 24.773 19.42 35.77 10.998 10.998 24.12 17.55 35.772 19.42 11.65 1.87 21.288-.688 27.71-7.11 6.422-6.422 8.98-16.06 7.112-27.71-1.87-11.652-8.422-24.774-19.42-35.773-10.997-10.997-24.12-17.55-35.77-19.42a46.228 46.228 0 0 0-6.333-.588zM68.003 138.194c-6.837.09-13.97 2.95-20.836 8.534-9.155 7.444-17.242 19.68-21.268 34.703-4.025 15.022-3.14 29.664 1.067 40.69 4.206 11.024 11.24 18.092 20.014 20.442 8.77 2.35 18.398-.252 27.553-7.697 9.155-7.444 17.244-19.68 21.27-34.703 4.025-15.022 3.137-29.665-1.07-40.69-4.205-11.024-11.24-18.092-20.012-20.443a24.643 24.643 0 0 0-6.718-.837zm333.08 65.07c-5.147-.017-10.673.715-16.58 2.298l-.05.014-.048.012a291.069 291.069 0 0 0-16.75 4.84c.762 2.26 1.478 4.545 2.104 6.88 10.7 39.936-1.672 80.723-28.9 108.15 9.796 9.9 21.02 19.937 32.126 29.23 8.934 7.478 17.667 14.36 25.645 20.47a194.367 194.367 0 0 0 44.626-79.336l-.092.028 2.3-8.543a192.821 192.821 0 0 0 4.614-30.543c-.612-14.058-5.318-26.69-12.875-36.01-8.65-10.67-20.68-17.443-36.12-17.49zm-248.61 69.596c-15.433 3.68-32.404 9.203-48.413 15.107-11.587 4.272-22.527 8.695-32.244 12.787 9.408 30.286 25.63 56.702 46.516 78.004l.14-.565 11.378 11.4a194.436 194.436 0 0 0 16.36 12.688c13.242 7.643 27.594 10.407 40.28 8.43 18.072-2.82 33.122-14.282 39.453-37.91l.014-.048.014-.047a289.981 289.981 0 0 0 4.544-18.61c-36.54-10.552-66.868-39.41-77.407-78.74-.222-.83-.43-1.663-.634-2.496zm169.805 131.533c-6.155.014-12.655.834-19.228 2.595-15.024 4.026-27.26 12.113-34.704 21.268-7.445 9.155-10.048 18.78-7.698 27.555 2.35 8.773 9.42 15.808 20.444 20.014 11.024 4.207 25.665 5.094 40.69 1.07 15.022-4.027 27.258-12.114 34.702-21.27 7.445-9.154 10.048-18.78 7.698-27.554-2.35-8.772-9.42-15.807-20.444-20.013-5.512-2.104-11.927-3.377-18.843-3.62a66.734 66.734 0 0 0-2.618-.044z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

+1 -34
View File
@@ -1,34 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="dm-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#cc0000" stop-opacity="0.45"/>
<stop offset="100%" stop-color="#cc0000" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#dm-glow)"/>
<!-- Masque d'opéra cantonais — démon -->
<!-- Visage -->
<ellipse cx="50" cy="50" rx="26" ry="30" fill="#cc0000" fill-opacity="0.18" stroke="#cc0000" stroke-width="2"/>
<!-- Motif front — marques tribales -->
<path d="M36 36 Q42 30 50 32 Q58 30 64 36" fill="none" stroke="#cc0000" stroke-width="2" stroke-linecap="round"/>
<line x1="50" y1="22" x2="50" y2="32" stroke="#cc0000" stroke-width="2" stroke-linecap="round"/>
<!-- Cornes -->
<path d="M36 28 Q30 16 26 12" fill="none" stroke="#cc0000" stroke-width="2.5" stroke-linecap="round"/>
<path d="M64 28 Q70 16 74 12" fill="none" stroke="#cc0000" stroke-width="2.5" stroke-linecap="round"/>
<!-- Yeux en amande — regard furieux -->
<path d="M34 46 Q38 42 42 46 Q38 50 34 46Z" fill="#cc0000" fill-opacity="0.5" stroke="#cc0000" stroke-width="1.5"/>
<path d="M58 46 Q62 42 66 46 Q62 50 58 46Z" fill="#cc0000" fill-opacity="0.5" stroke="#cc0000" stroke-width="1.5"/>
<circle cx="38" cy="46" r="1.5" fill="#cc0000"/>
<circle cx="62" cy="46" r="1.5" fill="#cc0000"/>
<!-- Nez -->
<path d="M46 52 Q50 56 54 52" fill="none" stroke="#cc0000" stroke-width="1.5" stroke-linecap="round"/>
<!-- Bouche avec crocs -->
<path d="M34 62 Q42 70 50 68 Q58 70 66 62" fill="none" stroke="#cc0000" stroke-width="2" stroke-linecap="round"/>
<line x1="44" y1="65" x2="44" y2="72" stroke="#cc0000" stroke-width="1.5" stroke-linecap="round"/>
<line x1="50" y1="68" x2="50" y2="75" stroke="#cc0000" stroke-width="1.5" stroke-linecap="round"/>
<line x1="56" y1="65" x2="56" y2="72" stroke="#cc0000" stroke-width="1.5" stroke-linecap="round"/>
<!-- Moustaches -->
<path d="M36 56 Q28 52 22 54" fill="none" stroke="#cc0000" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
<path d="M64 56 Q72 52 78 54" fill="none" stroke="#cc0000" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="lorc-daemon-skull-gradient-0"><stop offset="0%" stop-color="#bd10e0" stop-opacity="1"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#lorc-daemon-skull-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M142.026 16.89C94.242 38.888 62.71 74.257 62.71 113.927c0 26.11 13.42 50.288 36.22 70.04-11.664 25.398-18.99 53.91-20.81 84.212 17.194.562 33.53 4.205 48.192 11.7 41.566 21.25 61.083 66.944 57.787 121.093a286.662 286.662 0 0 0 23.122 4.58c.894-16.76.83-33.468-.496-50.122l18.63-1.485c1.438 18.035 1.466 36.014.458 53.938 8.022.76 16.14 1.21 24.322 1.382V353.03h18.687v56.13c7.83-.25 15.693-.755 23.565-1.514-.995-17.845-.96-35.745.47-53.7l18.63 1.485c-1.323 16.597-1.39 33.247-.504 49.95 7.307-1.07 14.6-2.355 21.863-3.843-3.467-54.395 16.04-100.333 57.748-121.656 14.66-7.497 30.998-11.142 48.19-11.702-1.843-30.716-9.343-59.594-21.284-85.252 22.08-19.56 35.044-43.346 35.044-69 0-39.67-31.532-75.04-79.316-97.035C386.283 33.46 394.32 53.31 394.32 74.27c0 42.688-31.51 79.614-77.026 97.146l-6.14-14.3c11.148-4.44 21.233-10.197 29.876-16.964 10.1-7.905 18.202-17.087 23.91-27.154-29.85-25.333-66.642-40.283-106.488-40.283-40.34 0-77.554 15.314-107.6 41.223 5.674 9.7 13.588 18.555 23.372 26.214 9.67 7.57 21.145 13.877 33.894 18.49l-6.125 14.264c-47.677-16.863-81.06-54.696-81.06-98.636 0-20.96 8.038-40.81 21.093-57.377zm10.286 183.128c.054-.004.1.004.127.037 18.414 23.35 51.93 39.697 91.086 43.162-5.892 19.698-26.99 34.53-52.67 34.53-30.21 0-55.148-20.584-55.148-45.517.002-12.465 6.205-23.997 16.11-32.173.083.094.33-.027.494-.04zm211.668.002c.053-.003.1.006.138.04 9.907 8.175 16.112 19.707 16.112 32.173 0 24.93-24.937 45.515-55.15 45.515-25.68 0-46.776-14.83-52.67-34.53 39.156-3.466 72.673-19.813 91.087-43.16.112.085.322-.03.483-.038zM258.4 244.174c5.625 27.42 13.928 54.84 32.91 82.26-20.274 5.432-44.818 5.627-65.82 0 17.968-27.42 26.834-54.84 32.91-82.26zm-76.31 175.54c-2.34 15.4-6.413 31.3-12.25 47.372a168.84 168.84 0 0 0 27.663 14.637c3.627-19.225 6.537-38.376 8.33-57.455a309.037 309.037 0 0 1-23.744-4.553zm152.802.48a409.42 409.42 0 0 1-22.526 3.888c1.777 18.972 4.655 38.015 8.248 57.13a169.154 169.154 0 0 0 26.452-14.126c-5.776-15.906-9.824-31.644-12.174-46.893zm-41.094 6.115c-8.335.8-16.668 1.323-24.975 1.58v65.694a157.874 157.874 0 0 0 33.973-6.01c-3.898-20.343-7.058-40.766-8.998-61.265zm-69.402.237c-1.953 20.54-5.13 41.002-9.043 61.385a157.903 157.903 0 0 0 34.783 5.773v-65.713a349.206 349.206 0 0 1-25.74-1.445z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

+1 -37
View File
@@ -1,37 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="dieu-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ffd700" stop-opacity="0.5"/>
<stop offset="100%" stop-color="#ffd700" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#dieu-glow)"/>
<!-- Soleil impérial céleste -->
<!-- Rayons -->
<line x1="50" y1="14" x2="50" y2="24" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="50" y1="76" x2="50" y2="86" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="14" y1="50" x2="24" y2="50" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="76" y1="50" x2="86" y2="50" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="24.8" y1="24.8" x2="31.9" y2="31.9" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="68.1" y1="68.1" x2="75.2" y2="75.2" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="75.2" y1="24.8" x2="68.1" y2="31.9" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<line x1="24.8" y1="75.2" x2="31.9" y2="68.1" stroke="#ffd700" stroke-width="2" stroke-linecap="round"/>
<!-- Rayons diagonaux secondaires -->
<line x1="29.6" y1="18.8" x2="33.8" y2="26.8" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="70.4" y1="18.8" x2="66.2" y2="26.8" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="18.8" y1="29.6" x2="26.8" y2="33.8" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="81.2" y1="29.6" x2="73.2" y2="33.8" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="18.8" y1="70.4" x2="26.8" y2="66.2" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="81.2" y1="70.4" x2="73.2" y2="66.2" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="29.6" y1="81.2" x2="33.8" y2="73.2" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="70.4" y1="81.2" x2="66.2" y2="73.2" stroke="#ffd700" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<!-- Cercle central solaire -->
<circle cx="50" cy="50" r="16" fill="#ffd700" fill-opacity="0.2" stroke="#ffd700" stroke-width="2.5"/>
<!-- Nuages célestes stylisés en dessous -->
<path d="M32 58 Q36 52 42 56 Q46 50 50 54 Q54 50 58 56 Q64 52 68 58" fill="none" stroke="#ffd700" stroke-width="1.5" stroke-linecap="round" opacity="0.6"/>
<!-- Idéogramme stylisé au centre (天) -->
<line x1="44" y1="45" x2="56" y2="45" stroke="#ffd700" stroke-width="1.8" stroke-linecap="round"/>
<line x1="50" y1="42" x2="50" y2="58" stroke="#ffd700" stroke-width="1.8" stroke-linecap="round"/>
<line x1="42" y1="58" x2="58" y2="58" stroke="#ffd700" stroke-width="1.8" stroke-linecap="round"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="delapouite-hand-of-god-gradient-0"><stop offset="0%" stop-color="#bd10e0" stop-opacity="1"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#delapouite-hand-of-god-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M387.29 19.115c-.677 24.348-8.15 49.273-22.194 71.834-36.935 59.335-110.622 86.083-178.93 70.61 4.218-1.997 8.274-4.09 12.098-6.292 39.055-22.5 57.282-55.456 54.312-91.69-7.387 21.813-24.63 41.317-50.226 56.067-48.05 27.68-118.013 31.686-187.47 16.935v37.377c36.274 13.19 81.88 12.965 122.397 3.98a148.82 148.82 0 0 0 9.98 5.872c76.52 40.974 174.19 17.537 220.173-51.855 40.442 14.673 84.808 19.944 127.32 16.393v-39.13c-36.858 3.595-75.196.774-111.385-9.015 9.5-26.662 10.486-54.666 3.924-81.088zm30.265 159.975c-28.534 12.307-59.168 14.074-87.434 10.355-19.252 10.658-41.5 18.6-64.68 23.393-44.056 9.11-91.918 6.655-129.426-14.018l78.47 175.914c11.298 12.252 24.03 25.506 42.043 41.3l.168.15.162.154c1.618 1.562 2.678 1.823 5.122 1.555 2.442-.27 5.967-1.672 9.325-4.012 3.358-2.34 6.532-5.546 8.62-8.542a19.459 19.459 0 0 0 2.304-4.4l-39.67-38.292 12.98-13.445 45.558 43.978.002.002c.225.22.092.432 2.248.006 2.162-.428 5.725-2.03 9.26-4.557 6.005-4.294 11.807-11.445 14.244-16.282l-39.188-37.828 12.98-13.446 45.098 43.533c11.69-2.624 21.136-10.836 25.237-20.322l-50-48.264 12.98-13.446 105.813 102.143c5.053 4.877 9.384 6.113 13.122 5.99 3.737-.123 7.224-1.832 9.85-4.63 5.25-5.598 7.5-13.944-1.985-23.1l-146.72-141.63 12.98-13.445 23.177 22.373c25.815-2.733 47.54-9.893 60.996-18.345 7.11-4.466 11.78-9.26 13.92-13.186 2.14-3.923 2.322-6.51.795-10.078-1.122-2.613-3.768-5.992-8.353-9.576z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

+1 -36
View File
@@ -1,36 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="ea-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ff8c00" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#ff8c00" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#ea-glow)"/>
<!-- Tête de renard (esprit renard — huli jing) -->
<!-- Museau triangulaire -->
<path d="M28 68 Q50 30 72 68 Q62 80 50 78 Q38 80 28 68Z"
fill="#ff8c00" fill-opacity="0.18" stroke="#ff8c00" stroke-width="2"/>
<!-- Oreilles pointues -->
<path d="M28 68 Q22 48 30 30 Q36 44 40 52Z" fill="#ff8c00" fill-opacity="0.25" stroke="#ff8c00" stroke-width="2"/>
<path d="M72 68 Q78 48 70 30 Q64 44 60 52Z" fill="#ff8c00" fill-opacity="0.25" stroke="#ff8c00" stroke-width="2"/>
<!-- Intérieur oreilles -->
<path d="M30 62 Q27 50 33 36 Q36 46 39 52Z" fill="#ff8c00" fill-opacity="0.4" stroke="none"/>
<path d="M70 62 Q73 50 67 36 Q64 46 61 52Z" fill="#ff8c00" fill-opacity="0.4" stroke="none"/>
<!-- Yeux en amande -->
<path d="M36 58 Q42 52 46 58 Q42 62 36 58Z" fill="#ff8c00" fill-opacity="0.6" stroke="#ff8c00" stroke-width="1.5"/>
<path d="M54 58 Q58 52 64 58 Q58 62 54 58Z" fill="#ff8c00" fill-opacity="0.6" stroke="#ff8c00" stroke-width="1.5"/>
<circle cx="41" cy="57" r="1.5" fill="#ff8c00"/>
<circle cx="59" cy="57" r="1.5" fill="#ff8c00"/>
<!-- Nez -->
<path d="M46 66 Q50 70 54 66 Q50 64 46 66Z" fill="#ff8c00" opacity="0.7"/>
<!-- Moustaches -->
<line x1="50" y1="67" x2="50" y2="74" stroke="#ff8c00" stroke-width="1.5" stroke-linecap="round" opacity="0.6"/>
<line x1="34" y1="68" x2="46" y2="68" stroke="#ff8c00" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
<line x1="54" y1="68" x2="66" y2="68" stroke="#ff8c00" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
<line x1="32" y1="72" x2="46" y2="70" stroke="#ff8c00" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
<line x1="54" y1="70" x2="68" y2="72" stroke="#ff8c00" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
<!-- Marques spirituelles sur le front -->
<circle cx="50" cy="46" r="3" fill="none" stroke="#ff8c00" stroke-width="1.5" opacity="0.7"/>
<line x1="50" y1="34" x2="50" y2="43" stroke="#ff8c00" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="lorc-spark-spirit-gradient-0"><stop offset="0%" stop-color="#bd10e0" stop-opacity="1"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#lorc-spark-spirit-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M420.402 19.873c37.886 49.484 19.76 88.205-39.797 90.787 15.374-23.54 18.565-50.758-1.503-72.215 15.56 37.318-14.397 62.848-50.137 67.096-4.39-.934-8.887-1.99-13.508-3.19-60.132-15.624-114.527 22.936-137.37 78.923-.43-34.33 9.72-68.377 29.83-102.152-50.37 35.038-75.926 89.323-72.616 166.003l-59.41-65.365L89.55 374.43l164.6 119.595L392.703 389.54l52.584-196.853-93.224 72.415c-23.56-25.652-13.02-55.2 33.736-50.293-38.077-22.19-64.97-2.473-75.952 24.356-5.608-27.825 18.206-63.122 50.218-58.686 76.728 10.638 151.882-107.834 60.336-160.607zM119.838 272.05l94.777 73.214-103.095-21.22 29.263-3.05-20.945-48.943zm255.48 12.237-10.623 25.262 27.8-.28-12.095 23.437-96.25 14.438 91.168-62.858zM204.305 360.13l42.256 62.552 11.247-44.094 17.84 32.598 56.574-48.54-7.23 24.368 51.71-21.274-54.485 61.82 9.654-29.966-76.21 71.62-47.574-55.136 3.176 27.483-74.627-77.593 61.166 29.998 6.505-33.834z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

-33
View File
@@ -1,33 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="fa-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#88aaff" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#88aaff" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#fa-glow)"/>
<!-- Lanterne en papier avec visage fantôme -->
<!-- Corde du haut -->
<line x1="50" y1="14" x2="50" y2="22" stroke="#88aaff" stroke-width="1.8" stroke-linecap="round"/>
<line x1="44" y1="22" x2="56" y2="22" stroke="#88aaff" stroke-width="1.8" stroke-linecap="round"/>
<!-- Corps de la lanterne -->
<path d="M36 22 Q24 38 24 54 Q24 70 36 76 Q50 84 64 76 Q76 70 76 54 Q76 38 64 22 Z"
fill="#88aaff" fill-opacity="0.12" stroke="#88aaff" stroke-width="2"/>
<!-- Côtes de lanterne -->
<path d="M26 36 Q50 32 74 36" fill="none" stroke="#88aaff" stroke-width="1" opacity="0.5"/>
<path d="M24 50 Q50 46 76 50" fill="none" stroke="#88aaff" stroke-width="1" opacity="0.5"/>
<path d="M26 64 Q50 60 74 64" fill="none" stroke="#88aaff" stroke-width="1" opacity="0.5"/>
<!-- Visage fantomatique -->
<!-- Yeux creux -->
<ellipse cx="40" cy="48" rx="5" ry="6" fill="#88aaff" fill-opacity="0.35" stroke="#88aaff" stroke-width="1.5"/>
<ellipse cx="60" cy="48" rx="5" ry="6" fill="#88aaff" fill-opacity="0.35" stroke="#88aaff" stroke-width="1.5"/>
<!-- Bouche tordue -->
<path d="M36 60 Q42 66 50 62 Q58 66 64 60" fill="none" stroke="#88aaff" stroke-width="2" stroke-linecap="round"/>
<!-- Franges du bas de la lanterne -->
<line x1="40" y1="76" x2="38" y2="86" stroke="#88aaff" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="50" y1="78" x2="50" y2="88" stroke="#88aaff" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<line x1="60" y1="76" x2="62" y2="86" stroke="#88aaff" stroke-width="1.2" stroke-linecap="round" opacity="0.6"/>
<!-- Lueur intérieure -->
<ellipse cx="50" cy="52" rx="12" ry="14" fill="#88aaff" fill-opacity="0.08"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

-38
View File
@@ -1,38 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="jg-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#cc44ff" stop-opacity="0.45"/>
<stop offset="100%" stop-color="#cc44ff" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#jg-glow)"/>
<!-- Jiugwaai — créature de rue à multiples yeux -->
<!-- Silhouette bossue -->
<path d="M24 72 Q22 56 28 44 Q34 32 50 28 Q66 32 72 44 Q78 56 76 72 Q66 78 50 80 Q34 78 24 72Z"
fill="#cc44ff" fill-opacity="0.12" stroke="#cc44ff" stroke-width="2"/>
<!-- Multiples yeux disposés irrégulièrement -->
<ellipse cx="36" cy="42" rx="5" ry="4" fill="#cc44ff" fill-opacity="0.4" stroke="#cc44ff" stroke-width="1.5"/>
<circle cx="36" cy="42" r="2" fill="#cc44ff"/>
<ellipse cx="52" cy="36" rx="4" ry="5" fill="#cc44ff" fill-opacity="0.4" stroke="#cc44ff" stroke-width="1.5"/>
<circle cx="52" cy="36" r="2" fill="#cc44ff"/>
<ellipse cx="65" cy="44" rx="5" ry="4" fill="#cc44ff" fill-opacity="0.4" stroke="#cc44ff" stroke-width="1.5"/>
<circle cx="65" cy="44" r="2" fill="#cc44ff"/>
<ellipse cx="42" cy="56" rx="4" ry="4" fill="#cc44ff" fill-opacity="0.4" stroke="#cc44ff" stroke-width="1.5"/>
<circle cx="42" cy="56" r="2" fill="#cc44ff"/>
<ellipse cx="60" cy="54" rx="4" ry="5" fill="#cc44ff" fill-opacity="0.4" stroke="#cc44ff" stroke-width="1.5"/>
<circle cx="60" cy="54" r="2" fill="#cc44ff"/>
<!-- Petit oeil supplémentaire -->
<circle cx="50" cy="48" r="3" fill="#cc44ff" fill-opacity="0.3" stroke="#cc44ff" stroke-width="1.2"/>
<circle cx="50" cy="48" r="1.5" fill="#cc44ff" opacity="0.8"/>
<!-- Membres difformes -->
<path d="M24 72 Q16 68 12 78" fill="none" stroke="#cc44ff" stroke-width="2" stroke-linecap="round" opacity="0.7"/>
<path d="M76 72 Q84 68 88 78" fill="none" stroke="#cc44ff" stroke-width="2" stroke-linecap="round" opacity="0.7"/>
<path d="M30 46 Q18 44 14 50" fill="none" stroke="#cc44ff" stroke-width="1.5" stroke-linecap="round" opacity="0.6"/>
<path d="M70 46 Q82 44 86 50" fill="none" stroke="#cc44ff" stroke-width="1.5" stroke-linecap="round" opacity="0.6"/>
<!-- Bouche dentée -->
<path d="M36 66 Q44 72 50 70 Q56 72 64 66" fill="none" stroke="#cc44ff" stroke-width="2" stroke-linecap="round"/>
<line x1="42" y1="68" x2="40" y2="74" stroke="#cc44ff" stroke-width="1.5" stroke-linecap="round"/>
<line x1="50" y1="70" x2="50" y2="76" stroke="#cc44ff" stroke-width="1.5" stroke-linecap="round"/>
<line x1="58" y1="68" x2="60" y2="74" stroke="#cc44ff" stroke-width="1.5" stroke-linecap="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

-36
View File
@@ -1,36 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="mo-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#4ecdc4" stop-opacity="0.35"/>
<stop offset="100%" stop-color="#4ecdc4" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#mo-glow)"/>
<!-- Silhouette homme en trench-coat — style triades HK -->
<!-- Tête -->
<circle cx="50" cy="22" r="8" fill="#4ecdc4" fill-opacity="0.2" stroke="#4ecdc4" stroke-width="2"/>
<!-- Cou -->
<line x1="50" y1="30" x2="50" y2="36" stroke="#4ecdc4" stroke-width="3" stroke-linecap="round"/>
<!-- Corps trench-coat -->
<path d="M32 36 Q32 54 34 68 Q42 72 50 72 Q58 72 66 68 Q68 54 68 36 Q60 32 50 32 Q40 32 32 36Z"
fill="#4ecdc4" fill-opacity="0.12" stroke="#4ecdc4" stroke-width="2"/>
<!-- Col relevé -->
<path d="M36 36 Q42 30 50 32 Q58 30 64 36" fill="none" stroke="#4ecdc4" stroke-width="2" stroke-linecap="round"/>
<!-- Revers du manteau -->
<path d="M36 36 Q44 44 48 68" fill="none" stroke="#4ecdc4" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
<path d="M64 36 Q56 44 52 68" fill="none" stroke="#4ecdc4" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
<!-- Bras gauche — main dans la poche -->
<path d="M32 36 Q22 44 22 56 Q24 60 28 58" fill="none" stroke="#4ecdc4" stroke-width="2.5" stroke-linecap="round"/>
<!-- Bras droit — bras le long du corps -->
<path d="M68 36 Q78 44 78 56 Q76 60 72 58" fill="none" stroke="#4ecdc4" stroke-width="2.5" stroke-linecap="round"/>
<!-- Jambes -->
<line x1="44" y1="72" x2="42" y2="88" stroke="#4ecdc4" stroke-width="2.5" stroke-linecap="round"/>
<line x1="56" y1="72" x2="58" y2="88" stroke="#4ecdc4" stroke-width="2.5" stroke-linecap="round"/>
<!-- Chaussures -->
<path d="M42 88 Q38 90 34 88" fill="none" stroke="#4ecdc4" stroke-width="2" stroke-linecap="round"/>
<path d="M58 88 Q62 90 66 88" fill="none" stroke="#4ecdc4" stroke-width="2" stroke-linecap="round"/>
<!-- Cigarette à la bouche -->
<line x1="52" y1="21" x2="58" y2="19" stroke="#4ecdc4" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
<circle cx="59" cy="18" r="1.5" fill="#4ecdc4" opacity="0.8"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

+1 -31
View File
@@ -1,31 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="sh-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#00ff9f" stop-opacity="0.45"/>
<stop offset="100%" stop-color="#00ff9f" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#sh-glow)"/>
<!-- Trois souffles (三氣) — trois spirales en trinity -->
<!-- Spirale 1 — haut gauche -->
<path d="M36 38 Q28 30 30 22 Q34 14 42 18 Q50 22 48 30 Q46 36 38 38 Q32 38 30 34"
fill="none" stroke="#00ff9f" stroke-width="2.2" stroke-linecap="round"/>
<circle cx="30" cy="34" r="2.5" fill="#00ff9f" opacity="0.8"/>
<!-- Spirale 2 — haut droite -->
<path d="M64 38 Q72 30 70 22 Q66 14 58 18 Q50 22 52 30 Q54 36 62 38 Q68 38 70 34"
fill="none" stroke="#00ff9f" stroke-width="2.2" stroke-linecap="round"/>
<circle cx="70" cy="34" r="2.5" fill="#00ff9f" opacity="0.8"/>
<!-- Spirale 3 — bas centre -->
<path d="M50 72 Q42 76 36 72 Q30 64 36 58 Q42 52 50 56 Q58 60 58 68 Q56 76 50 78"
fill="none" stroke="#00ff9f" stroke-width="2.2" stroke-linecap="round"/>
<circle cx="50" cy="78" r="2.5" fill="#00ff9f" opacity="0.8"/>
<!-- Connexions entre les trois spirales -->
<line x1="36" y1="38" x2="42" y2="48" stroke="#00ff9f" stroke-width="1.5" stroke-linecap="round" opacity="0.5"/>
<line x1="64" y1="38" x2="58" y2="48" stroke="#00ff9f" stroke-width="1.5" stroke-linecap="round" opacity="0.5"/>
<line x1="42" y1="48" x2="58" y2="48" stroke="#00ff9f" stroke-width="1.5" stroke-linecap="round" opacity="0.5"/>
<line x1="50" y1="48" x2="50" y2="56" stroke="#00ff9f" stroke-width="1.5" stroke-linecap="round" opacity="0.5"/>
<!-- Centre lumineux -->
<circle cx="50" cy="48" r="5" fill="#00ff9f" fill-opacity="0.25" stroke="#00ff9f" stroke-width="1.5"/>
<circle cx="50" cy="48" r="2" fill="#00ff9f" opacity="0.9"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="sbed-pulse-gradient-0"><stop offset="0%" stop-color="#050000" stop-opacity="0.64"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#sbed-pulse-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M256 16c-120 0-135 105-60 195 0-165 135-45 135-135 0-30-45-60-75-60zm146.25 134.532C370.61 152.554 334.75 167.875 301 196c165 0 45 135 135 135 30 0 60-45 60-75 0-75-41.016-108.838-93.75-105.468zM76 181c-30 0-60 45-60 75 0 120 105 135 195 60-165 0-45-135-135-135zm175.782 15A60 60 0 0 0 196 256a60 60 0 0 0 120 0 60 60 0 0 0-64.218-60zM316 301c0 165-135 45-135 135 0 30 45 60 75 60 120 0 135-105 60-195z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 944 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

+1 -29
View File
@@ -1,29 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="sn-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ff44cc" stop-opacity="0.5"/>
<stop offset="100%" stop-color="#ff44cc" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#sn-glow)"/>
<!-- Vortex de qi — spirale d'énergie -->
<!-- Spirale externe -->
<path d="M50 16 Q72 18 80 36 Q88 54 74 68 Q60 82 42 78 Q24 74 18 58 Q12 42 24 28 Q36 14 52 16"
fill="none" stroke="#ff44cc" stroke-width="2.2" stroke-linecap="round"/>
<!-- Spirale intermédiaire -->
<path d="M50 26 Q64 28 70 42 Q76 56 66 66 Q56 76 42 70 Q28 64 28 50 Q28 36 40 30 Q52 24 62 28"
fill="none" stroke="#ff44cc" stroke-width="2" stroke-linecap="round" opacity="0.75"/>
<!-- Spirale interne -->
<path d="M50 36 Q58 36 62 44 Q66 52 60 60 Q54 66 46 62 Q38 58 38 50 Q38 42 44 38 Q50 34 56 38"
fill="none" stroke="#ff44cc" stroke-width="1.8" stroke-linecap="round" opacity="0.6"/>
<!-- Noyau central -->
<circle cx="50" cy="50" r="8" fill="#ff44cc" fill-opacity="0.2" stroke="#ff44cc" stroke-width="2"/>
<circle cx="50" cy="50" r="3" fill="#ff44cc" opacity="0.9"/>
<!-- Particules d'énergie en orbite -->
<circle cx="50" cy="16" r="2.5" fill="#ff44cc" opacity="0.8"/>
<circle cx="80" cy="36" r="2" fill="#ff44cc" opacity="0.7"/>
<circle cx="74" cy="68" r="2.5" fill="#ff44cc" opacity="0.8"/>
<circle cx="18" cy="58" r="2" fill="#ff44cc" opacity="0.7"/>
<circle cx="24" cy="28" r="2" fill="#ff44cc" opacity="0.7"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="lorc-omega-gradient-0"><stop offset="0%" stop-color="#050000" stop-opacity="0.64"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#lorc-omega-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M259.05 73.105C155.53 73.105 71.2 163.14 71.2 274.65c0 42.674 12.272 82.822 33.265 115.45-24.44-13.235-48.45-29.26-72.4-48.92v95.108H206.87c-48-33.257-81.532-82.232-81.532-138.158 0-74.567 59.88-135.015 133.71-135.015 73.832 0 133.712 60.448 133.712 135.015 0 55.926-33.53 104.9-81.53 138.158h174.803V341.18c-24.02 19.865-48.295 36.2-73.052 49.57 21.297-32.77 33.92-73.09 33.92-116.1 0-111.51-84.33-201.545-187.85-201.545z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 964 B

+1 -36
View File
@@ -1,36 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<radialGradient id="wp-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ff6b35" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#ff6b35" stop-opacity="0"/>
</radialGradient>
</defs>
<circle cx="50" cy="50" r="48" fill="#101622" stroke="#1a2436" stroke-width="2"/>
<circle cx="50" cy="50" r="48" fill="url(#wp-glow)"/>
<!-- Deux couteaux papillon (wing chun) croisés -->
<!-- Couteau 1 — orientation ↗ -->
<!-- Lame gauche -->
<path d="M24 72 Q28 60 36 50 Q44 40 56 28 L58 32 Q48 44 40 54 Q32 64 28 76 Z"
fill="#ff6b35" fill-opacity="0.25" stroke="#ff6b35" stroke-width="1.8"/>
<!-- Garde en D couteau 1 -->
<path d="M36 50 Q32 46 28 48 Q26 52 30 54 Q34 56 36 50Z"
fill="#ff6b35" fill-opacity="0.4" stroke="#ff6b35" stroke-width="1.5"/>
<!-- Manche couteau 1 -->
<line x1="28" y1="76" x2="20" y2="84" stroke="#ff6b35" stroke-width="3.5" stroke-linecap="round"/>
<!-- Couteau 2 — orientation ↖ croisé -->
<!-- Lame droite -->
<path d="M76 72 Q72 60 64 50 Q56 40 44 28 L42 32 Q52 44 60 54 Q68 64 72 76 Z"
fill="#ff6b35" fill-opacity="0.25" stroke="#ff6b35" stroke-width="1.8"/>
<!-- Garde en D couteau 2 -->
<path d="M64 50 Q68 46 72 48 Q74 52 70 54 Q66 56 64 50Z"
fill="#ff6b35" fill-opacity="0.4" stroke="#ff6b35" stroke-width="1.5"/>
<!-- Manche couteau 2 -->
<line x1="72" y1="76" x2="80" y2="84" stroke="#ff6b35" stroke-width="3.5" stroke-linecap="round"/>
<!-- Reflets sur les lames -->
<line x1="42" y1="44" x2="46" y2="40" stroke="#ff6b35" stroke-width="1" stroke-linecap="round" opacity="0.7"/>
<line x1="58" y1="44" x2="54" y2="40" stroke="#ff6b35" stroke-width="1" stroke-linecap="round" opacity="0.7"/>
<!-- Étincelle au croisement -->
<circle cx="50" cy="50" r="3" fill="#ff6b35" opacity="0.9"/>
<line x1="50" y1="44" x2="50" y2="56" stroke="#ff6b35" stroke-width="1" stroke-linecap="round" opacity="0.6"/>
<line x1="44" y1="50" x2="56" y2="50" stroke="#ff6b35" stroke-width="1" stroke-linecap="round" opacity="0.6"/>
</svg>
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="sbed-regeneration-gradient-0"><stop offset="0%" stop-color="#050000" stop-opacity="0.64"></stop><stop offset="100%" stop-color="#e46e6e" stop-opacity="0.64"></stop></linearGradient></defs><circle cx="256" cy="256" r="252" fill="url(#sbed-regeneration-gradient-0)" stroke="#f0df1a" stroke-opacity="1" stroke-width="4"></circle><g class="" style="" transform="translate(0,0)"><path d="M229.594 16c-73.58 4.91-128.97 66.775-128.97 142.344 0 18.565 3.507 36.337 9.907 52.594 6.526 16.573 14.974 35.78 81.72 99.062l19.47-11.375a32.898 32.898 0 0 1-1.876-11.03c0-15.672 10.893-28.772 25.437-32.033v-22.75c-56.316-3.484-101.03-50.67-101.03-108.437 0-56.834 40.318-103.563 95.344-108.375zm12.75 137.313c-29.654 0-57.053 9.766-79.22 26.28 6.817 9.665 15.288 18.155 24.907 24.938 15.6-10.34 34.262-16.374 54.314-16.374 21.142 0 40.753 6.698 56.844 18.094 14.128-3.45 28.403-6.214 42.875-7.75-24.47-27.71-60.07-45.188-99.72-45.188zM355 209.093c-17.672.308-46.292 5.044-106.53 23.438v22.69c3.57.656 7.083 1.967 10.405 3.905 13.433 7.834 19.226 23.895 14.75 38.25l19.5 11.375c31.146-47.53 93.95-63.04 143.47-34.156 48.717 28.416 68.605 87.043 45.217 137.594 32.582-66.832 7.25-146.247-57.53-184.032-15.916-9.282-32.896-15.096-50.032-17.625-5.46-.805-11.217-1.576-19.25-1.436zm-239.47 36.813c-11.52 35.264-8.7 75.154 11.126 109.844 14.828 25.944 36.886 45.05 62.125 56.188a105.295 105.295 0 0 0 8.94-34.282c-16.666-8.476-31.163-21.767-41.19-39.312-10.57-18.498-14.63-39.005-12.905-58.78-10.022-10.637-19.54-21.764-28.094-33.658zM375.19 273.5a102.492 102.492 0 0 0-33.844 9.313c1.066 18.82-3.1 38.174-13.125 55.718-10.573 18.5-26.094 32.307-43.908 40.69-4.105 14.085-8.893 27.944-14.812 41.374 35.99-7.553 68.768-29.967 88.594-64.656 14.827-25.946 20.167-54.788 17.094-82.438zm-107.94 35.344c-2.35 2.796-5.24 5.218-8.563 7.156-13.432 7.834-30.12 4.875-40.187-6.22l-19.47 11.345c25.173 51.015 7.052 113.74-42.468 142.625C107.844 492.166 47.638 480.238 16 434.5c40.998 61.92 121.75 79.472 186.53 41.688 15.916-9.282 29.36-21.24 40.095-34.97 10.946-13.994 23.187-30.992 44.063-121.03l-19.438-11.344z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 62 KiB

+11
View File
@@ -150,6 +150,11 @@
"CDE.MigrationPartialError": "{count} personnage(s) n'ont pas pu être importés.",
"CDE.MigrationErrorNotJson": "Le fichier « {file} » n'est pas un fichier JSON.",
"CDE.MigrationErrorParse": "Erreur lors de la lecture de « {file} » : {error}",
"CDE.MigrationConfirmAction": "Confirmer l'importation",
"CDE.MigrationDuplicate": "Ce nom existe déjà dans le monde",
"CDE.MigrationDuplicateCount": "{count} personnage(s) existent déjà dans le monde",
"CDE.MigrationImportConfirm": "Vous allez importer {count} personnage(s). Confirmez-vous ?",
"CDE.MigrationImporting": "Importation en cours...",
"CDE.InitiativeWheel": "Roue d'Initiative",
"CDE.InitiativeWheelOpen": "Ouvrir la Roue d'Initiative",
"CDE.InitiativeWheelHint": "Roue d'initiative Les Chroniques de l'Étrange",
@@ -280,6 +285,12 @@
"CDE.RealizationTimeAccelerated": "Temps de Réalisation (Accéléré)",
"CDE.RealizationTimeRitual": "Temps de Réalisation (Rituel)",
"CDE.Reference": "Référence",
"CDE.Recovery": "Récupération",
"CDE.RecoveryBaseDice": "Dés de base",
"CDE.RecoveryEvenLabel": "Pairs",
"CDE.RecoveryNoAspect": "Votre aspect est à 0, la Récupération est impossible.",
"CDE.RecoveryNoGuardian": "Vous devez choisir un Gardien Céleste pour utiliser la Récupération.",
"CDE.RecoveryOddLabel": "Impairs",
"CDE.Renowned": "Renommé",
"CDE.ResourceMax": "Max",
"CDE.ResourceMin": "Min",
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000064
+3 -7
View File
@@ -1,7 +1,3 @@
2026/06/10-16:26:13.211312 7f2fceffd6c0 Recovering log #38
2026/06/10-16:26:13.220902 7f2fceffd6c0 Delete type=3 #36
2026/06/10-16:26:13.220927 7f2fceffd6c0 Delete type=0 #38
2026/06/10-16:29:53.729923 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.729930 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.735552 7f2fce7fc6c0 Delete type=0 #41
2026/06/10-16:29:53.741380 7f2fce7fc6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)
2026/07/01-17:09:48.049670 7f190cdff6c0 Recovering log #62
2026/07/01-17:09:48.058970 7f190cdff6c0 Delete type=3 #60
2026/07/01-17:09:48.059029 7f190cdff6c0 Delete type=0 #62
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.579029 7f301cbff6c0 Recovering log #34
2026/06/10-16:17:31.588884 7f301cbff6c0 Delete type=3 #32
2026/06/10-16:17:31.588903 7f301cbff6c0 Delete type=0 #34
2026/06/10-16:19:32.836492 7f2fce7fc6c0 Level-0 table #39: started
2026/06/10-16:19:32.836504 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
2026/06/10-16:19:32.843139 7f2fce7fc6c0 Delete type=0 #37
2026/06/10-16:19:32.855656 7f2fce7fc6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)
2026/07/01-15:26:29.318091 7f18beffd6c0 Recovering log #58
2026/07/01-15:26:29.363367 7f18beffd6c0 Delete type=3 #56
2026/07/01-15:26:29.363411 7f18beffd6c0 Delete type=0 #58
2026/07/01-17:09:44.878215 7f18be7fc6c0 Level-0 table #63: started
2026/07/01-17:09:44.878236 7f18be7fc6c0 Level-0 table #63: 0 bytes OK
2026/07/01-17:09:44.884157 7f18be7fc6c0 Delete type=0 #61
2026/07/01-17:09:44.903403 7f18be7fc6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)

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