Compare commits

...

11 Commits

Author SHA1 Message Date
uberwald 311091b262 Cleanup doc and licence info
Release Creation / build (release) Successful in 1m36s
2026-07-01 23:36:16 +02:00
uberwald 6f94521a88 UPdate images and licence info 2026-07-01 23:33:08 +02:00
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
180 changed files with 1687 additions and 1037 deletions
+4 -16
View File
@@ -1,19 +1,7 @@
IMAGES IMAGES :
- Exceptées les peties icônes N&B de d10 et celles de game-icon.org, CF images_info.md for details on the images used in this system.
les images des fichiers du dossier images utilisées dans ce logiciel sont : All icons : game-icons.net, free for commercial use, no attribution required.
Copyright © 2023-2024 Antre Monde Éditions ; All other images/background/logo : Provided by Antre Monde edition, no AI
elles sont leurs propriétés (et celles de leurs auteurs respectifs)
et elles ne peuvent ni être reproduites ni réutilisées en dehors de
ce logiciel, sans leur autorisation.
- les icônes rondes, blanches sur fond noir, sont issues du site game-icons.org
et sont sous licence https://creativecommons.org/licenses/by/3.0/
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
Code Author : Code Author :
- Developed by LeRatierBretonnien / www.uberwald.me - Developed by LeRatierBretonnien / www.uberwald.me
+4 -2
View File
@@ -4,10 +4,12 @@ Système [Foundry VTT](https://foundryvtt.com) pour **Chroniques de l'Etrange**,
Copyright 2025-2026 Antre Monde Editions All rights reserved Copyright 2025-2026 Antre Monde Editions All rights reserved
Chroniques de l'ETrange is a game written by Romain d'Huissier and Cédric Lameire. The authors retain their moral rights to this work in both print and digital formats. Chroniques de l'Etrange is a game written by Romain d'Huissier and Cédric Lameire. The authors retain their moral rights to this work in both print and digital formats.
This system for FoundryVTT has been approved and authorized by Antre-Monde Edition. This system for FoundryVTT has been approved and authorized by Antre-Monde Edition.
Ce système s'inspire d'un système précédent "chroniquesdeletrange" développé par David R.D. 'Mystery Man From Outerspace' Bercovici et Christophe 'Kristov / Qaw' Laudon. Le code a été intégralément réécrit pour être compatible avec la version 14 de FoundryVTT, et pour intégrer le maximum de mécaniques de jeu des Chroniques de l'Etrange, et n'a donc aucun lien de code avec le système précédent. Ce système n'a plus aucun lien avec le système précédent "chroniquesdeletrange" développé par David R.D. 'Mystery Man From Outerspace' Bercovici et Christophe 'Kristov / Qaw' Laudon. Le code a été intégralément réécrit pour être compatible avec la version 14 de FoundryVTT, et pour intégrer le maximum de mécaniques de jeu des Chroniques de l'Etrange, et n'a donc aucun lien de code avec le système précédent.
Les icones de jeu ont été intégralement remplacées par des icônes libres de droit provenant de [game-icons.net](https://game-icons.net/), et les images de personnages et de fonds d'écran ont été fournies par Antre Monde Éditions.
--- ---
+279 -54
View File
@@ -396,22 +396,17 @@ section.npc .cde-neon-tabs .item.active {
.cde-tab-body { .cde-tab-body {
flex: 1 1 0; flex: 1 1 0;
min-height: 0; min-height: 0;
display: flex;
flex-direction: column;
padding: 12px; padding: 12px;
background: #0d1520; background: #0d1520;
border: 1px solid #1a2436; border: 1px solid #1a2436;
border-top: none; border-top: none;
border-radius: 0 0 8px 8px; border-radius: 0 0 8px 8px;
overflow: hidden; overflow-y: auto;
} }
.cde-tab-body .tab { .cde-tab-body .tab {
display: none; display: none;
flex: 1 1 0;
min-height: 0;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
overflow-y: auto;
} }
.cde-tab-body .tab.active { .cde-tab-body .tab.active {
display: flex; display: flex;
@@ -452,25 +447,12 @@ section.npc .cde-neon-tabs .item.active {
flex-direction: column; flex-direction: column;
} }
.cde-notes-editor .editor { .cde-notes-editor .editor {
flex: 1 1 auto; flex: 1 1 0;
min-height: 200px; min-height: 200px;
height: 100%;
border-radius: 8px; border-radius: 8px;
border: 1px solid #1a2436; border: 1px solid #1a2436;
background: #101622; 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 { .cde-technique-card {
border-left: 3px solid #ff3d5a; border-left: 3px solid #ff3d5a;
background: rgba(16, 22, 34, 0.8); background: rgba(16, 22, 34, 0.8);
@@ -2179,25 +2161,6 @@ section.npc .cde-neon-tabs .item.active {
.cde-magic-toggle:hover i { .cde-magic-toggle:hover i {
color: #e2e8f4; 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 { .cde-magic-specialities {
border-top: 1px solid #1a2436; border-top: 1px solid #1a2436;
padding: 4px 0; padding: 4px 0;
@@ -2813,7 +2776,7 @@ section.npc .cde-neon-tabs .item.active {
margin-top: -2px; margin-top: -2px;
} }
#pause > img { #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; height: 192px;
width: 192px; width: 192px;
top: -45px; top: -45px;
@@ -3433,7 +3396,6 @@ ol.item-list li.item .item-controls a.item-control:hover {
font-family: 'Share Tech Mono', monospace; font-family: 'Share Tech Mono', monospace;
border-radius: 4px; border-radius: 4px;
border: 1px solid #1a2436; border: 1px solid #1a2436;
overflow: hidden;
} }
.cde-roll-result .cde-rr-header { .cde-roll-result .cde-rr-header {
display: flex; display: flex;
@@ -3542,12 +3504,6 @@ ol.item-list li.item .item-controls a.item-control:hover {
color: var(--rr-accent, #e2e8f4); color: var(--rr-accent, #e2e8f4);
text-shadow: 0 0 12px var(--rr-accent, transparent); 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 { .cde-roll-result .cde-rr-hero .cde-rr-spell-power .cde-rr-spell-power-label {
font-size: 9px; font-size: 9px;
font-weight: 700; font-weight: 700;
@@ -3666,8 +3622,8 @@ ol.item-list li.item .item-controls a.item-control:hover {
.cde-roll-result .cde-dice-grid { .cde-roll-result .cde-dice-grid {
display: grid; display: grid;
grid-template-columns: repeat(10, 1fr); grid-template-columns: repeat(10, 1fr);
gap: 3px; gap: 1px;
padding: 8px 8px 6px; padding: 6px 4px 4px;
border-top: 1px solid #1a2436; border-top: 1px solid #1a2436;
} }
.cde-roll-result .cde-dice-grid .cde-dice-cell { .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; color: #e2e8f4;
line-height: 1; 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 { .cde-initiative-prompt .cde-roll-field {
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
@@ -4499,3 +4450,277 @@ ol.item-list li.item .item-controls a.item-control:hover {
.cde-welcome-help-btn:hover { .cde-welcome-help-btn:hover {
filter: brightness(1.2); 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%);
}
+245 -55
View File
@@ -381,22 +381,17 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
.cde-tab-body { .cde-tab-body {
flex: 1 1 0; flex: 1 1 0;
min-height: 0; min-height: 0;
display: flex;
flex-direction: column;
padding: @cde-gap; padding: @cde-gap;
background: @cde-surface2; background: @cde-surface2;
border: 1px solid @cde-border; border: 1px solid @cde-border;
border-top: none; border-top: none;
border-radius: 0 0 @cde-radius @cde-radius; border-radius: 0 0 @cde-radius @cde-radius;
overflow: hidden; overflow-y: auto;
.tab { .tab {
display: none; display: none;
flex: 1 1 0;
min-height: 0;
flex-direction: column; flex-direction: column;
gap: @cde-gap; gap: @cde-gap;
overflow-y: auto;
} }
.tab.active { .tab.active {
@@ -450,26 +445,11 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
flex-direction: column; flex-direction: column;
.editor { .editor {
flex: 1 1 auto; flex: 1 1 0;
min-height: 200px; min-height: 200px;
height: 100%;
border-radius: @cde-radius; border-radius: @cde-radius;
border: 1px solid @cde-border; border: 1px solid @cde-border;
background: @cde-surface; 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; } &: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 // Specialities list
.cde-magic-specialities { .cde-magic-specialities {
border-top: 1px solid @cde-border; border-top: 1px solid @cde-border;
@@ -2844,7 +2807,7 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
} }
#pause > img { #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; height: 192px;
width: 192px; width: 192px;
top: -45px; top: -45px;
@@ -3473,7 +3436,6 @@ ol.item-list {
font-family: 'Share Tech Mono', monospace; font-family: 'Share Tech Mono', monospace;
border-radius: 4px; border-radius: 4px;
border: 1px solid @cde-border; border: 1px solid @cde-border;
overflow: hidden;
// ---- Header ---- // ---- Header ----
.cde-rr-header { .cde-rr-header {
@@ -3599,13 +3561,6 @@ ol.item-list {
text-shadow: 0 0 12px var(--rr-accent, transparent); 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 { .cde-rr-spell-power-label {
font-size: 9px; font-size: 9px;
font-weight: 700; font-weight: 700;
@@ -3740,8 +3695,8 @@ ol.item-list {
.cde-dice-grid { .cde-dice-grid {
display: grid; display: grid;
grid-template-columns: repeat(10, 1fr); grid-template-columns: repeat(10, 1fr);
gap: 3px; gap: 1px;
padding: 8px 8px 6px; padding: 6px 4px 4px;
border-top: 1px solid @cde-border; border-top: 1px solid @cde-border;
.cde-dice-cell { .cde-dice-cell {
@@ -3757,11 +3712,6 @@ ol.item-list {
line-height: 1; line-height: 1;
} }
.cde-dice-plate {
width: 100%;
border: none;
opacity: 0.65;
}
} }
} }
} }
@@ -4698,3 +4648,243 @@ ol.item-list {
filter: brightness(1.2); 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%); }
}
}
+368 -88
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) { function migrateItem(oldItem) {
switch (oldItem.type) { switch (oldItem.type) {
case "item": case "item":
@@ -321,6 +404,14 @@ function migrateItem(oldItem) {
return migrateSpellItem(oldItem); return migrateSpellItem(oldItem);
case "supernatural": case "supernatural":
return migrateSupernaturalItem(oldItem); return migrateSupernaturalItem(oldItem);
case "weapon":
return migrateWeaponItem(oldItem);
case "armor":
return migrateArmorItem(oldItem);
case "sanhei":
return migrateSanheiItem(oldItem);
case "ingredient":
return migrateIngredientItem(oldItem);
default: default:
return migrateEquipmentItem({ ...oldItem, type: "item" }); return migrateEquipmentItem({ ...oldItem, type: "item" });
} }
@@ -394,6 +485,7 @@ function migrateCharacter(old) {
resources, resources,
component, component,
magics, magics,
magicOrder: [],
threetreasures, threetreasures,
experience: { experience: {
value: Number(s.experience?.value ?? 0), value: Number(s.experience?.value ?? 0),
@@ -471,10 +563,12 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
icon: "fas fa-file-import", icon: "fas fa-file-import",
resizable: false resizable: false
}, },
position: { width: 560, height: "auto" }, position: { width: 600, height: "auto" },
actions: { actions: {
clearFiles: _CDEMigrationApp.#clearFiles, clearFiles: _CDEMigrationApp.#clearFiles,
doImport: _CDEMigrationApp.#doImport doImport: _CDEMigrationApp.#doImport,
confirmImport: _CDEMigrationApp.#confirmImport,
cancelImport: _CDEMigrationApp.#cancelImport
} }
}; };
static PARTS = { static PARTS = {
@@ -484,13 +578,28 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
#pending = []; #pending = [];
/** @type {string[]} - error messages per file */ /** @type {string[]} - error messages per file */
#errors = []; #errors = [];
/** @type {"idle"|"confirm"|"importing"} */
#importState = "idle";
/** @type {number} - actors created so far (during importing) */
#progress = 0;
async _prepareContext(options) { 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 { return {
pending: this.#pending, pending,
errors: this.#errors, errors: this.#errors,
hasPending: this.#pending.length > 0, hasPending: this.#pending.length > 0,
hasErrors: this.#errors.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. */ /** After render, wire up the file input. */
@@ -528,37 +637,59 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
const actors = parseLegacyJson(text); const actors = parseLegacyJson(text);
for (const actor of actors) { for (const actor of actors) {
actor._srcFile = file.name; actor._srcFile = file.name;
if (!this.#pending.some((p) => p.name === actor.name)) { if (this.#pending.some((p) => p.name === actor.name)) {
this.#pending.push(actor); 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) { } catch (err) {
this.#errors.push(game.i18n.format("CDE.MigrationErrorParse", { file: file.name, error: err.message })); this.#errors.push(game.i18n.format("CDE.MigrationErrorParse", { file: file.name, error: err.message }));
} }
} }
this.#importState = "idle";
this.render(); this.render();
} }
static async #clearFiles() { static async #clearFiles() {
this.#pending = []; this.#pending = [];
this.#errors = []; this.#errors = [];
this.#importState = "idle";
this.#progress = 0;
this.render(); this.render();
} }
/** First click: switch to confirmation state instead of importing immediately. */
static async #doImport() { static async #doImport() {
if (!this.#pending.length) return; 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 created = [];
const failed = []; const failed = [];
for (const data of this.#pending) { for (let i = 0; i < total; i++) {
const data = this.#pending[i];
try { try {
const { _srcFile, ...actorData } = data; const { _srcFile, ...actorData } = data;
const actor = await Actor.create(actorData); const actor = await Actor.create(actorData);
created.push(actor.name); created.push(actor.name);
} catch (err) { } catch (err) {
failed.push(`${data.name}: ${err.message}`); 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.#pending = [];
this.#errors = failed; this.#errors = failed;
this.#importState = "idle";
this.#progress = 0;
this.render(); this.render();
if (created.length) { if (created.length) {
ui.notifications.info( 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 // src/config/settings.js
@@ -669,15 +804,6 @@ function preLocalizeConfig() {
// src/config/runtime.js // src/config/runtime.js
function configureRuntime() { 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 // 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 // src/ui/helpers.js
function registerHandlebarsHelpers() { function registerHandlebarsHelpers() {
const { Handlebars } = globalThis; const { Handlebars } = globalThis;
@@ -1426,6 +1505,7 @@ async function rollInitiativeNPC(actor) {
} }
// src/ui/apps/singletons.js // src/ui/apps/singletons.js
var SOCKET_CHANNEL = `system.${SYSTEM_ID}`;
function getLoksyuData() { function getLoksyuData() {
return game.settings.get(SYSTEM_ID, "loksyuData") ?? { return game.settings.get(SYSTEM_ID, "loksyuData") ?? {
wood: { yin: 0, yang: 0 }, wood: { yin: 0, yang: 0 },
@@ -1435,16 +1515,75 @@ function getLoksyuData() {
water: { yin: 0, yang: 0 } water: { yin: 0, yang: 0 }
}; };
} }
async function setLoksyuData(data) { async function writeLoksyuData(data) {
await game.settings.set(SYSTEM_ID, "loksyuData", data); await game.settings.set(SYSTEM_ID, "loksyuData", data);
Hooks.callAll("cde:loksyuUpdated", 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() { function getTinjiValue() {
return game.settings.get(SYSTEM_ID, "tinjiData") ?? 0; return game.settings.get(SYSTEM_ID, "tinjiData") ?? 0;
} }
async function setTinjiValue(value) { async function setTinjiValue(value) {
await game.settings.set(SYSTEM_ID, "tinjiData", Math.max(0, value)); if (game.user.isGM) return writeTinjiValue(value);
Hooks.callAll("cde:tinjiUpdated", Math.max(0, 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) { async function updateLoksyuFromRoll(activeAspect, faces) {
const cycle = WU_XING_CYCLE[activeAspect]; const cycle = WU_XING_CYCLE[activeAspect];
@@ -1455,18 +1594,23 @@ async function updateLoksyuFromRoll(activeAspect, faces) {
const yinCount = faces[yinFace] ?? 0; const yinCount = faces[yinFace] ?? 0;
const yangCount = faces[yangFace] ?? 0; const yangCount = faces[yangFace] ?? 0;
if (yinCount === 0 && yangCount === 0) return; if (yinCount === 0 && yangCount === 0) return;
if (game.user.isGM) {
const data = getLoksyuData(); const data = getLoksyuData();
const current = data[lokAspect] ?? { yin: 0, yang: 0 }; const current = data[lokAspect] ?? { yin: 0, yang: 0 };
data[lokAspect] = { data[lokAspect] = { yin: (current.yin ?? 0) + yinCount, yang: (current.yang ?? 0) + yangCount };
yin: (current.yin ?? 0) + yinCount, await writeLoksyuData(data);
yang: (current.yang ?? 0) + yangCount } else {
}; game.socket.emit(SOCKET_CHANNEL, { action: "updateLoksyuFromRoll", activeAspect, faces });
await setLoksyuData(data); }
} }
async function updateTinjiFromRoll(count) { async function updateTinjiFromRoll(count) {
if (!count || count <= 0) return; if (!count || count <= 0) return;
if (game.user.isGM) {
const current = getTinjiValue(); const current = getTinjiValue();
await setTinjiValue(current + count); await writeTinjiValue(current + count);
} else {
game.socket.emit(SOCKET_CHANNEL, { action: "updateTinjiFromRoll", delta: count });
}
} }
// src/ui/rolling.js // src/ui/rolling.js
@@ -1482,12 +1626,13 @@ var LABELELEMENT_TO_ASPECT = {
"CDE.Fire": "fire", "CDE.Fire": "fire",
"CDE.Wood": "wood" "CDE.Wood": "wood"
}; };
var RANGE_MALUS = { var RANGE_ORDER = ["contact", "courte", "mediane", "longue", "extreme"];
contact: 0, var RANGE_LABELS = {
courte: 0, contact: "CDE.RangeContact",
mediane: -1, courte: "CDE.RangeCourte",
longue: -2, mediane: "CDE.RangeMediane",
extreme: -3 longue: "CDE.RangeLongue",
extreme: "CDE.RangeExtreme"
}; };
var WEAPON_TYPE_SKILL = { var WEAPON_TYPE_SKILL = {
melee: "kungfu", melee: "kungfu",
@@ -1587,6 +1732,13 @@ async function showMagicPrompt(params) {
}); });
} }
async function showWeaponPrompt(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({ return showRollPrompt({
title: params.title, title: params.title,
template: WEAPON_PROMPT_TEMPLATE, template: WEAPON_PROMPT_TEMPLATE,
@@ -1600,6 +1752,7 @@ async function showWeaponPrompt(params) {
weaponskill: params.weaponskill ?? "kungfu", weaponskill: params.weaponskill ?? "kungfu",
aspect: Number(params.aspect ?? 0), aspect: Number(params.aspect ?? 0),
effectiverange: params.effectiverange ?? "contact", effectiverange: params.effectiverange ?? "contact",
validRanges,
bonusmalus: params.bonusmalus ?? 0, bonusmalus: params.bonusmalus ?? 0,
woundmalus: params.woundmalus ?? 0, woundmalus: params.woundmalus ?? 0,
bonusauspiciousdice: params.bonusauspiciousdice ?? 0, bonusauspiciousdice: params.bonusauspiciousdice ?? 0,
@@ -1756,14 +1909,13 @@ async function rollForActor(actor, rollKey) {
const wpSkillDice = sys.skills?.[wpChosenSkill]?.value ?? 0; const wpSkillDice = sys.skills?.[wpChosenSkill]?.value ?? 0;
const wpAspFinal = Number(wParams.aspect ?? wpAspectIdx); const wpAspFinal = Number(wParams.aspect ?? wpAspectIdx);
const wpAspectDice = sys.aspect[ASPECT_NAMES[wpAspFinal]]?.value ?? 0; const wpAspectDice = sys.aspect[ASPECT_NAMES[wpAspFinal]]?.value ?? 0;
const wpRangeMalus = RANGE_MALUS[wParams.effectiverange ?? "contact"] ?? 0;
const wpBonusMalus = Number(wParams.bonusmalus ?? 0); const wpBonusMalus = Number(wParams.bonusmalus ?? 0);
const wpWoundMalus = Number(wParams.woundmalus ?? 0); const wpWoundMalus = Number(wParams.woundmalus ?? 0);
const wpBonusAusp = Number(wParams.bonusauspiciousdice ?? 0); const wpBonusAusp = Number(wParams.bonusauspiciousdice ?? 0);
const wpThrowMode = Number(wParams.typeofthrow ?? 0); const wpThrowMode = Number(wParams.typeofthrow ?? 0);
const wpDamageBase = wpItem.system.damageBase ?? 0; const wpDamageBase = wpItem.system.damageBase ?? 0;
const wpSpecialtyBonus = wpItem.system.hasSpeciality ? 1 : 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) { if (wpTotalDice <= 0) {
ui.notifications.warn(game.i18n.localize("CDE.Error0")); ui.notifications.warn(game.i18n.localize("CDE.Error0"));
return; return;
@@ -1775,7 +1927,6 @@ async function rollForActor(actor, rollKey) {
const wpResults = computeWuXingResults(wpFaces, wpAspectName, wpBonusAusp); const wpResults = computeWuXingResults(wpFaces, wpAspectName, wpBonusAusp);
if (!wpResults) return; if (!wpResults) return;
const wpModParts = []; 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 (wpBonusMalus !== 0) wpModParts.push(`${wpBonusMalus > 0 ? "+" : ""}${wpBonusMalus} ${game.i18n.localize("CDE.BonusMalus")}`);
if (wpWoundMalus !== 0) wpModParts.push(`-${wpWoundMalus} ${game.i18n.localize("CDE.WoundMalus")}`); if (wpWoundMalus !== 0) wpModParts.push(`-${wpWoundMalus} ${game.i18n.localize("CDE.WoundMalus")}`);
if (wpBonusAusp !== 0) wpModParts.push(`+${wpBonusAusp} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`); if (wpBonusAusp !== 0) wpModParts.push(`+${wpBonusAusp} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`);
@@ -2077,7 +2228,8 @@ var CDECharacterSheet = class _CDECharacterSheet extends CDEBaseActorSheet {
classes: ["character"], classes: ["character"],
actions: { actions: {
moveMagicUp: _CDECharacterSheet.#onMoveMagicUp, moveMagicUp: _CDECharacterSheet.#onMoveMagicUp,
moveMagicDown: _CDECharacterSheet.#onMoveMagicDown moveMagicDown: _CDECharacterSheet.#onMoveMagicDown,
recovery: _CDECharacterSheet.#onRecovery
} }
}; };
static PARTS = { static PARTS = {
@@ -2247,6 +2399,102 @@ var CDECharacterSheet = class _CDECharacterSheet extends CDEBaseActorSheet {
[order[idx], order[idx + 1]] = [order[idx + 1], order[idx]]; [order[idx], order[idx + 1]] = [order[idx + 1], order[idx]];
await this.document.update({ "system.magicOrder": order }); 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() { #bindComponentRandomize() {
const btn = this.element?.querySelector("[data-action='randomize-component']"); const btn = this.element?.querySelector("[data-action='randomize-component']");
if (!btn) return; if (!btn) return;
@@ -2550,6 +2798,8 @@ var CDELoksyuApp = class _CDELoksyuApp extends foundry.applications.api.Handleba
}; };
/** @type {Function|null} bound hook handler */ /** @type {Function|null} bound hook handler */
_updateHook = null; _updateHook = null;
/** @type {Function|null} updateSetting hook handler (for socket-propagated writes) */
_settingHook = null;
/** Singleton accessor — open or bring to front */ /** Singleton accessor — open or bring to front */
static open() { static open() {
const existing = Array.from(foundry.applications.instances.values()).find( 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) { _onRender(context, options) {
super._onRender(context, options); super._onRender(context, options);
this.#bindInputs(); this.#bindInputs();
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:loksyuUpdated", () => this.render()); 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) { _onClose(options) {
if (this._updateHook !== null) { if (this._updateHook !== null) {
Hooks.off("cde:loksyuUpdated", this._updateHook); Hooks.off("cde:loksyuUpdated", this._updateHook);
this._updateHook = null; this._updateHook = null;
} }
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook);
this._settingHook = null;
}
super._onClose(options); super._onClose(options);
} }
#bindInputs() { #bindInputs() {
@@ -2659,6 +2920,8 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
}; };
/** @type {Function|null} */ /** @type {Function|null} */
_updateHook = null; _updateHook = null;
/** @type {Function|null} */
_settingHook = null;
static open() { static open() {
const existing = Array.from(foundry.applications.instances.values()).find( const existing = Array.from(foundry.applications.instances.values()).find(
(app2) => app2 instanceof _CDETinjiApp (app2) => app2 instanceof _CDETinjiApp
@@ -2680,13 +2943,24 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
_onRender(context, options) { _onRender(context, options) {
super._onRender(context, options); super._onRender(context, options);
this.#bindDirectInput(); this.#bindDirectInput();
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:tinjiUpdated", () => this.render()); 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) { _onClose(options) {
if (this._updateHook !== null) { if (this._updateHook !== null) {
Hooks.off("cde:tinjiUpdated", this._updateHook); Hooks.off("cde:tinjiUpdated", this._updateHook);
this._updateHook = null; this._updateHook = null;
} }
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook);
this._settingHook = null;
}
super._onClose(options); super._onClose(options);
} }
#bindDirectInput() { #bindDirectInput() {
@@ -2943,8 +3217,7 @@ function refreshRollActions(rollCard, aspect, message) {
const tinji = getTinjiValue(); const tinji = getTinjiValue();
const successAvail = (loksyu[aspect]?.yin ?? 0) + (loksyu[aspect]?.yang ?? 0); const successAvail = (loksyu[aspect]?.yin ?? 0) + (loksyu[aspect]?.yang ?? 0);
const fasteAvail = (loksyu[fasteAspect]?.yin ?? 0) + (loksyu[fasteAspect]?.yang ?? 0); const fasteAvail = (loksyu[fasteAspect]?.yin ?? 0) + (loksyu[fasteAspect]?.yang ?? 0);
const isGM = game.user.isGM; const hasSomething = successAvail > 0 || fasteAvail > 0 || tinji > 0;
const hasSomething = successAvail > 0 || fasteAvail > 0 || isGM && tinji > 0;
if (!hasSomething) return; if (!hasSomething) return;
const aspLabel = game.i18n.localize(ASPECT_LABELS[aspect]); const aspLabel = game.i18n.localize(ASPECT_LABELS[aspect]);
const fasteLabel = game.i18n.localize(ASPECT_LABELS[fasteAspect]); 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> <span class="cde-roll-action-count">${fasteAvail}</span>
</button>`; </button>`;
} }
if (isGM && tinji > 0) { if (tinji > 0) {
btns += `<button class="cde-roll-action-btn cde-roll-action--tinji" data-action="tinji"> 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-tinji-char">\u5929</span>
<span class="cde-roll-action-label">${game.i18n.localize("CDE.TinJi2")}</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--; else entry.yin--;
} }
data[aspect] = entry; data[aspect] = entry;
if (game.user.isGM) {
await setLoksyuData(data); await setLoksyuData(data);
} else {
requestLoksyuDraw(aspect, order);
}
const flags = message?.flags?.[SYSTEM_ID]; const flags = message?.flags?.[SYSTEM_ID];
if (flags?.rollResult && message.isOwner) { if (flags?.rollResult && message.isOwner) {
const updated = foundry.utils.deepClone(flags.rollResult); const updated = foundry.utils.deepClone(flags.rollResult);
@@ -3055,13 +3332,16 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
}); });
} }
async function _spendTinjiPostRoll() { async function _spendTinjiPostRoll() {
if (!game.user.isGM) return;
const current = getTinjiValue(); const current = getTinjiValue();
if (current <= 0) { if (current <= 0) {
ui.notifications.warn(game.i18n.localize("CDE.TinjiEmpty")); ui.notifications.warn(game.i18n.localize("CDE.TinjiEmpty"));
return; return;
} }
if (game.user.isGM) {
await setTinjiValue(current - 1); await setTinjiValue(current - 1);
} else {
requestTinjiSpend();
}
await ChatMessage.create({ await ChatMessage.create({
user: game.user.id, user: game.user.id,
content: `<div class="cde-tinji-spend-msg"> content: `<div class="cde-tinji-spend-msg">
@@ -3212,13 +3492,13 @@ Hooks.once("init", async () => {
}); });
await preloadPartials(); await preloadPartials();
registerHandlebarsHelpers(); registerHandlebarsHelpers();
registerDice();
console.info(`CHRONIQUESDELETRANGE | Initialized`); console.info(`CHRONIQUESDELETRANGE | Initialized`);
}); });
Hooks.once("ready", async () => { Hooks.once("ready", async () => {
await migrateIfNeeded(); await migrateIfNeeded();
await loadWelcomeSceneIfNeeded(); await loadWelcomeSceneIfNeeded();
CDEWheelApp.registerHooks(); CDEWheelApp.registerHooks();
registerSingletonSocket();
if (game.user.isGM) showWelcomeMessage(); if (game.user.isGM) showWelcomeMessage();
}); });
Hooks.on("renderChatLog", (_app, html) => { 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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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"> <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>
<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>

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

+80
View File
@@ -0,0 +1,80 @@
# Images du système
## `images/` — racine
| Fichier | Description |
|---|---|
| `cde_bois.webp` | Icône Wu Xing — Bois | game-icons.net
| `cde_eau.webp` | Icône Wu Xing — Eau | game-icons.net
| `cde_feu.webp` | Icône Wu Xing — Feu | game-icons.net
| `cde_metal.webp` | Icône Wu Xing — Métal | game-icons.net
| `cde_terre.webp` | Icône Wu Xing — Terre | game-icons.net
| `cde_yang.webp` | Icône polarité Yang | game-icons.net
| `cde_yin.webp` | Icône polarité Yin | game-icons.net
| `logo_cde.webp` | Logo du jeu | Provided by Antre Monde edition, no AI
| `logo_jeu.webp` | Logo secondaire | Provided by Antre Monde edition, no AI
| `loksyu.webp` | Diagramme Loksyu (complet) | Provided by Antre Monde edition, no AI
| `loksyu_fd_trans.webp` | Diagramme Loksyu (fond transparent) | Provided by Antre Monde edition, no AI
| `loksyu_long.webp` | Diagramme Loksyu (horizontal) | Provided by Antre Monde edition, no AI
| `nghang.webp` | Diagramme Ng Hang (complet) |
| `nghang_long.webp` | Diagramme Ng Hang (horizontal) | Provided by Antre Monde edition, no AI
| `yin_yang.webp` | Symbole Yin-Yang | Provided by Antre Monde edition, no AI
## `images/background/` — arrière-plans
| Fichier | Description |
|---|---|
| `accueil.webp` | Fond de l'écran d'accueil | Provided by Antre Monde edition, no AI
| `carte_cde.webp` | Carte du monde CdE | Provided by Antre Monde edition, no AI
| `carte_hk.webp` | Carte de Hong Kong | Provided by Antre Monde edition, no AI
| `ecran.webp` | Fond d'écran générique | Provided by Antre Monde edition, no AI
| `loksyu_whole.webp` | Diagramme Loksyu (pleine page) | Provided by Antre Monde edition, no AI
| `nghang_whole.webp` | Diagramme Ng Hang (pleine page) | Provided by Antre Monde edition, no AI
## `images/fat_si/` — portraits de personnages prétirés
| Fichier | Personnage |
|---|---|
| `billy.webp` | Billy | Provided by Antre Monde edition, no AI
| `brenda.webp` | Brenda | Provided by Antre Monde edition, no AI
| `danny.webp` | Danny |Provided by Antre Monde edition, no AI
| `emerson.webp` | Emerson | Provided by Antre Monde edition, no AI
| `freddie.webp` | Freddie | Provided by Antre Monde edition, no AI
| `lily.webp` | Lily | Provided by Antre Monde edition, no AI
| `maggie.webp` | Maggie | Provided by Antre Monde edition, no AI
| `mallory.webp` | Mallory | Provided by Antre Monde edition, no AI
| `penny.webp` | Penny | Provided by Antre Monde edition, no AI
| `sam.webp` | Sam | Provided by Antre Monde edition, no AI
## `images/icons/` — icônes d'équipement et de type
| Fichier | Usage |
|---|---|
| `icon-armor.svg` | Icône armure | game-icons.net
| `icon-ingredient.svg` | Icône ingrédient | game-icons.net
| `icon-item.svg` | Icône équipement générique | game-icons.net
| `icon-kungfu.svg` | Icône art martial | game-icons.net
| `icon-npc-demon.svg` | Icône PNJ — démon |game-icons.net
| `icon-npc-dieu.svg` | Icône PNJ — dieu/divinité | game-icons.net
| `icon-npc-esprit-animal.svg` | Icône PNJ — esprit animal | game-icons.net
| `icon-sanhei.svg` | Icône sanhei |
| `icon-spell.svg` | Icône sortilège | game-icons.net
| `icon-supernatural.svg` | Icône capacité surnaturelle | game-icons.net
| `icon-weapon.svg` | Icône arme | game-icons.net
## `images/ui/` — captures d'écran de l'interface
| Fichier | Description |
|---|---|
| `character-sheet-items.png` | Feuille perso — onglet Équipement | Screenshot of the system
| `character-sheet-kungfu.png` | Feuille perso — onglet Kung-Fu | Screenshot of the system
| `character-sheet-magics.png` | Feuille perso — onglet Magies | Screenshot of the system
| `character-sheet-nghang.png` | Feuille perso — onglet Nghang | Screenshot of the system
| `character-sheet-skills.png` | Feuille perso — onglet Compétences | Screenshot of the system
| `character-sheet-treasures.png` | Feuille perso — onglet Trésors | Screenshot of the system
| `initiative-wheel.png` | Roue d'initiative | Screenshot of the system
| `loksyu-app.png` | Application Loksyu autonome | Screenshot of the system
| `migration-dialog.png` | Dialogue d'import/migration | Screenshot of the system
| `npc-sheet.png` | Feuille de PNJ | Screenshot of the system
| `roll-dialog.png` | Dialogue de jet | Screenshot of the system
| `roll-result-chat.png` | Résultat de jet dans le chat | Screenshot of the system
+11
View File
@@ -150,6 +150,11 @@
"CDE.MigrationPartialError": "{count} personnage(s) n'ont pas pu être importés.", "CDE.MigrationPartialError": "{count} personnage(s) n'ont pas pu être importés.",
"CDE.MigrationErrorNotJson": "Le fichier « {file} » n'est pas un fichier JSON.", "CDE.MigrationErrorNotJson": "Le fichier « {file} » n'est pas un fichier JSON.",
"CDE.MigrationErrorParse": "Erreur lors de la lecture de « {file} » : {error}", "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.InitiativeWheel": "Roue d'Initiative",
"CDE.InitiativeWheelOpen": "Ouvrir la Roue d'Initiative", "CDE.InitiativeWheelOpen": "Ouvrir la Roue d'Initiative",
"CDE.InitiativeWheelHint": "Roue d'initiative Les Chroniques de l'Étrange", "CDE.InitiativeWheelHint": "Roue d'initiative Les Chroniques de l'Étrange",
@@ -280,6 +285,12 @@
"CDE.RealizationTimeAccelerated": "Temps de Réalisation (Accéléré)", "CDE.RealizationTimeAccelerated": "Temps de Réalisation (Accéléré)",
"CDE.RealizationTimeRitual": "Temps de Réalisation (Rituel)", "CDE.RealizationTimeRitual": "Temps de Réalisation (Rituel)",
"CDE.Reference": "Référence", "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.Renowned": "Renommé",
"CDE.ResourceMax": "Max", "CDE.ResourceMax": "Max",
"CDE.ResourceMin": "Min", "CDE.ResourceMin": "Min",
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040 MANIFEST-000064

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