diff --git a/css/bol.css b/css/bol.css
index cdfca74..d8bec7f 100644
--- a/css/bol.css
+++ b/css/bol.css
@@ -12,6 +12,20 @@
font-display: swap;
src: url(https://fonts.gstatic.com/s/contrailone/v10/eLGbP-j_JA-kG0_Zo51noafdZQ.ttf) format('truetype');
}
+@font-face {
+ font-family: 'Orbitron';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6BoWgz.woff2) format('woff2');
+}
+@font-face {
+ font-family: 'Orbitron';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyKS6BoWgz.woff2) format('woff2');
+}
@font-face {
font-family: "CCMeanwhile";
src: url('../fonts/ccmeanwhile-regular.ttf');
@@ -230,6 +244,9 @@ ul.no-bullets {
/* ----------------------------------------- */
/* Form Styles */
/* ----------------------------------------- */
+.bol {
+ /* Hide number input spinners */
+}
.bol input[readonly="true"] {
border: none;
color: dimgray;
@@ -248,6 +265,15 @@ ul.no-bullets {
border: none;
box-shadow: none;
}
+.bol input[type="number"]::-webkit-inner-spin-button,
+.bol input[type="number"]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+.bol input[type="number"] {
+ -moz-appearance: textfield;
+ appearance: textfield;
+}
.bol input:disabled:hover,
.bol select:disabled:hover,
.bol textarea:disabled:hover,
@@ -761,20 +787,30 @@ ul.no-bullets {
font-weight: bold;
}
.message-header h2.critical {
- color: green;
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #1a7a1a;
font-weight: bold;
+ font-size: 1.1rem;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}
.message-header h2.fumble {
- color: red;
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #8b0000;
font-weight: bold;
+ font-size: 1.1rem;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}
.message-header h2.success {
- color: darkgreen;
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #1a5c1a;
font-weight: bold;
+ font-size: 1.05rem;
}
.message-header h2.failure {
+ font-family: "Wolfsbane2Expanded", cursive;
color: darkred;
font-weight: bold;
+ font-size: 1.05rem;
}
.message-header h2.roll {
color: darkslategrey;
@@ -790,39 +826,667 @@ h2.bad {
}
.chat-message {
margin: 3px;
- padding: 10px;
- font-size: 14px;
- border-radius: 0;
- background-color: white;
- background-image: url("/systems/bol/ui/box-border-large.webp");
- background-repeat: no-repeat;
- background-size: 100% 100%;
+ padding: 6px 8px;
+ font-size: 13px;
+ border-radius: 3px;
+ background-color: #faf7f2;
+ border: 1px solid #d4c8b0;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
}
.chat-message .message-header .flavor-text {
font-family: "IMFellDWPicaSC-Regular", serif;
font-size: 14px;
}
.chat-message .message-header .flavor-text h2 {
- font-family: "Modesto Condensed", "Palatino Linotype", serif;
- font-size: 20px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.1rem;
+ margin: 2px 0;
+}
+.chat-message h2.success,
+.chat-message h2.failure,
+.chat-message h2.critical,
+.chat-message h2.fumble {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 4px 10px;
+ border-radius: 4px;
+ margin: 0 0 6px 0;
+ font-size: 1rem;
+ letter-spacing: 0.5px;
+}
+.chat-message h2.success i,
+.chat-message h2.failure i,
+.chat-message h2.critical i,
+.chat-message h2.fumble i {
+ font-size: 0.9em;
+}
+.chat-message h2.success,
+.chat-message h2.critical {
+ background: linear-gradient(135deg, #1a5c1a20, #2d7a2d15);
+ border: 1px solid #4caf5040;
+ color: #1a5c1a;
+}
+.chat-message h2.critical {
+ background: linear-gradient(135deg, #1a5c1a30, #2d7a2d25);
+ border-color: #4caf5070;
+}
+.chat-message h2.failure {
+ background: linear-gradient(135deg, #7a000015, #8b000010);
+ border: 1px solid #8b000030;
+ color: #8b0000;
+}
+.chat-message h2.fumble {
+ background: linear-gradient(135deg, #7a000025, #8b000020);
+ border: 1px solid #8b000060;
+ color: #6b0000;
+}
+.chat-message h3 {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.95rem;
+ color: #191813;
+ margin: 2px 0 5px 0;
+ border-bottom: 1px solid #d4c8b0;
+ padding-bottom: 3px;
+ letter-spacing: 0.3px;
+}
+.chat-message .chat-icon {
+ float: right;
+ border: 1px solid #c4a882;
+ box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25);
+ border-radius: 3px;
+ margin: 0 0 4px 6px;
+ width: 52px;
+ height: 52px;
+ object-fit: cover;
+}
+.chat-message .actions-section {
+ font-size: 0.82rem;
+ color: #4b4a44;
+ line-height: 1.4;
+}
+.chat-message .actions-section > div {
+ margin: 2px 0;
+}
+.chat-message .chat-button,
+.chat-message .chat-damage-roll,
+.chat-message .chat-damage-apply,
+.chat-message .damage-handling,
+.chat-message .recup-vitalite {
+ display: block;
+ width: 100%;
+ margin: 3px 0;
+ padding: 4px 10px;
+ background: linear-gradient(135deg, #2a2a2a, #4b4a44);
+ color: #e8e0d0;
+ border: 1px solid #2a2a2a;
+ border-radius: 4px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.82rem;
+ letter-spacing: 0.4px;
+ cursor: pointer;
+ text-align: center;
+ transition: background 0.15s;
+}
+.chat-message .chat-button:hover,
+.chat-message .chat-damage-roll:hover,
+.chat-message .chat-damage-apply:hover,
+.chat-message .damage-handling:hover,
+.chat-message .recup-vitalite:hover {
+ background: linear-gradient(135deg, #3a3a3a, #5b5a54);
+}
+.chat-message .chat-button.hero-reroll,
+.chat-message .chat-damage-roll.hero-reroll,
+.chat-message .chat-damage-apply.hero-reroll,
+.chat-message .damage-handling.hero-reroll,
+.chat-message .recup-vitalite.hero-reroll {
+ background: linear-gradient(135deg, #7a5500, #a07000);
+ border-color: #6a4500;
+}
+.chat-message .chat-button.hero-reroll:hover,
+.chat-message .chat-damage-roll.hero-reroll:hover,
+.chat-message .chat-damage-apply.hero-reroll:hover,
+.chat-message .damage-handling.hero-reroll:hover,
+.chat-message .recup-vitalite.hero-reroll:hover {
+ background: linear-gradient(135deg, #9a6500, #c08000);
+}
+.chat-message .chat-button.transform-heroic-roll,
+.chat-message .chat-damage-roll.transform-heroic-roll,
+.chat-message .chat-damage-apply.transform-heroic-roll,
+.chat-message .damage-handling.transform-heroic-roll,
+.chat-message .recup-vitalite.transform-heroic-roll,
+.chat-message .chat-button.transform-legendary-roll,
+.chat-message .chat-damage-roll.transform-legendary-roll,
+.chat-message .chat-damage-apply.transform-legendary-roll,
+.chat-message .damage-handling.transform-legendary-roll,
+.chat-message .recup-vitalite.transform-legendary-roll {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+}
+.chat-message .chat-button.transform-heroic-roll:hover,
+.chat-message .chat-damage-roll.transform-heroic-roll:hover,
+.chat-message .chat-damage-apply.transform-heroic-roll:hover,
+.chat-message .damage-handling.transform-heroic-roll:hover,
+.chat-message .recup-vitalite.transform-heroic-roll:hover,
+.chat-message .chat-button.transform-legendary-roll:hover,
+.chat-message .chat-damage-roll.transform-legendary-roll:hover,
+.chat-message .chat-damage-apply.transform-legendary-roll:hover,
+.chat-message .damage-handling.transform-legendary-roll:hover,
+.chat-message .recup-vitalite.transform-legendary-roll:hover {
+ background: linear-gradient(135deg, #9b0000, #c00000);
+}
+.chat-message .chat-damage-roll[data-damage-mode="normal-damage"] {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+}
+.chat-message .chat-damage-roll[data-damage-mode="normal-damage"]:hover {
+ background: linear-gradient(135deg, #9b0000, #c00000);
+}
+.chat-message .chat-damage-roll[data-damage-mode^="damage-plus"] {
+ background: linear-gradient(135deg, #5a0070, #7a00a0);
+ border-color: #4a0060;
+}
+.chat-message .chat-damage-roll[data-damage-mode^="damage-plus"]:hover {
+ background: linear-gradient(135deg, #7a0090, #9a00c0);
+}
+.chat-message .chat-damage-apply {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+}
+.chat-message .chat-damage-apply:hover {
+ background: linear-gradient(135deg, #9b0000, #c00000);
+}
+.chat-message .recup-vitalite {
+ background: linear-gradient(135deg, #1a5c1a, #2d7a2d);
+ border-color: #1a4a1a;
+}
+.chat-message .recup-vitalite:hover {
+ background: linear-gradient(135deg, #2a7a2a, #3d9a3d);
+}
+.chat-message .damage-handling {
+ background: linear-gradient(135deg, #7a5500, #a07000);
+ border-color: #6a4500;
+}
+.chat-message .damage-handling:hover {
+ background: linear-gradient(135deg, #9a6500, #c08000);
+}
+.chat-message .damage-handling[data-defense-mode="damage-not-applied"] {
+ background: linear-gradient(135deg, #1a5c1a, #2d7a2d);
+ border-color: #1a4a1a;
+}
+.chat-message .damage-handling[data-defense-mode="damage-not-applied"]:hover {
+ background: linear-gradient(135deg, #2a7a2a, #3d9a3d);
+}
+.chat-message .damage-handling[data-defense-mode="hero-in-extremis"],
+.chat-message .damage-handling[data-defense-mode="hero-reduce-damage"] {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+}
+.chat-message .damage-handling[data-defense-mode="hero-in-extremis"]:hover,
+.chat-message .damage-handling[data-defense-mode="hero-reduce-damage"]:hover {
+ background: linear-gradient(135deg, #9b0000, #c00000);
+}
+.chat-message .bol-damage-card .damage-card-header,
+.chat-message .bol-defense-card .damage-card-header,
+.chat-message .bol-damage-card .defense-card-header,
+.chat-message .bol-defense-card .defense-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 6px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+}
+.chat-message .bol-damage-card .damage-card-header .damage-weapon-img,
+.chat-message .bol-defense-card .damage-card-header .damage-weapon-img,
+.chat-message .bol-damage-card .defense-card-header .damage-weapon-img,
+.chat-message .bol-defense-card .defense-card-header .damage-weapon-img {
+ width: 44px;
+ height: 44px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25);
+ object-fit: cover;
+ flex: 0 0 44px;
+}
+.chat-message .bol-damage-card .damage-card-header .damage-card-title,
+.chat-message .bol-defense-card .damage-card-header .damage-card-title,
+.chat-message .bol-damage-card .defense-card-header .damage-card-title,
+.chat-message .bol-defense-card .defense-card-header .damage-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-card-label,
+.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-card-label,
+.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-card-label,
+.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-card-label {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.75rem;
+ color: #7a0000;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+}
+.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-weapon-name,
+.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-weapon-name,
+.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-weapon-name,
+.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-weapon-name {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+ letter-spacing: 0.3px;
+}
+.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-formula,
+.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-formula,
+.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-formula,
+.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-formula {
+ font-size: 0.78rem;
+ color: #6b6b5a;
+ font-style: italic;
+}
+.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-total-badge,
+.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-total-badge,
+.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-total-badge,
+.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-total-badge {
+ display: inline-block;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ color: #e8d890;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.2rem;
+ font-weight: bold;
+ padding: 1px 10px;
+ border-radius: 4px;
+ letter-spacing: 1px;
+ align-self: flex-start;
+}
+.chat-message .bol-damage-card .damage-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit,
+.chat-message .bol-defense-card .damage-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit,
+.chat-message .bol-damage-card .defense-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit,
+.chat-message .bol-defense-card .defense-card-header .damage-card-title .damage-total-badge.damage-total-badge--hit {
+ background: linear-gradient(135deg, #7a5500, #a07000);
+}
+.chat-message .bol-damage-card .damage-target,
+.chat-message .bol-defense-card .damage-target {
+ font-size: 0.8rem;
+ color: #4b4a44;
+ font-style: italic;
+ margin-bottom: 4px;
+}
+.chat-message .bol-damage-card .damage-note,
+.chat-message .bol-defense-card .damage-note {
+ font-size: 0.78rem;
+ color: #4b4a44;
+ padding: 2px 6px;
+ margin-bottom: 4px;
+ border-left: 2px solid #c4a882;
+}
+.chat-message .bol-damage-card .damage-note.damage-note--warn,
+.chat-message .bol-defense-card .damage-note.damage-note--warn {
+ border-left-color: darkred;
+ color: darkred;
+}
+.chat-message .bol-damage-card .defense-hero-separator,
+.chat-message .bol-defense-card .defense-hero-separator {
+ text-align: center;
+ font-size: 0.72rem;
+ color: #8b7355;
+ font-family: "IMFellDWPicaSC-Regular", serif;
+ font-style: italic;
+ margin: 3px 0 1px;
+}
+.chat-message .bol-damage-card .defense-footer-note,
+.chat-message .bol-defense-card .defense-footer-note {
+ font-size: 0.72rem;
+ color: #8b7355;
+ font-style: italic;
+ text-align: center;
+ margin-top: 4px;
+ padding-top: 3px;
+ border-top: 1px dashed #d4c8b0;
+}
+.chat-message .bol-defense-summary-card .defense-summary-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 6px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+}
+.chat-message .bol-defense-summary-card .defense-summary-header .damage-weapon-img {
+ width: 44px;
+ height: 44px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25);
+ object-fit: cover;
+ flex: 0 0 44px;
+}
+.chat-message .bol-defense-summary-card .defense-summary-details {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.chat-message .bol-defense-summary-card .defense-detail {
+ font-size: 0.82rem;
+ color: #4b4a44;
+ padding: 1px 4px;
+ border-left: 2px solid #c4a882;
+}
+.chat-message .bol-defense-summary-card .defense-detail.warning {
+ border-left-color: darkred;
+ color: darkred;
+}
+.chat-message .bol-defense-summary-card .defense-final {
+ margin-top: 5px;
+ padding: 3px 8px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+ background: #f0ece0;
+ border-radius: 3px;
+ border-left: 3px solid darkred;
+}
+.chat-message .bol-defense-summary-card .defense-final.defense-final--safe {
+ border-left-color: #4a7a4a;
+ color: #2a5a2a;
+ background: #e8f5e8;
+}
+.chat-message .bol-defense-summary-card .damage-total-badge--none {
+ background: linear-gradient(135deg, #4a7a4a, #2d5a2d) !important;
+}
+.chat-message .bol-vitality-card .vitality-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 6px;
+ padding-bottom: 5px;
+ border-bottom: 2px solid #4b1010;
+}
+.chat-message .bol-vitality-card .vitality-card-header .damage-weapon-img {
+ width: 44px;
+ height: 44px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.25);
+ object-fit: cover;
+ flex: 0 0 44px;
+}
+.chat-message .bol-vitality-card .vitality-card-body {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.chat-message .bol-vitality-card .vitality-detail {
+ font-size: 0.82rem;
+ color: #4b4a44;
+ padding: 1px 4px;
+ border-left: 2px solid #c4a882;
+}
+.chat-message .bol-vitality-card .vitality-hint {
+ font-size: 0.78rem;
+ color: #6b6b5a;
+ font-style: italic;
+ padding-left: 6px;
+}
+.chat-message .bol-vitality-card .vitality-dead {
+ margin-top: 4px;
+ padding: 3px 8px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #f0e8d0;
+ background: linear-gradient(135deg, #4b1010, #7a0000);
+ border-radius: 3px;
+}
+.chat-message .bol-vitality-card .vitality-epitaph {
+ font-size: 0.78rem;
+ color: #6b6b5a;
+ font-style: italic;
+ text-align: center;
+ margin-top: 3px;
+}
+.chat-message .bol-spell-card {
+ margin: 6px 0;
+}
+.chat-message .bol-spell-card .spell-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 5px 0;
+ border-bottom: 1px solid #d4c8b0;
+}
+.chat-message .bol-spell-card .spell-card-header .spell-img {
+ width: 40px;
+ height: 40px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ object-fit: cover;
+ flex: 0 0 40px;
+}
+.chat-message .bol-spell-card .spell-card-header .spell-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-name {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+}
+.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+}
+.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats .spell-stat-badge {
+ display: inline-block;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.72rem;
+ padding: 1px 7px;
+ border-radius: 3px;
+ letter-spacing: 0.3px;
+}
+.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats .spell-stat-badge.cost {
+ background: linear-gradient(135deg, #3a0080, #6a00c0);
+ color: #e8d0ff;
+ border: 1px solid #5a00a0;
+}
+.chat-message .bol-spell-card .spell-card-header .spell-card-title .spell-stats .spell-stat-badge.remaining {
+ background: linear-gradient(135deg, #1a4a6a, #2a6a9a);
+ color: #d0e8ff;
+ border: 1px solid #1a3a5a;
+}
+.chat-message .bol-alchemy-card {
+ margin: 6px 0;
+}
+.chat-message .bol-alchemy-card .alchemy-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+}
+.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-img {
+ width: 40px;
+ height: 40px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ object-fit: cover;
+ flex: 0 0 40px;
+}
+.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-card-title .alchemy-name {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+}
+.chat-message .bol-alchemy-card .alchemy-card-header .alchemy-card-title .alchemy-stat-badge {
+ display: inline-block;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.72rem;
+ padding: 1px 7px;
+ border-radius: 3px;
+ background: linear-gradient(135deg, #5a3a00, #8a6000);
+ color: #ffe0a0;
+ border: 1px solid #4a3000;
+}
+.chat-message .bol-alchemy-card .alchemy-result {
+ font-size: 0.78rem;
+ font-style: italic;
+ padding: 4px 6px;
+ margin-top: 5px;
+ border-radius: 3px;
+ line-height: 1.4;
+}
+.chat-message .bol-alchemy-card .alchemy-result.success {
+ color: #1a4a1a;
+ background: #e8f5e8;
+ border: 1px solid #a0d0a0;
+}
+.chat-message .bol-alchemy-card .alchemy-result.failure {
+ color: #4a1a1a;
+ background: #f5e8e8;
+ border: 1px solid #d0a0a0;
+}
+.chat-message .bol-horoscope-card {
+ margin: 6px 0;
+}
+.chat-message .bol-horoscope-card .horoscope-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+}
+.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-icon {
+ font-size: 1.6rem;
+ color: #8a6500;
+ flex: 0 0 auto;
+}
+.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-card-title .horoscope-type {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+}
+.chat-message .bol-horoscope-card .horoscope-card-header .horoscope-card-title .horoscope-stat-badge {
+ display: inline-block;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.72rem;
+ padding: 1px 7px;
+ border-radius: 3px;
+ background: linear-gradient(135deg, #6a5500, #a08000);
+ color: #ffe890;
+ border: 1px solid #5a4500;
+}
+.chat-message .bol-horoscope-card .horoscope-result .horoscope-text {
+ display: block;
+ font-size: 0.78rem;
+ font-style: italic;
+ padding: 4px 6px;
+ margin-top: 5px;
+ border-radius: 3px;
+ line-height: 1.4;
+}
+.chat-message .bol-horoscope-card .horoscope-result .horoscope-text.success {
+ color: #1a4a1a;
+ background: #e8f5e8;
+ border: 1px solid #a0d0a0;
+}
+.chat-message .bol-horoscope-card .horoscope-result .horoscope-text.failure {
+ color: #4a1a1a;
+ background: #f5e8e8;
+ border: 1px solid #d0a0a0;
}
.chat-message .message-content .dice-roll .dice-result .dice-formula {
- border-radius: 0px;
- border: 1px inset lightgray;
- background-color: #282828;
- color: white;
+ border-radius: 4px;
+ border: 1px solid #555;
+ background: linear-gradient(135deg, #1a1a1a, #2a2a2a);
+ color: #d0c8b8;
+ font-size: 0.8rem;
+ padding: 2px 8px;
+ text-align: center;
+ margin-bottom: 3px;
+}
+.chat-message .message-content .dice-roll .dice-result .dice-tooltip {
+ background: #1a1a1a;
+ border: 1px solid #444;
+ border-radius: 4px;
}
.chat-message .message-content .dice-roll .dice-result .dice-tooltip .tooltip-part .part-total {
- border-radius: 0px;
- border: 1px inset lightgray;
+ border-radius: 0;
+ border: 1px inset #444;
background-color: #2a2a2a;
- color: white;
+ color: #d0c8b8;
}
.chat-message .message-content .dice-roll .dice-result .dice-total {
- border-radius: 0px;
- border: 1px inset lightgray;
- background-color: #2a2a2a;
- color: white;
+ border-radius: 4px;
+ border: 2px solid #4b4a44;
+ background: linear-gradient(135deg, #191813, #2a2a2a);
+ color: #e8d890;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.4rem;
+ font-weight: bold;
+ letter-spacing: 1px;
+ padding: 2px 0;
+ margin-top: 3px;
+}
+.bol-welcome-card .welcome-header {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 8px;
+ padding-bottom: 6px;
+ border-bottom: 2px solid darkred;
+}
+.bol-welcome-card .welcome-header .welcome-logo {
+ width: 52px;
+ height: 52px;
+ object-fit: contain;
+ flex: 0 0 52px;
+}
+.bol-welcome-card .welcome-body {
+ font-size: 0.82rem;
+ color: #191813;
+ line-height: 1.4;
+}
+.bol-welcome-card .welcome-body p {
+ margin: 4px 0;
+ padding-left: 4px;
+ border-left: 2px solid #d4c8b0;
+}
+.bol-welcome-card .welcome-body a {
+ color: darkred;
+}
+.bol-welcome-card .welcome-footer {
+ margin-top: 8px;
+ padding: 4px 10px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.95rem;
+ color: #e8d890;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-radius: 4px;
+ letter-spacing: 0.5px;
+}
+.bol-welcome-card .welcome-warning {
+ margin-top: 6px;
+ padding: 4px 8px;
+ font-size: 0.8rem;
+ color: #7a0000;
+ background: #fff3f3;
+ border: 1px solid #e57373;
+ border-radius: 3px;
}
/* Component Styles */
/* ----------------------------------------- */
@@ -834,6 +1498,174 @@ body.system-bol img#logo {
.journal-page-content {
/* Reserved for future use */
}
+.bol.dialog > section.window-content {
+ background: white;
+ border: 10px solid transparent;
+ border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat;
+ border-image-outset: 1;
+ padding: 10px;
+}
+.bol.dialog .window-title {
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #4b4a44;
+}
+.bol.dialog .sheet-header {
+ text-align: center;
+ margin-bottom: 6px;
+ padding: 4px 0;
+ border-bottom: 2px solid darkred;
+}
+.bol.dialog .sheet-header h3 {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.3rem;
+ color: #191813;
+ margin: 0;
+}
+.bol.dialog .roll-box,
+.bol.dialog .box-roll,
+.bol.dialog div.flexrow:has(.bg-darkred) {
+ border-radius: 6px;
+ overflow: hidden;
+ margin-bottom: 1px;
+ background: #f5f0e8;
+ gap: 2px;
+}
+.bol.dialog .roll-box .bg-darkred,
+.bol.dialog .box-roll .bg-darkred,
+.bol.dialog div.flexrow:has(.bg-darkred) .bg-darkred {
+ padding: 4px 10px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.78rem;
+ letter-spacing: 0.6px;
+ border-radius: 5px;
+ margin: 2px 0 2px 2px;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
+}
+.bol.dialog .roll-box .cell,
+.bol.dialog .box-roll .cell,
+.bol.dialog div.flexrow:has(.bg-darkred) .cell {
+ background: transparent;
+ padding: 2px 6px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #191813;
+ flex-wrap: wrap;
+}
+.bol.dialog .roll-box .cell label.checkbox,
+.bol.dialog .box-roll .cell label.checkbox,
+.bol.dialog div.flexrow:has(.bg-darkred) .cell label.checkbox {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+}
+.bol.dialog select,
+.bol.dialog input[type="text"],
+.bol.dialog input[type="number"] {
+ background: transparent !important;
+ color: #191813 !important;
+ border: none !important;
+ box-shadow: none !important;
+ font-size: 0.88rem;
+ width: 100%;
+}
+.bol.dialog select option,
+.bol.dialog input[type="text"] option,
+.bol.dialog input[type="number"] option {
+ background: #f5f0e8;
+ color: #191813;
+}
+.bol.dialog select option:checked,
+.bol.dialog input[type="text"] option:checked,
+.bol.dialog input[type="number"] option:checked,
+.bol.dialog select option:hover,
+.bol.dialog input[type="text"] option:hover,
+.bol.dialog input[type="number"] option:hover {
+ background: darkred;
+ color: white;
+}
+.bol.dialog input:disabled {
+ color: #8b0000 !important;
+ font-weight: bold;
+ font-size: 0.95rem;
+}
+.bol.dialog .dice-options-cell {
+ display: flex !important;
+ flex-wrap: wrap;
+ gap: 4px;
+ padding: 4px 6px;
+ justify-content: center;
+}
+.bol.dialog .dice-options-cell .dice-option {
+ display: flex;
+ align-items: center;
+ gap: 3px;
+ padding: 2px 7px;
+ border-radius: 4px;
+ font-size: 0.82rem;
+ cursor: pointer;
+ white-space: nowrap;
+}
+.bol.dialog .dice-options-cell .dice-option input[type="radio"] {
+ margin: 0;
+}
+.bol.dialog .dice-options-cell .bdice-label {
+ background: #e8f5e8;
+ color: #1a5c1a;
+ border: 1px solid #4caf50;
+}
+.bol.dialog .dice-options-cell .neutral-label {
+ background: #f0ede5;
+ color: #4b4a44;
+ border: 1px solid #9e9e7a;
+}
+.bol.dialog .dice-options-cell .mdice-label {
+ background: #fce8e8;
+ color: #7a0000;
+ border: 1px solid #e57373;
+}
+.bol.sheet footer.form-footer,
+.bol.dialog footer.form-footer {
+ display: flex;
+ gap: 8px;
+ margin-top: 8px;
+ padding-top: 6px;
+ border-top: 2px solid darkred;
+}
+.bol.sheet footer.form-footer button,
+.bol.dialog footer.form-footer button {
+ flex: 1;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ color: white;
+ border: 1px solid #6b0000;
+ border-radius: 5px;
+ padding: 5px 10px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.95rem;
+ letter-spacing: 0.6px;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
+ cursor: pointer;
+ transition: background 0.15s;
+}
+.bol.sheet footer.form-footer button i,
+.bol.dialog footer.form-footer button i {
+ margin-right: 4px;
+}
+.bol.sheet footer.form-footer button:hover,
+.bol.dialog footer.form-footer button:hover {
+ background: linear-gradient(135deg, #9b0000, #c00000);
+}
+.bol.sheet footer.form-footer button[type="button"],
+.bol.dialog footer.form-footer button[type="button"] {
+ background: linear-gradient(135deg, #2a2a2a, #4b4a44);
+ border-color: #2a2a2a;
+}
+.bol.sheet footer.form-footer button[type="button"]:hover,
+.bol.dialog footer.form-footer button[type="button"]:hover {
+ background: linear-gradient(135deg, #3a3a3a, #5b5a54);
+}
.bol.sheet .window-header {
border: none;
}
@@ -907,6 +1739,12 @@ body.system-bol img#logo {
border-radius: 0.5rem;
text-align: center;
}
+.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .header-field-value[type="select"],
+.bol.sheet .window-content .bol-actor-form .sheet-header .header-field .header-field-group .header-field-value:is(select) {
+ border: 1px solid #4b4a44 !important;
+ border-radius: 0.5rem;
+ background-color: #2a2a2a30;
+}
.bol.sheet .window-content .bol-actor-form .sheet-header .header-buttons {
align-self: flex-end;
padding-bottom: 10px;
@@ -974,6 +1812,17 @@ body.system-bol img#logo {
margin-top: 6px;
margin-bottom: 6px;
}
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats .editor,
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats .editor-content,
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror {
+ color: #191813;
+}
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror .editor-content,
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror p,
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror div,
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.stats prose-mirror span {
+ color: #191813 !important;
+}
.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description .editor,
.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description .editor-content,
.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description prose-mirror {
@@ -996,6 +1845,12 @@ body.system-bol img#logo {
font-size: 0.95rem;
margin-left: 6px;
}
+.bol.sheet .window-content .bol-actor-form .main .sheet-body .tab.description select.header-field-value {
+ background-color: #2a2a2a30;
+ border: 1px solid #4b4a44 !important;
+ border-radius: 0.5rem;
+ color: #4b4a44;
+}
.sheet-profile-img {
cursor: pointer;
border: none;
@@ -1095,6 +1950,25 @@ body.system-bol img#logo {
.bol.sheet.actor .inc-dec-btns-resource:hover {
color: #4b4a44;
}
+.bol.sheet.actor .horde-stat-label {
+ font-weight: bold;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1rem;
+ font-variant: small-caps;
+ color: #4b4a44;
+ display: flex;
+ align-items: center;
+}
+.bol.sheet.actor .horde-stat-row {
+ align-items: center;
+ margin-bottom: 4px;
+}
+.bol.sheet.actor .horde-stat-sep {
+ color: #4b4a44;
+ font-weight: bold;
+ padding: 0 4px;
+ flex: 0;
+}
.bol.sheet.actor .bol-footer {
height: 62px;
max-height: 62px;
@@ -1293,11 +2167,153 @@ body.system-bol img#logo {
margin-bottom: 2px;
}
.character-summary-container {
- opacity: 0.95;
+ background: #f5f0e8;
+ padding: 4px;
}
-.character-summary-rollable {
+.character-summary-container .cs-table {
+ width: 100%;
+ margin: 0;
+}
+.character-summary-container .cs-section-header {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ padding: 4px 6px;
+ min-height: 28px;
+ align-items: center;
+ margin-top: 2px;
+}
+.character-summary-container .cs-section-header .item-name,
+.character-summary-container .cs-section-header .cs-name-col {
+ font-family: "Wolfsbane2Expanded", cursive !important;
+ font-size: 1.1em !important;
+ color: #fff !important;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+}
+.character-summary-container .cs-section-header .cs-group-header {
+ font-family: 'Signika', sans-serif !important;
+ font-size: 0.75em !important;
+ color: #ffdddd !important;
+ text-align: center;
+ justify-content: center;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ border-left: 1px solid rgba(255, 255, 255, 0.25);
+}
+.character-summary-container .cs-col-row {
+ background: #ede0cc;
+ min-height: 20px;
+ padding: 1px 6px;
+ align-items: center;
+ border-bottom: 1px solid #c8b89a;
+}
+.character-summary-container .cs-col-row .cs-col-header {
+ font-family: 'Signika', sans-serif !important;
+ font-size: 0.75em !important;
+ color: #7a0000 !important;
+ text-align: center;
+ justify-content: center;
+ font-weight: bold;
+}
+.character-summary-container .cs-portrait-col {
+ flex: 0 0 34px;
+ width: 34px;
+ min-width: 34px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.character-summary-container .cs-portrait {
+ width: 30px;
+ height: 30px;
+ border-radius: 3px;
+ border: 1px solid #c0a080;
+ object-fit: cover;
+}
+.character-summary-container .cs-name-col {
+ min-width: 9rem;
+ width: 9rem;
+}
+.character-summary-container .cs-actor-row {
+ min-height: 36px;
+ padding: 3px 4px;
+ border-bottom: 1px solid #d0c8b8;
+ align-items: center;
+ background: #faf6ee;
+ transition: background 0.15s;
+}
+.character-summary-container .cs-actor-row:hover {
+ background: #ede8dc;
+}
+.character-summary-container .cs-actor-name {
+ font-family: 'Signika', sans-serif;
+ font-size: 0.9em;
+ color: #7a0000;
+ font-weight: bold;
+ cursor: pointer;
+ text-decoration: none;
+}
+.character-summary-container .cs-actor-name:hover {
text-decoration: underline;
}
+.character-summary-container .cs-stat {
+ justify-content: center;
+ text-align: center;
+}
+.character-summary-container .cs-group-sep {
+ border-left: 1px solid #c0a878;
+}
+.character-summary-container .cs-col-row .cs-group-sep {
+ border-left: 1px solid #c0a878;
+}
+.character-summary-container .cs-rollable {
+ display: inline-block;
+ min-width: 1.8em;
+ text-align: center;
+ color: #333;
+ font-size: 0.88em;
+ font-weight: bold;
+ font-family: 'Orbitron', sans-serif;
+ border-radius: 3px;
+ padding: 1px 3px;
+ cursor: pointer;
+ text-decoration: none;
+}
+.character-summary-container .cs-rollable:hover {
+ background: darkred;
+ color: #fff;
+}
+.character-summary-container .cs-resource {
+ justify-content: center;
+ font-size: 0.82em;
+ color: #555;
+ gap: 1px;
+}
+.character-summary-container .cs-res-val {
+ color: #191813;
+ font-weight: bold;
+ font-family: 'Orbitron', sans-serif;
+}
+.character-summary-container .cs-res-sep {
+ color: #999;
+}
+.character-summary-container .cs-res-max {
+ color: #888;
+ font-family: 'Orbitron', sans-serif;
+}
+.character-summary-container .cs-input {
+ width: 3rem;
+ text-align: center;
+ border: 1px solid #c0a080;
+ border-radius: 3px;
+ padding: 2px 4px;
+ background: #fff;
+ font-size: 0.85em;
+}
+.character-summary-container .actor-delete {
+ color: #c0392b;
+}
+.character-summary-container .actor-delete:hover {
+ color: #e74c3c;
+}
.activated-green {
color: darkgreen;
}
@@ -1454,13 +2470,14 @@ body.system-bol img#logo {
.bol.sheet.item .window-content .bol.sheet.item .form-group {
display: flex;
flex-direction: row;
- align-items: center;
+ align-items: flex-start;
margin: 3px 0;
}
-.bol.sheet.item .window-content .bol.sheet.item .form-group label {
+.bol.sheet.item .window-content .bol.sheet.item .form-group > label:not(.checkbox) {
flex: 0 0 40%;
color: #191813;
font-weight: bold;
+ padding-top: 2px;
}
.bol.sheet.item .window-content .bol.sheet.item .form-group input[type="checkbox"] {
flex: 0 0 auto;
@@ -1477,6 +2494,11 @@ body.system-bol img#logo {
.bol.sheet.item .window-content .bol.sheet.item .form-group .form-fields {
flex: 1;
}
+.bol.sheet.item .window-content .bol.sheet.item .form-group .form-fields {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
.bol.sheet.item .window-content .bol.sheet.item label.checkbox {
display: flex;
flex-direction: row;
@@ -1490,6 +2512,12 @@ body.system-bol img#logo {
margin: 0;
flex: 0 0 auto;
}
+.bol.sheet.item .window-content .bol.sheet.item .vehicle-checkboxes {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 6px 16px;
+ padding: 4px 0;
+}
.bol.sheet.item .window-content .bol.sheet.item input[type="text"],
.bol.sheet.item .window-content .bol.sheet.item input[type="number"],
.bol.sheet.item .window-content .bol.sheet.item input[type="text"]:hover,
diff --git a/lang/en.json b/lang/en.json
index 2b3ba63..a798ac8 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -609,5 +609,10 @@
"BOL.settings.defaultLogoActorSheetPath" : "Path for Actor sheet logo",
"BOL.settings.defaultLogoPathActorSheetTooltip": "Path of the Actor sheet logo (346 x 200, default : /systems/bol/ui/logo.webp)",
"BOL.settings.defaultLogoTopLeftPath" : "Path for main top left logo",
- "BOL.settings.defaultLogoTopLeftPathTooltip": "Path of the logo in the top left window (718 x 416, default : /systems/bol/ui/logo2.webp)"
+ "BOL.settings.defaultLogoTopLeftPathTooltip": "Path of the logo in the top left window (718 x 416, default : /systems/bol/ui/logo2.webp)",
+
+ "BOL.ui.charSummaryTitle": "Character Summary",
+ "BOL.ui.colGroupAttributes": "Attributes",
+ "BOL.ui.colGroupAptitudes": "Aptitudes",
+ "BOL.ui.colGroupResources": "Resources"
}
\ No newline at end of file
diff --git a/lang/fr.json b/lang/fr.json
index f27bbaf..169c43b 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -650,5 +650,10 @@
"BOL.settings.defaultLogoTopLeftPathTooltip": "Vous pouvez changer le logo BoL en haut à gauche de chaque écran (idéalement 718 x 416, défaut : /systems/bol/ui/logo2.webp)",
"EFFECT.StatusProne": "A terre",
- "EFFECT.StatusDead": "Mort"
+ "EFFECT.StatusDead": "Mort",
+
+ "BOL.ui.charSummaryTitle": "Résumé des Personnages",
+ "BOL.ui.colGroupAttributes": "Attributs",
+ "BOL.ui.colGroupAptitudes": "Aptitudes",
+ "BOL.ui.colGroupResources": "Ressources"
}
\ No newline at end of file
diff --git a/module/actor/actor.js b/module/actor/actor.js
index 60031a7..9dee9cf 100644
--- a/module/actor/actor.js
+++ b/module/actor/actor.js
@@ -7,6 +7,8 @@ import { BoLUtility } from "../system/bol-utility.js";
*/
export class BoLActor extends Actor {
+ static _healthLock = new Set()
+
static async create(data, options) {
// Case of compendium global import
@@ -357,7 +359,7 @@ export class BoLActor extends Actor {
ChatMessage.create({
alias: this.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
- content: await renderTemplate('systems/bol/templates/chat/chat-activate-fight-option.hbs', { name: this.name, img: fightOption.img, foName: fightOption.name, state: state })
+ content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-activate-fight-option.hbs', { name: this.name, img: fightOption.img, foName: fightOption.name, state: state })
})
}
@@ -852,36 +854,42 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
async manageHealthState() {
- let hpID = "lastHP" + this.id
- let lastHP = await this.getFlag("world", hpID)
- if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this
- await this.setFlag("world", hpID, this.system.resources.hp.value)
- let prone = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusProne"))
- let dead = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusDead"))
- if (this.system.resources.hp.value <= 0) {
- if (!prone) {
- await this.createEmbeddedDocuments("ActiveEffect", [
- { name: game.i18n.localize('EFFECT.StatusProne'), icon: 'icons/svg/falling.svg', statuses: 'prone' }
- ])
- }
- if (this.system.resources.hp.value < -5 && !dead) {
- await this.createEmbeddedDocuments("ActiveEffect", [
- { name: game.i18n.localize('EFFECT.StatusDead'), icon: 'icons/svg/skull.svg', statuses: 'dead' }
- ])
- }
- ChatMessage.create({
- alias: this.name,
- whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
- content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value, isHeroAdversary: this.isHeroAdversary() })
- })
- } else {
- if (prone) {
- await this.deleteEmbeddedDocuments("ActiveEffect", [prone.id])
- }
- if (dead) {
- await this.deleteEmbeddedDocuments("ActiveEffect", [dead.id])
+ if (BoLActor._healthLock.has(this.id)) return
+ BoLActor._healthLock.add(this.id)
+ try {
+ let hpID = "lastHP" + this.id
+ let lastHP = await this.getFlag("world", hpID)
+ if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this
+ await this.setFlag("world", hpID, this.system.resources.hp.value)
+ let prone = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusProne"))
+ let dead = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusDead"))
+ if (this.system.resources.hp.value <= 0) {
+ if (!prone) {
+ await this.createEmbeddedDocuments("ActiveEffect", [
+ { name: game.i18n.localize('EFFECT.StatusProne'), icon: 'icons/svg/falling.svg', statuses: 'prone' }
+ ])
+ }
+ if (this.system.resources.hp.value < -5 && !dead) {
+ await this.createEmbeddedDocuments("ActiveEffect", [
+ { name: game.i18n.localize('EFFECT.StatusDead'), icon: 'icons/svg/skull.svg', statuses: 'dead' }
+ ])
+ }
+ ChatMessage.create({
+ alias: this.name,
+ whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
+ content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value, isHeroAdversary: this.isHeroAdversary() })
+ })
+ } else {
+ if (prone) {
+ await this.deleteEmbeddedDocuments("ActiveEffect", [prone.id])
+ }
+ if (dead) {
+ await this.deleteEmbeddedDocuments("ActiveEffect", [dead.id])
+ }
}
}
+ } finally {
+ BoLActor._healthLock.delete(this.id)
}
}
@@ -904,7 +912,7 @@ export class BoLActor extends Actor {
let msg = await ChatMessage.create({
alias: this.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
- content: await renderTemplate('systems/bol/templates/chat/chat-recup-information.hbs', {
+ content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-recup-information.hbs', {
name: this.name,
img: this.img,
actorId: this.id,
diff --git a/module/applications/sheets/horde-sheet.mjs b/module/applications/sheets/horde-sheet.mjs
index 067d3f7..13808f2 100644
--- a/module/applications/sheets/horde-sheet.mjs
+++ b/module/applications/sheets/horde-sheet.mjs
@@ -31,7 +31,7 @@ export default class BoLHordeSheet extends BoLBaseActorSheet {
context.options = this.options
context.editScore = this.options.editScore
context.description = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
- actor.system.description || "", { async: true }
+ actor.system.details?.biography || "", { async: true }
)
console.log("HORDE (AppV2)", context)
diff --git a/module/applications/sheets/vehicle-sheet.mjs b/module/applications/sheets/vehicle-sheet.mjs
index 7ae81fe..552f3d1 100644
--- a/module/applications/sheets/vehicle-sheet.mjs
+++ b/module/applications/sheets/vehicle-sheet.mjs
@@ -35,7 +35,7 @@ export default class BoLVehicleSheet extends BoLBaseActorSheet {
actor.system.description || "", { async: true }
)
- console.log("VEHICLE (AppV2)", context)
+ console.log("VEHICLE (AppV2)", context) // TODO: remove before release
return context
}
@@ -56,10 +56,14 @@ export default class BoLVehicleSheet extends BoLBaseActorSheet {
})
})
- // Create generic item
- this.element.querySelectorAll(".create_item").forEach((el) => {
+ // Create vehicle weapon
+ this.element.querySelectorAll(".vehicle-weapon-add").forEach((el) => {
el.addEventListener("click", () => {
- this.actor.createEmbeddedDocuments("Item", [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true })
+ this.actor.createEmbeddedDocuments("Item", [{
+ name: game.i18n.localize("BOL.ui.newEquipment"),
+ type: "item",
+ system: { category: "vehicleweapon" },
+ }], { renderSheet: true })
})
})
}
diff --git a/module/bol.js b/module/bol.js
index 8a1676f..af3e643 100644
--- a/module/bol.js
+++ b/module/bol.js
@@ -110,35 +110,22 @@ Hooks.once('init', async function () {
/* -------------------------------------------- */
-function welcomeMessage() {
- let content = `
- ` + game.i18n.localize("BOL.chat.welcome1") + ` ` +
- game.i18n.localize("BOL.chat.welcome2") + "
" +
- game.i18n.localize("BOL.chat.welcome3") + "
" +
- game.i18n.localize("BOL.chat.welcome4") + "
" +
- game.i18n.localize("BOL.chat.welcome5") + "
" +
- game.i18n.localize("BOL.chat.welcome6")
+async function welcomeMessage() {
+ const noRulebook = !game.modules.find(m => m.id === "bol-rulebook")
+ const content = await foundry.applications.handlebars.renderTemplate(
+ "systems/bol/templates/chat/chat-welcome.hbs",
+ { noRulebook }
+ )
+ ChatMessage.create({ user: game.user.id, whisper: [game.user.id], content })
- let rulebook = game.modules.find( m => m.id === "bol-rulebook")
- if ( !rulebook ) {
- content += "" + game.i18n.localize("BOL.chat.bolRulebookMessage") + "
"
- }
- ChatMessage.create({
- user: game.user.id,
- whisper: [game.user.id],
- content: content
- })
-
- if (game.user.isGM && game.i18n.lang == 'en' && !game.modules.find(m => m.id == "babele") ){
+ if (game.user.isGM && game.i18n.lang == 'en' && !game.modules.find(m => m.id == "babele")) {
ChatMessage.create({
user: game.user.id,
whisper: [game.user.id],
- content: `
- WARNING ! English language selected, but Babele module is not installed ! Please install babele from the module tab in Foundry interface.`
- } )
+ content: `⚠ WARNING ! English language selected, but Babele module is not installed ! Please install babele from the module tab in Foundry interface.
`
+ })
ui.notifications.warn("WARNING ! English language selected, but babele module is not installed ! Please install babele from the module tab in Foundry interface.")
}
-
}
/* -------------------------------------------- */
diff --git a/module/controllers/bol-rolls.js b/module/controllers/bol-rolls.js
index eafac35..54a8544 100644
--- a/module/controllers/bol-rolls.js
+++ b/module/controllers/bol-rolls.js
@@ -5,11 +5,6 @@ const _apt2attr = { init: "mind", melee: "agility", ranged: "agility", def: "vig
/* -------------------------------------------- */
export class BoLRoll {
- /* -------------------------------------------- */
- static options() {
- return { classes: ["bol", "dialog"], width: 480, height: 'fit-content' };
- }
-
/* -------------------------------------------- */
static getDefaultAttribute(key) {
return _apt2attr[key]
@@ -129,7 +124,7 @@ export class BoLRoll {
rangeMsg = "BOL.chat.range6"
}
ChatMessage.create({
- content: await renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', {
+ content: await foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', {
weapon: weapon,
attackerName: _token.actor.name,
defenderName: target.actor.name,
@@ -308,26 +303,31 @@ export class BoLRoll {
// Final number of dices
this.rollData.nbDice = 2 + Math.abs(this.rollData.bmDice)
// Bonus or Malus ?
- if (this.rollData.bmDice == 0) {
- $('#roll-nbdice').val("2")
- } else {
- let letter = (this.rollData.bmDice > 0) ? "B" : "M"
- $('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter)
+ const nbDiceEl = document.querySelector('#roll-nbdice')
+ if (nbDiceEl) {
+ if (this.rollData.bmDice == 0) {
+ nbDiceEl.value = "2"
+ } else {
+ let letter = (this.rollData.bmDice > 0) ? "B" : "M"
+ nbDiceEl.value = "2 + " + String(Math.abs(this.rollData.bmDice)) + letter
+ }
}
let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue
if (this.rollData.weapon && this.rollData.weapon.system.properties.onlymodifier) {
rollbase = ""
}
- $('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
+ const modifierEl = document.querySelector('#roll-modifier')
+ if (modifierEl) modifierEl.value = rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
this.rollData.modRanged + "+" + this.rollData.weaponModifier + "-" + this.rollData.defence + "-" + this.rollData.modArmorMalus + "-" +
- this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus + "+" + effectModifier)
+ this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus + "+" + effectModifier
- // Rebuild lits of applicable effects
+ // Rebuild list of applicable effects
let selectEffects = ""
for (let effect of this.rollData.bolApplicableEffects) {
selectEffects += `${effect.name} `
}
- $('#applicable-effects').html(selectEffects)
+ const effectsEl = document.querySelector('#applicable-effects')
+ if (effectsEl) effectsEl.innerHTML = selectEffects
}
/* -------------------------------------------- */
@@ -360,46 +360,48 @@ export class BoLRoll {
/* -------------------------------------------- */
static updateArmorMalus(rollData) {
rollData.appliedArmorMalus = 0
+ const agiEl = document.querySelector('#armor-agi-malus')
if (rollData.attribute.key == "agility") {
- $("#armor-agi-malus").show()
+ if (agiEl) agiEl.style.display = ''
rollData.appliedArmorMalus += rollData.armorAgiMalus
} else {
- $("#armor-agi-malus").hide()
+ if (agiEl) agiEl.style.display = 'none'
}
+ const initEl = document.querySelector('#armor-init-malus')
if (rollData.aptitude && rollData.aptitude.key == "init") {
- $("#armor-init-malus").show()
+ if (initEl) initEl.style.display = ''
rollData.appliedArmorMalus += rollData.armorInitMalus
} else {
- $("#armor-init-malus").hide()
+ if (initEl) initEl.style.display = 'none'
}
}
/* ------------------------------ -------------- */
static updatePPCost(rollData) {
- $('#ppcost').html(rollData.ppCost + " + Armor(" + rollData.ppCostArmor + ")=" + Number(rollData.ppCost + rollData.ppCostArmor))
+ const el = document.querySelector('#ppcost')
+ if (el) el.innerHTML = rollData.ppCost + " + Armor(" + rollData.ppCostArmor + ")=" + Number(rollData.ppCost + rollData.ppCostArmor)
}
/* ------------------------------ -------------- */
static rollDialogListener(html) {
-
this.updateTotalDice()
- html.find('#optcond').change((event) => { // Dynamic change of PP cost of spell
+ html.querySelector('#optcond')?.addEventListener('change', (event) => {
let pp = BoLUtility.computeSpellCost(this.rollData.spell, event.currentTarget.selectedOptions.length)
this.rollData.ppCost = pp
this.updatePPCost(this.rollData)
})
- html.find('#mod').change((event) => {
+ html.querySelector('#mod')?.addEventListener('change', (event) => {
this.rollData.mod = Number(event.currentTarget.value)
this.updateTotalDice()
})
- html.find('#modRanged').change((event) => {
+ html.querySelector('#modRanged')?.addEventListener('change', (event) => {
this.rollData.modRanged = Number(event.currentTarget.value)
this.updateTotalDice()
})
- html.find('#attr').change((event) => {
+ html.querySelector('#attr')?.addEventListener('change', (event) => {
let attrKey = event.currentTarget.value
let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.attribute = foundry.utils.duplicate(actor.system.attributes[attrKey])
@@ -407,7 +409,7 @@ export class BoLRoll {
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
this.updateTotalDice()
})
- html.find('#apt').change((event) => {
+ html.querySelector('#apt')?.addEventListener('change', (event) => {
let aptKey = event.currentTarget.value
let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.aptitude = foundry.utils.duplicate(actor.system.aptitudes[aptKey])
@@ -416,65 +418,58 @@ export class BoLRoll {
this.updateTotalDice()
})
- html.find('#applyShieldMalus').click((event) => {
- if (event.currentTarget.checked) {
- this.rollData.shieldMalus = this.rollData.shieldAttackMalus
- } else {
- this.rollData.shieldMalus = 0
- }
+ html.querySelector('#applyShieldMalus')?.addEventListener('click', (event) => {
+ this.rollData.shieldMalus = event.currentTarget.checked ? this.rollData.shieldAttackMalus : 0
this.updateTotalDice()
})
- html.find('#career').change((event) => {
- let careers = $('#career').val()
+ html.querySelector('#career')?.addEventListener('change', (event) => {
+ let careers = Array.from(event.currentTarget.selectedOptions).map(o => o.value)
this.rollData.careerBonus = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i)))
this.updateTotalDice()
})
- html.find('#boon').change((event) => {
- let boons = $('#boon').val()
+ html.querySelector('#boon')?.addEventListener('change', (event) => {
+ let boons = Array.from(event.currentTarget.selectedOptions).map(o => o.value)
this.rollData.nbBoons = (!boons || boons.length == 0) ? 0 : boons.length
this.updateTotalDice()
})
- html.find('#flaw').change((event) => {
- let flaws = $('#flaw').val()
+ html.querySelector('#flaw')?.addEventListener('change', (event) => {
+ let flaws = Array.from(event.currentTarget.selectedOptions).map(o => o.value)
this.rollData.nbFlaws = (!flaws || flaws.length == 0) ? 0 : flaws.length
this.updateTotalDice()
})
- html.find('.bdice').click((event) => {
+ html.querySelectorAll('.bdice').forEach(el => el.addEventListener('click', (event) => {
this.rollData.mDice = 0
this.rollData.bDice = Number(event.currentTarget.value)
this.updateTotalDice()
- })
- html.find('.mdice').click((event) => {
+ }))
+ html.querySelectorAll('.mdice').forEach(el => el.addEventListener('click', (event) => {
this.rollData.bDice = 0
this.rollData.mDice = Number(event.currentTarget.value)
this.updateTotalDice()
- })
- html.find('#horoscope-bonus-applied').change((event) => {
+ }))
+ html.querySelector('#horoscope-bonus-applied')?.addEventListener('change', (event) => {
this.rollData.selectedHoroscope = []
for (let option of event.currentTarget.selectedOptions) {
this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)]))
}
- let horoscopes = $('#horoscope-bonus-applied').val()
+ let horoscopes = Array.from(event.currentTarget.selectedOptions).map(o => o.value)
this.rollData.horoscopeBonus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
this.updateTotalDice()
})
-
- html.find('#horoscope-malus-applied').change((event) => {
+ html.querySelector('#horoscope-malus-applied')?.addEventListener('change', (event) => {
this.rollData.selectedHoroscope = []
for (let option of event.currentTarget.selectedOptions) {
this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)]))
}
- let horoscopes = $('#horoscope-malus-applied').val()
+ let horoscopes = Array.from(event.currentTarget.selectedOptions).map(o => o.value)
this.rollData.horoscopeMalus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
this.updateTotalDice()
})
- html.find('#horoscope-group-applied').change((event) => {
+ html.querySelector('#horoscope-group-applied')?.addEventListener('change', (event) => {
this.rollData.selectedGroupHoroscopeIndex = event.currentTarget.value
this.updateTotalDice()
})
-
-
}
/* -------------------------------------------- */
@@ -552,41 +547,47 @@ export class BoLRoll {
} else {
rollData.shieldMalus = 0
}
- // Save
+ // Save & pre-initialize computed fields
this.rollData = rollData
+ this.updateTotalDice()
console.log("ROLLDATA", rollData)
// Then display+process the dialog
const rollOptionContent = await foundry.applications.handlebars.renderTemplate(rollOptionTpl, rollData);
- let d = new Dialog({
- title: rollData.label,
+ // Use Hooks to reliably get the rendered HTMLElement (renderDialogV2 receives (app, element, context))
+ Hooks.once('renderDialogV2', (app, element) => {
+ element.classList.add('bol');
+ this.rollDialogListener(element);
+ });
+ return foundry.applications.api.DialogV2.wait({
+ window: { title: rollData.label },
content: rollOptionContent,
- rollData: rollData,
- render: html => this.rollDialogListener(html),
- buttons: {
- cancel: {
- icon: ' ',
+ rejectClose: false,
+ buttons: [
+ {
+ type: 'button',
label: game.i18n.localize("BOL.ui.cancel"),
- callback: () => {
- }
+ icon: 'fas fa-times',
+ action: 'cancel'
},
- submit: {
- icon: ' ',
+ {
+ type: 'submit',
label: game.i18n.localize("BOL.ui.submit"),
- callback: (html) => {
+ icon: 'fas fa-check',
+ action: 'submit',
+ callback: (event, button, dialog) => {
console.log("Submit Roll!!!!");
- if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { // Check PP available
+ if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) {
ui.notifications.warn("Pas assez de Points de Pouvoir !")
- return
+ return false
}
- rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
+ rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ?
+ (dialog.element.querySelector('#register-init')?.checked ?? false) : false;
const isMalus = (rollData.bmDice < 0)
-
let rollbase = rollData.attrValue + rollData.aptValue
- if (rollData.weapon?.system.properties.onlymodifier) {
- rollbase = 0
- }
+ if (rollData.weapon?.system.properties.onlymodifier) rollbase = 0
+
let diceData = BoLUtility.getDiceData()
let malusInit = rollData.combatData?.malusInit || 0
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier - malusInit
@@ -599,12 +600,8 @@ export class BoLRoll {
r.roll();
}
}
- },
- default: onEnter,
- close: () => { }
- }, this.options());
-
- return d.render(true);
+ ]
+ }, { classes: ['bol', 'dialog'], width: 480 });
}
}
@@ -698,18 +695,15 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */
async sendChatMessage() {
- let actor = BoLUtility.getActorFromRollData(this.rollData)
- this._buildChatMessage(this.rollData).then(async msgFlavor => {
- //console.log("MSG", msgFlavor )
- let msg = await this.rollData.roll.toMessage({
- user: game.user.id,
- rollMode: game.settings.get("core", "rollMode"),
- flavor: msgFlavor,
- speaker: ChatMessage.getSpeaker({ actor: actor }),
- })
- this.rollData.roll = foundry.utils.duplicate(this.rollData.roll) // Remove object, keep data (v111 ready)
- msg.setFlag("world", "bol-roll-data", this.rollData)
- })
+ const actor = BoLUtility.getActorFromRollData(this.rollData)
+ const rollMode = game.settings.get("core", "rollMode")
+ const msgFlavor = await this._buildChatMessage(this.rollData)
+ const msg = await this.rollData.roll.toMessage({
+ flavor: msgFlavor,
+ speaker: ChatMessage.getSpeaker({ actor: actor }),
+ }, { rollMode })
+ this.rollData.roll = foundry.utils.duplicate(this.rollData.roll)
+ if (msg) await msg.setFlag("world", "bol-roll-data", this.rollData)
}
/* -------------------------------------------- */
diff --git a/module/system/bol-utility.js b/module/system/bol-utility.js
index 0499c2f..70b3524 100644
--- a/module/system/bol-utility.js
+++ b/module/system/bol-utility.js
@@ -249,7 +249,7 @@ export class BoLUtility {
payload: chatData,
});
- renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => {
+ foundry.applications.handlebars.renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => {
let chatOptions = BoLUtility.chatDataSetup(html);
ChatMessage.create(chatOptions)
});
@@ -487,13 +487,17 @@ export class BoLUtility {
if (defenseMode == 'damage-with-armor') {
let armorFormula = defender.getArmorFormula()
- rollData.rollArmor = new Roll(armorFormula)
- await rollData.rollArmor.roll()
- let msg = await rollData.rollArmor.toMessage({ flavor: game.i18n.localize("BOL.chat.armorRoll") + " : " + armorFormula });
- if (game.dice3d) { // wait animation end when DsN is there
- await game.dice3d.waitFor3DAnimationByMessageID(msg.id);
+ if (armorFormula === "0") {
+ rollData.armorProtect = 0
+ } else {
+ rollData.rollArmor = new Roll(armorFormula)
+ await rollData.rollArmor.roll()
+ let msg = await rollData.rollArmor.toMessage({ flavor: game.i18n.localize("BOL.chat.armorRoll") + " : " + armorFormula })
+ if (game.dice3d && msg) {
+ await game.dice3d.waitFor3DAnimationByMessageID(msg.id)
+ }
+ rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
}
- rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
rollData.finalDamage = rollData.damageTotal - rollData.armorProtect
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
await defender.sufferDamage(rollData.finalDamage)
@@ -505,9 +509,17 @@ export class BoLUtility {
}
if (defenseMode == 'hero-reduce-damage') {
let armorFormula = defender.getArmorFormula()
- rollData.rollArmor = new Roll(armorFormula)
- await rollData.rollArmor.roll()
- rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
+ if (armorFormula === "0") {
+ rollData.armorProtect = 0
+ } else {
+ rollData.rollArmor = new Roll(armorFormula)
+ await rollData.rollArmor.roll()
+ let msg = await rollData.rollArmor.toMessage({ flavor: game.i18n.localize("BOL.chat.armorRoll") + " : " + armorFormula })
+ if (game.dice3d && msg) {
+ await game.dice3d.waitFor3DAnimationByMessageID(msg.id)
+ }
+ rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
+ }
rollData.rollHero = new Roll("1d6")
await rollData.rollHero.roll()
rollData.finalDamage = rollData.damageTotal - rollData.rollHero.total - rollData.armorProtect
@@ -542,13 +554,13 @@ export class BoLUtility {
ChatMessage.create({
alias: defender.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name),
- content: await renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', damageResults)
+ content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', damageResults)
})
console.log("Defender data : ", defenderUser)
ChatMessage.create({
alias: defender.name,
whisper: BoLUtility.getOtherWhisperRecipients(defenderUser?.name),
- content: await renderTemplate('systems/bol/templates/chat/rolls/defense-summary-card.hbs', damageResults)
+ content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/rolls/defense-summary-card.hbs', damageResults)
})
}
}
@@ -635,7 +647,7 @@ export class BoLUtility {
let msg = await ChatMessage.create({
alias: defender.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name),
- content: await renderTemplate('systems/bol/templates/chat/rolls/defense-request-card.hbs', {
+ content: await foundry.applications.handlebars.foundry.applications.handlebars.renderTemplate('systems/bol/templates/chat/rolls/defense-request-card.hbs', {
attackId: rollData.id,
attacker: rollData.attacker,
defender: defender,
diff --git a/module/system/config.js b/module/system/config.js
index 5820805..b34b324 100644
--- a/module/system/config.js
+++ b/module/system/config.js
@@ -188,25 +188,25 @@ BOL.rangeModifiers = {
"-8": "BOL.dialog.utmost"
}
-BOL.difficultyModifiers = {
- "4": "BOL.dialog.soeasy",
- "3": "BOL.dialog.soeasy3",
- "2": "BOL.dialog.veryeasy",
- "1": "BOL.dialog.easy",
- "0": "BOL.dialog.moderate",
- "-1": "BOL.dialog.hard",
- "-2": "BOL.dialog.tough",
- "-3": "BOL.dialog.tough3",
- "-4": "BOL.dialog.demanding",
- "-5": "BOL.dialog.demanding5",
- "-6": "BOL.dialog.formidable",
- "-7": "BOL.dialog.formidable7",
- "-8": "BOL.dialog.heroic",
- "-9": "BOL.dialog.heroic9",
- "-10": "BOL.dialog.mythic",
- "-11": "BOL.dialog.mythic11",
- "-12": "BOL.dialog.divine"
-}
+BOL.difficultyModifiers = [
+ { value: "-12", label: "BOL.dialog.divine" },
+ { value: "-11", label: "BOL.dialog.mythic11" },
+ { value: "-10", label: "BOL.dialog.mythic" },
+ { value: "-9", label: "BOL.dialog.heroic9" },
+ { value: "-8", label: "BOL.dialog.heroic" },
+ { value: "-7", label: "BOL.dialog.formidable7" },
+ { value: "-6", label: "BOL.dialog.formidable" },
+ { value: "-5", label: "BOL.dialog.demanding5" },
+ { value: "-4", label: "BOL.dialog.demanding" },
+ { value: "-3", label: "BOL.dialog.tough3" },
+ { value: "-2", label: "BOL.dialog.tough" },
+ { value: "-1", label: "BOL.dialog.hard" },
+ { value: "0", label: "BOL.dialog.moderate" },
+ { value: "1", label: "BOL.dialog.easy" },
+ { value: "2", label: "BOL.dialog.veryeasy" },
+ { value: "3", label: "BOL.dialog.soeasy3" },
+ { value: "4", label: "BOL.dialog.soeasy" },
+]
BOL.alchemyModifiers = {
"2": "BOL.dialog.veryeasy",
diff --git a/module/system/templates.js b/module/system/templates.js
index 26a6810..9b6aca0 100644
--- a/module/system/templates.js
+++ b/module/system/templates.js
@@ -52,6 +52,7 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/chat/rolls/alchemy-roll-card.hbs",
"systems/bol/templates/chat/rolls/selected-horoscope-roll-card.hbs",
"systems/bol/templates/chat/rolls/horoscope-roll-card.hbs",
+ "systems/bol/templates/chat/chat-welcome.hbs",
"systems/bol/templates/dialogs/aptitude-roll-part.hbs",
"systems/bol/templates/dialogs/attribute-roll-part.hbs",
"systems/bol/templates/dialogs/mod-roll-part.hbs",
@@ -62,7 +63,8 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/dialogs/flaws-roll-part.hbs",
"systems/bol/templates/dialogs/total-roll-part.hbs",
"systems/bol/templates/dialogs/fightoptions-roll-part.hbs",
- "systems/bol/templates/dialogs/horoscope-roll-part.hbs"
+ "systems/bol/templates/dialogs/horoscope-roll-part.hbs",
+ "systems/bol/templates/apps/character-summary-template.html"
];
// Load the template parts
diff --git a/packs/aides-de-jeu/001073.log b/packs/aides-de-jeu/001078.log
similarity index 100%
rename from packs/aides-de-jeu/001073.log
rename to packs/aides-de-jeu/001078.log
diff --git a/packs/aides-de-jeu/CURRENT b/packs/aides-de-jeu/CURRENT
index 422b12b..c9bed33 100644
--- a/packs/aides-de-jeu/CURRENT
+++ b/packs/aides-de-jeu/CURRENT
@@ -1 +1 @@
-MANIFEST-001072
+MANIFEST-001076
diff --git a/packs/aides-de-jeu/LOG b/packs/aides-de-jeu/LOG
index cf734ec..ba0ab78 100644
--- a/packs/aides-de-jeu/LOG
+++ b/packs/aides-de-jeu/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.883622 7f56f93fe6c0 Recovering log #1070
-2026/02/28-17:23:52.893895 7f56f93fe6c0 Delete type=3 #1068
-2026/02/28-17:23:52.893967 7f56f93fe6c0 Delete type=0 #1070
+2026/02/28-22:59:53.852685 7f56e3fff6c0 Recovering log #1074
+2026/02/28-22:59:53.863099 7f56e3fff6c0 Delete type=3 #1072
+2026/02/28-22:59:53.863210 7f56e3fff6c0 Delete type=0 #1074
+2026/03/01-01:08:46.366409 7f54e37ef6c0 Level-0 table #1079: started
+2026/03/01-01:08:46.366440 7f54e37ef6c0 Level-0 table #1079: 0 bytes OK
+2026/03/01-01:08:46.372420 7f54e37ef6c0 Delete type=0 #1077
+2026/03/01-01:08:46.391669 7f54e37ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.391720 7f54e37ef6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
diff --git a/packs/aides-de-jeu/LOG.old b/packs/aides-de-jeu/LOG.old
index d01ca82..4a52fea 100644
--- a/packs/aides-de-jeu/LOG.old
+++ b/packs/aides-de-jeu/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.670789 7f56f9bff6c0 Recovering log #1066
-2026/02/28-16:33:30.681105 7f56f9bff6c0 Delete type=3 #1064
-2026/02/28-16:33:30.681173 7f56f9bff6c0 Delete type=0 #1066
-2026/02/28-17:23:47.157740 7f54e37ef6c0 Level-0 table #1071: started
-2026/02/28-17:23:47.157777 7f54e37ef6c0 Level-0 table #1071: 0 bytes OK
-2026/02/28-17:23:47.163664 7f54e37ef6c0 Delete type=0 #1069
-2026/02/28-17:23:47.170059 7f54e37ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.170090 7f54e37ef6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.883622 7f56f93fe6c0 Recovering log #1070
+2026/02/28-17:23:52.893895 7f56f93fe6c0 Delete type=3 #1068
+2026/02/28-17:23:52.893967 7f56f93fe6c0 Delete type=0 #1070
+2026/02/28-22:59:43.750682 7f54e37ef6c0 Level-0 table #1075: started
+2026/02/28-22:59:43.750749 7f54e37ef6c0 Level-0 table #1075: 0 bytes OK
+2026/02/28-22:59:43.758241 7f54e37ef6c0 Delete type=0 #1073
+2026/02/28-22:59:43.758440 7f54e37ef6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.758473 7f54e37ef6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
diff --git a/packs/aides-de-jeu/MANIFEST-001072 b/packs/aides-de-jeu/MANIFEST-001076
similarity index 84%
rename from packs/aides-de-jeu/MANIFEST-001072
rename to packs/aides-de-jeu/MANIFEST-001076
index 04ac199..df78d47 100644
Binary files a/packs/aides-de-jeu/MANIFEST-001072 and b/packs/aides-de-jeu/MANIFEST-001076 differ
diff --git a/packs/armors/000978.log b/packs/armors/000983.log
similarity index 100%
rename from packs/armors/000978.log
rename to packs/armors/000983.log
diff --git a/packs/armors/CURRENT b/packs/armors/CURRENT
index 760f0f8..f51a32f 100644
--- a/packs/armors/CURRENT
+++ b/packs/armors/CURRENT
@@ -1 +1 @@
-MANIFEST-000977
+MANIFEST-000981
diff --git a/packs/armors/LOG b/packs/armors/LOG
index 6e3cadc..528599f 100644
--- a/packs/armors/LOG
+++ b/packs/armors/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.858522 7f56e3fff6c0 Recovering log #975
-2026/02/28-17:23:52.869495 7f56e3fff6c0 Delete type=3 #973
-2026/02/28-17:23:52.869552 7f56e3fff6c0 Delete type=0 #975
+2026/02/28-22:59:53.826224 7f56f8bfd6c0 Recovering log #979
+2026/02/28-22:59:53.836758 7f56f8bfd6c0 Delete type=3 #977
+2026/02/28-22:59:53.836823 7f56f8bfd6c0 Delete type=0 #979
+2026/03/01-01:08:46.372471 7f54e37ef6c0 Level-0 table #984: started
+2026/03/01-01:08:46.372486 7f54e37ef6c0 Level-0 table #984: 0 bytes OK
+2026/03/01-01:08:46.378495 7f54e37ef6c0 Delete type=0 #982
+2026/03/01-01:08:46.391687 7f54e37ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.391731 7f54e37ef6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
diff --git a/packs/armors/LOG.old b/packs/armors/LOG.old
index 9b13e5a..67e23df 100644
--- a/packs/armors/LOG.old
+++ b/packs/armors/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.644599 7f56e3fff6c0 Recovering log #971
-2026/02/28-16:33:30.654938 7f56e3fff6c0 Delete type=3 #969
-2026/02/28-16:33:30.655008 7f56e3fff6c0 Delete type=0 #971
-2026/02/28-17:23:47.144484 7f54e37ef6c0 Level-0 table #976: started
-2026/02/28-17:23:47.144510 7f54e37ef6c0 Level-0 table #976: 0 bytes OK
-2026/02/28-17:23:47.151643 7f54e37ef6c0 Delete type=0 #974
-2026/02/28-17:23:47.170034 7f54e37ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.170076 7f54e37ef6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.858522 7f56e3fff6c0 Recovering log #975
+2026/02/28-17:23:52.869495 7f56e3fff6c0 Delete type=3 #973
+2026/02/28-17:23:52.869552 7f56e3fff6c0 Delete type=0 #975
+2026/02/28-22:59:43.737596 7f54e37ef6c0 Level-0 table #980: started
+2026/02/28-22:59:43.737635 7f54e37ef6c0 Level-0 table #980: 0 bytes OK
+2026/02/28-22:59:43.743801 7f54e37ef6c0 Delete type=0 #978
+2026/02/28-22:59:43.758414 7f54e37ef6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.758457 7f54e37ef6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
diff --git a/packs/armors/MANIFEST-000977 b/packs/armors/MANIFEST-000981
similarity index 73%
rename from packs/armors/MANIFEST-000977
rename to packs/armors/MANIFEST-000981
index d42619a..accf4a8 100644
Binary files a/packs/armors/MANIFEST-000977 and b/packs/armors/MANIFEST-000981 differ
diff --git a/packs/boons/001072.log b/packs/boons/001077.log
similarity index 100%
rename from packs/boons/001072.log
rename to packs/boons/001077.log
diff --git a/packs/boons/CURRENT b/packs/boons/CURRENT
index 6027312..f68ae27 100644
--- a/packs/boons/CURRENT
+++ b/packs/boons/CURRENT
@@ -1 +1 @@
-MANIFEST-001071
+MANIFEST-001075
diff --git a/packs/boons/LOG b/packs/boons/LOG
index f6cb9ba..f5c4d01 100644
--- a/packs/boons/LOG
+++ b/packs/boons/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.757933 7f56f9bff6c0 Recovering log #1069
-2026/02/28-17:23:52.767692 7f56f9bff6c0 Delete type=3 #1067
-2026/02/28-17:23:52.767761 7f56f9bff6c0 Delete type=0 #1069
+2026/02/28-22:59:53.718001 7f56f8bfd6c0 Recovering log #1073
+2026/02/28-22:59:53.729345 7f56f8bfd6c0 Delete type=3 #1071
+2026/02/28-22:59:53.729412 7f56f8bfd6c0 Delete type=0 #1073
+2026/03/01-01:08:46.321084 7f54e37ef6c0 Level-0 table #1078: started
+2026/03/01-01:08:46.321111 7f54e37ef6c0 Level-0 table #1078: 0 bytes OK
+2026/03/01-01:08:46.327221 7f54e37ef6c0 Delete type=0 #1076
+2026/03/01-01:08:46.339937 7f54e37ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.339972 7f54e37ef6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
diff --git a/packs/boons/LOG.old b/packs/boons/LOG.old
index 59c7177..94e4940 100644
--- a/packs/boons/LOG.old
+++ b/packs/boons/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.543841 7f56e3fff6c0 Recovering log #1065
-2026/02/28-16:33:30.553998 7f56e3fff6c0 Delete type=3 #1063
-2026/02/28-16:33:30.554062 7f56e3fff6c0 Delete type=0 #1065
-2026/02/28-17:23:47.101088 7f54e37ef6c0 Level-0 table #1070: started
-2026/02/28-17:23:47.101118 7f54e37ef6c0 Level-0 table #1070: 0 bytes OK
-2026/02/28-17:23:47.107544 7f54e37ef6c0 Delete type=0 #1068
-2026/02/28-17:23:47.119520 7f54e37ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.119595 7f54e37ef6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.757933 7f56f9bff6c0 Recovering log #1069
+2026/02/28-17:23:52.767692 7f56f9bff6c0 Delete type=3 #1067
+2026/02/28-17:23:52.767761 7f56f9bff6c0 Delete type=0 #1069
+2026/02/28-22:59:43.697108 7f54e37ef6c0 Level-0 table #1074: started
+2026/02/28-22:59:43.697152 7f54e37ef6c0 Level-0 table #1074: 0 bytes OK
+2026/02/28-22:59:43.704224 7f54e37ef6c0 Delete type=0 #1072
+2026/02/28-22:59:43.704461 7f54e37ef6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.704511 7f54e37ef6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
diff --git a/packs/boons/MANIFEST-001071 b/packs/boons/MANIFEST-001075
similarity index 72%
rename from packs/boons/MANIFEST-001071
rename to packs/boons/MANIFEST-001075
index d4c5972..fb634a0 100644
Binary files a/packs/boons/MANIFEST-001071 and b/packs/boons/MANIFEST-001075 differ
diff --git a/packs/boonsflawscreatures/001071.log b/packs/boonsflawscreatures/001076.log
similarity index 100%
rename from packs/boonsflawscreatures/001071.log
rename to packs/boonsflawscreatures/001076.log
diff --git a/packs/boonsflawscreatures/CURRENT b/packs/boonsflawscreatures/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/boonsflawscreatures/CURRENT
+++ b/packs/boonsflawscreatures/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/boonsflawscreatures/LOG b/packs/boonsflawscreatures/LOG
index 6b43d9c..a809b4f 100644
--- a/packs/boonsflawscreatures/LOG
+++ b/packs/boonsflawscreatures/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.769847 7f56f93fe6c0 Recovering log #1068
-2026/02/28-17:23:52.780583 7f56f93fe6c0 Delete type=3 #1066
-2026/02/28-17:23:52.780639 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:53.732583 7f56e3fff6c0 Recovering log #1072
+2026/02/28-22:59:53.742972 7f56e3fff6c0 Delete type=3 #1070
+2026/02/28-22:59:53.743061 7f56e3fff6c0 Delete type=0 #1072
+2026/03/01-01:08:46.313828 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.313877 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.320973 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.339925 7f54e37ef6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.339953 7f54e37ef6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
diff --git a/packs/boonsflawscreatures/LOG.old b/packs/boonsflawscreatures/LOG.old
index cf08599..3500e87 100644
--- a/packs/boonsflawscreatures/LOG.old
+++ b/packs/boonsflawscreatures/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.556447 7f56f9bff6c0 Recovering log #1064
-2026/02/28-16:33:30.566208 7f56f9bff6c0 Delete type=3 #1062
-2026/02/28-16:33:30.566291 7f56f9bff6c0 Delete type=0 #1064
-2026/02/28-17:23:47.107642 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.107677 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.113550 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.119530 7f54e37ef6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.119574 7f54e37ef6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.769847 7f56f93fe6c0 Recovering log #1068
+2026/02/28-17:23:52.780583 7f56f93fe6c0 Delete type=3 #1066
+2026/02/28-17:23:52.780639 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:43.677524 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.677620 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.684329 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.704401 7f54e37ef6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.704474 7f54e37ef6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
diff --git a/packs/boonsflawscreatures/MANIFEST-001070 b/packs/boonsflawscreatures/MANIFEST-001074
similarity index 73%
rename from packs/boonsflawscreatures/MANIFEST-001070
rename to packs/boonsflawscreatures/MANIFEST-001074
index 5ac7ea1..4a23c39 100644
Binary files a/packs/boonsflawscreatures/MANIFEST-001070 and b/packs/boonsflawscreatures/MANIFEST-001074 differ
diff --git a/packs/careers/001071.log b/packs/careers/001076.log
similarity index 100%
rename from packs/careers/001071.log
rename to packs/careers/001076.log
diff --git a/packs/careers/CURRENT b/packs/careers/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/careers/CURRENT
+++ b/packs/careers/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/careers/LOG b/packs/careers/LOG
index dae2016..7e5770c 100644
--- a/packs/careers/LOG
+++ b/packs/careers/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.796426 7f56f9bff6c0 Recovering log #1068
-2026/02/28-17:23:52.805920 7f56f9bff6c0 Delete type=3 #1066
-2026/02/28-17:23:52.805973 7f56f9bff6c0 Delete type=0 #1068
+2026/02/28-22:59:53.759689 7f56f8bfd6c0 Recovering log #1072
+2026/02/28-22:59:53.770229 7f56f8bfd6c0 Delete type=3 #1070
+2026/02/28-22:59:53.770305 7f56f8bfd6c0 Delete type=0 #1072
+2026/03/01-01:08:46.327327 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.327354 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.333262 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.339946 7f54e37ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.339979 7f54e37ef6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
diff --git a/packs/careers/LOG.old b/packs/careers/LOG.old
index f37a57d..98e9684 100644
--- a/packs/careers/LOG.old
+++ b/packs/careers/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.581375 7f56f8bfd6c0 Recovering log #1064
-2026/02/28-16:33:30.592412 7f56f8bfd6c0 Delete type=3 #1062
-2026/02/28-16:33:30.592492 7f56f8bfd6c0 Delete type=0 #1064
-2026/02/28-17:23:47.113620 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.113644 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.119422 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.119541 7f54e37ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.119585 7f54e37ef6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.796426 7f56f9bff6c0 Recovering log #1068
+2026/02/28-17:23:52.805920 7f56f9bff6c0 Delete type=3 #1066
+2026/02/28-17:23:52.805973 7f56f9bff6c0 Delete type=0 #1068
+2026/02/28-22:59:43.711333 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.711370 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.717336 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.731041 7f54e37ef6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.731086 7f54e37ef6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
diff --git a/packs/careers/MANIFEST-001070 b/packs/careers/MANIFEST-001074
similarity index 72%
rename from packs/careers/MANIFEST-001070
rename to packs/careers/MANIFEST-001074
index ab210f9..fbdc236 100644
Binary files a/packs/careers/MANIFEST-001070 and b/packs/careers/MANIFEST-001074 differ
diff --git a/packs/effets-exemples/001069.log b/packs/effets-exemples/001074.log
similarity index 100%
rename from packs/effets-exemples/001069.log
rename to packs/effets-exemples/001074.log
diff --git a/packs/effets-exemples/CURRENT b/packs/effets-exemples/CURRENT
index 436e6b4..422b12b 100644
--- a/packs/effets-exemples/CURRENT
+++ b/packs/effets-exemples/CURRENT
@@ -1 +1 @@
-MANIFEST-001068
+MANIFEST-001072
diff --git a/packs/effets-exemples/LOG b/packs/effets-exemples/LOG
index b614af9..1403e12 100644
--- a/packs/effets-exemples/LOG
+++ b/packs/effets-exemples/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.970603 7f56f9bff6c0 Recovering log #1066
-2026/02/28-17:23:52.981835 7f56f9bff6c0 Delete type=3 #1064
-2026/02/28-17:23:52.981888 7f56f9bff6c0 Delete type=0 #1066
+2026/02/28-22:59:53.948768 7f56f93fe6c0 Recovering log #1070
+2026/02/28-22:59:53.958702 7f56f93fe6c0 Delete type=3 #1068
+2026/02/28-22:59:53.958781 7f56f93fe6c0 Delete type=0 #1070
+2026/03/01-01:08:46.425514 7f54e37ef6c0 Level-0 table #1075: started
+2026/03/01-01:08:46.425561 7f54e37ef6c0 Level-0 table #1075: 0 bytes OK
+2026/03/01-01:08:46.431671 7f54e37ef6c0 Delete type=0 #1073
+2026/03/01-01:08:46.445290 7f54e37ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.445328 7f54e37ef6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
diff --git a/packs/effets-exemples/LOG.old b/packs/effets-exemples/LOG.old
index baa34c5..fbd528b 100644
--- a/packs/effets-exemples/LOG.old
+++ b/packs/effets-exemples/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.759164 7f56f9bff6c0 Recovering log #1062
-2026/02/28-16:33:30.769105 7f56f9bff6c0 Delete type=3 #1060
-2026/02/28-16:33:30.769164 7f56f9bff6c0 Delete type=0 #1062
-2026/02/28-17:23:47.203516 7f54e37ef6c0 Level-0 table #1067: started
-2026/02/28-17:23:47.203569 7f54e37ef6c0 Level-0 table #1067: 0 bytes OK
-2026/02/28-17:23:47.210686 7f54e37ef6c0 Delete type=0 #1065
-2026/02/28-17:23:47.224578 7f54e37ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.224615 7f54e37ef6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.970603 7f56f9bff6c0 Recovering log #1066
+2026/02/28-17:23:52.981835 7f56f9bff6c0 Delete type=3 #1064
+2026/02/28-17:23:52.981888 7f56f9bff6c0 Delete type=0 #1066
+2026/02/28-22:59:43.785498 7f54e37ef6c0 Level-0 table #1071: started
+2026/02/28-22:59:43.785523 7f54e37ef6c0 Level-0 table #1071: 0 bytes OK
+2026/02/28-22:59:43.792317 7f54e37ef6c0 Delete type=0 #1069
+2026/02/28-22:59:43.813749 7f54e37ef6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.813808 7f54e37ef6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
diff --git a/packs/effets-exemples/MANIFEST-001068 b/packs/effets-exemples/MANIFEST-001072
similarity index 73%
rename from packs/effets-exemples/MANIFEST-001068
rename to packs/effets-exemples/MANIFEST-001072
index d28bc09..a78947b 100644
Binary files a/packs/effets-exemples/MANIFEST-001068 and b/packs/effets-exemples/MANIFEST-001072 differ
diff --git a/packs/equipment/001072.log b/packs/equipment/001077.log
similarity index 100%
rename from packs/equipment/001072.log
rename to packs/equipment/001077.log
diff --git a/packs/equipment/CURRENT b/packs/equipment/CURRENT
index 6027312..f68ae27 100644
--- a/packs/equipment/CURRENT
+++ b/packs/equipment/CURRENT
@@ -1 +1 @@
-MANIFEST-001071
+MANIFEST-001075
diff --git a/packs/equipment/LOG b/packs/equipment/LOG
index b03c632..81080dc 100644
--- a/packs/equipment/LOG
+++ b/packs/equipment/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.834261 7f56f9bff6c0 Recovering log #1069
-2026/02/28-17:23:52.843912 7f56f9bff6c0 Delete type=3 #1067
-2026/02/28-17:23:52.843969 7f56f9bff6c0 Delete type=0 #1069
+2026/02/28-22:59:53.798832 7f56f9bff6c0 Recovering log #1073
+2026/02/28-22:59:53.809449 7f56f9bff6c0 Delete type=3 #1071
+2026/02/28-22:59:53.809533 7f56f9bff6c0 Delete type=0 #1073
+2026/03/01-01:08:46.340100 7f54e37ef6c0 Level-0 table #1078: started
+2026/03/01-01:08:46.340139 7f54e37ef6c0 Level-0 table #1078: 0 bytes OK
+2026/03/01-01:08:46.346846 7f54e37ef6c0 Delete type=0 #1076
+2026/03/01-01:08:46.366221 7f54e37ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.366278 7f54e37ef6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
diff --git a/packs/equipment/LOG.old b/packs/equipment/LOG.old
index a3b3c3c..1955707 100644
--- a/packs/equipment/LOG.old
+++ b/packs/equipment/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.620158 7f56f9bff6c0 Recovering log #1065
-2026/02/28-16:33:30.630293 7f56f9bff6c0 Delete type=3 #1063
-2026/02/28-16:33:30.630363 7f56f9bff6c0 Delete type=0 #1065
-2026/02/28-17:23:47.126363 7f54e37ef6c0 Level-0 table #1070: started
-2026/02/28-17:23:47.126384 7f54e37ef6c0 Level-0 table #1070: 0 bytes OK
-2026/02/28-17:23:47.132261 7f54e37ef6c0 Delete type=0 #1068
-2026/02/28-17:23:47.144361 7f54e37ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.144409 7f54e37ef6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.834261 7f56f9bff6c0 Recovering log #1069
+2026/02/28-17:23:52.843912 7f56f9bff6c0 Delete type=3 #1067
+2026/02/28-17:23:52.843969 7f56f9bff6c0 Delete type=0 #1069
+2026/02/28-22:59:43.704672 7f54e37ef6c0 Level-0 table #1074: started
+2026/02/28-22:59:43.704745 7f54e37ef6c0 Level-0 table #1074: 0 bytes OK
+2026/02/28-22:59:43.711212 7f54e37ef6c0 Delete type=0 #1072
+2026/02/28-22:59:43.731026 7f54e37ef6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.731077 7f54e37ef6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
diff --git a/packs/equipment/MANIFEST-001071 b/packs/equipment/MANIFEST-001075
similarity index 73%
rename from packs/equipment/MANIFEST-001071
rename to packs/equipment/MANIFEST-001075
index 6d3f3e0..4f3c411 100644
Binary files a/packs/equipment/MANIFEST-001071 and b/packs/equipment/MANIFEST-001075 differ
diff --git a/packs/fightoptions/001071.log b/packs/fightoptions/001076.log
similarity index 100%
rename from packs/fightoptions/001071.log
rename to packs/fightoptions/001076.log
diff --git a/packs/fightoptions/CURRENT b/packs/fightoptions/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/fightoptions/CURRENT
+++ b/packs/fightoptions/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/fightoptions/LOG b/packs/fightoptions/LOG
index 0a62d10..38ff2ce 100644
--- a/packs/fightoptions/LOG
+++ b/packs/fightoptions/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.920377 7f56e3fff6c0 Recovering log #1068
-2026/02/28-17:23:52.930570 7f56e3fff6c0 Delete type=3 #1066
-2026/02/28-17:23:52.930642 7f56e3fff6c0 Delete type=0 #1068
+2026/02/28-22:59:53.895577 7f56f8bfd6c0 Recovering log #1072
+2026/02/28-22:59:53.906749 7f56f8bfd6c0 Delete type=3 #1070
+2026/02/28-22:59:53.906807 7f56f8bfd6c0 Delete type=0 #1072
+2026/03/01-01:08:46.391890 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.391936 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.398187 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.417834 7f54e37ef6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.417875 7f54e37ef6c0 Manual compaction at level-1 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
diff --git a/packs/fightoptions/LOG.old b/packs/fightoptions/LOG.old
index b14751a..fc8fc00 100644
--- a/packs/fightoptions/LOG.old
+++ b/packs/fightoptions/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.708467 7f56e3fff6c0 Recovering log #1064
-2026/02/28-16:33:30.718300 7f56e3fff6c0 Delete type=3 #1062
-2026/02/28-16:33:30.718379 7f56e3fff6c0 Delete type=0 #1064
-2026/02/28-17:23:47.176664 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.176691 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.182879 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.196873 7f54e37ef6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.196911 7f54e37ef6c0 Manual compaction at level-1 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.920377 7f56e3fff6c0 Recovering log #1068
+2026/02/28-17:23:52.930570 7f56e3fff6c0 Delete type=3 #1066
+2026/02/28-17:23:52.930642 7f56e3fff6c0 Delete type=0 #1068
+2026/02/28-22:59:43.758590 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.758628 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.764731 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.785330 7f54e37ef6c0 Manual compaction at level-0 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.785372 7f54e37ef6c0 Manual compaction at level-1 from '!items!AoT2c0af4lY6aBsx' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
diff --git a/packs/fightoptions/MANIFEST-001070 b/packs/fightoptions/MANIFEST-001074
similarity index 73%
rename from packs/fightoptions/MANIFEST-001070
rename to packs/fightoptions/MANIFEST-001074
index cb8372a..869fa09 100644
Binary files a/packs/fightoptions/MANIFEST-001070 and b/packs/fightoptions/MANIFEST-001074 differ
diff --git a/packs/fightoptionsfanmade/000554.log b/packs/fightoptionsfanmade/000559.log
similarity index 100%
rename from packs/fightoptionsfanmade/000554.log
rename to packs/fightoptionsfanmade/000559.log
diff --git a/packs/fightoptionsfanmade/CURRENT b/packs/fightoptionsfanmade/CURRENT
index 06420a4..7e963d6 100644
--- a/packs/fightoptionsfanmade/CURRENT
+++ b/packs/fightoptionsfanmade/CURRENT
@@ -1 +1 @@
-MANIFEST-000553
+MANIFEST-000557
diff --git a/packs/fightoptionsfanmade/LOG b/packs/fightoptionsfanmade/LOG
index fc090b3..6943141 100644
--- a/packs/fightoptionsfanmade/LOG
+++ b/packs/fightoptionsfanmade/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.933111 7f56f9bff6c0 Recovering log #551
-2026/02/28-17:23:52.944230 7f56f9bff6c0 Delete type=3 #549
-2026/02/28-17:23:52.944299 7f56f9bff6c0 Delete type=0 #551
+2026/02/28-22:59:53.909216 7f56f93fe6c0 Recovering log #555
+2026/02/28-22:59:53.919079 7f56f93fe6c0 Delete type=3 #553
+2026/02/28-22:59:53.919136 7f56f93fe6c0 Delete type=0 #555
+2026/03/01-01:08:46.411300 7f54e37ef6c0 Level-0 table #560: started
+2026/03/01-01:08:46.411339 7f54e37ef6c0 Level-0 table #560: 0 bytes OK
+2026/03/01-01:08:46.417727 7f54e37ef6c0 Delete type=0 #558
+2026/03/01-01:08:46.417880 7f54e37ef6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.417911 7f54e37ef6c0 Manual compaction at level-1 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
diff --git a/packs/fightoptionsfanmade/LOG.old b/packs/fightoptionsfanmade/LOG.old
index 426e7f2..0c39eb8 100644
--- a/packs/fightoptionsfanmade/LOG.old
+++ b/packs/fightoptionsfanmade/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.720629 7f56f93fe6c0 Recovering log #547
-2026/02/28-16:33:30.730500 7f56f93fe6c0 Delete type=3 #545
-2026/02/28-16:33:30.730560 7f56f93fe6c0 Delete type=0 #547
-2026/02/28-17:23:47.170169 7f54e37ef6c0 Level-0 table #552: started
-2026/02/28-17:23:47.170192 7f54e37ef6c0 Level-0 table #552: 0 bytes OK
-2026/02/28-17:23:47.176521 7f54e37ef6c0 Delete type=0 #550
-2026/02/28-17:23:47.196862 7f54e37ef6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.196905 7f54e37ef6c0 Manual compaction at level-1 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.933111 7f56f9bff6c0 Recovering log #551
+2026/02/28-17:23:52.944230 7f56f9bff6c0 Delete type=3 #549
+2026/02/28-17:23:52.944299 7f56f9bff6c0 Delete type=0 #551
+2026/02/28-22:59:43.771257 7f54e37ef6c0 Level-0 table #556: started
+2026/02/28-22:59:43.771301 7f54e37ef6c0 Level-0 table #556: 0 bytes OK
+2026/02/28-22:59:43.778711 7f54e37ef6c0 Delete type=0 #554
+2026/02/28-22:59:43.785356 7f54e37ef6c0 Manual compaction at level-0 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.785385 7f54e37ef6c0 Manual compaction at level-1 from '!items!CLRp0k5qV8mD03pW' @ 72057594037927935 : 1 .. '!items!wYEpnhbyYaMkaNdL' @ 0 : 0; will stop at (end)
diff --git a/packs/fightoptionsfanmade/MANIFEST-000553 b/packs/fightoptionsfanmade/MANIFEST-000557
similarity index 73%
rename from packs/fightoptionsfanmade/MANIFEST-000553
rename to packs/fightoptionsfanmade/MANIFEST-000557
index ee7ddc7..003c8a9 100644
Binary files a/packs/fightoptionsfanmade/MANIFEST-000553 and b/packs/fightoptionsfanmade/MANIFEST-000557 differ
diff --git a/packs/flaws/001072.log b/packs/flaws/001077.log
similarity index 100%
rename from packs/flaws/001072.log
rename to packs/flaws/001077.log
diff --git a/packs/flaws/CURRENT b/packs/flaws/CURRENT
index 6027312..f68ae27 100644
--- a/packs/flaws/CURRENT
+++ b/packs/flaws/CURRENT
@@ -1 +1 @@
-MANIFEST-001071
+MANIFEST-001075
diff --git a/packs/flaws/LOG b/packs/flaws/LOG
index 8c2e959..0b0e6e0 100644
--- a/packs/flaws/LOG
+++ b/packs/flaws/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.782908 7f56e3fff6c0 Recovering log #1069
-2026/02/28-17:23:52.794098 7f56e3fff6c0 Delete type=3 #1067
-2026/02/28-17:23:52.794177 7f56e3fff6c0 Delete type=0 #1069
+2026/02/28-22:59:53.745821 7f56f9bff6c0 Recovering log #1073
+2026/02/28-22:59:53.756326 7f56f9bff6c0 Delete type=3 #1071
+2026/02/28-22:59:53.756400 7f56f9bff6c0 Delete type=0 #1073
+2026/03/01-01:08:46.333368 7f54e37ef6c0 Level-0 table #1078: started
+2026/03/01-01:08:46.333402 7f54e37ef6c0 Level-0 table #1078: 0 bytes OK
+2026/03/01-01:08:46.339817 7f54e37ef6c0 Delete type=0 #1076
+2026/03/01-01:08:46.339962 7f54e37ef6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.339986 7f54e37ef6c0 Manual compaction at level-1 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
diff --git a/packs/flaws/LOG.old b/packs/flaws/LOG.old
index 7d5a037..d3e1c6d 100644
--- a/packs/flaws/LOG.old
+++ b/packs/flaws/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.568367 7f56f93fe6c0 Recovering log #1065
-2026/02/28-16:33:30.578749 7f56f93fe6c0 Delete type=3 #1063
-2026/02/28-16:33:30.578812 7f56f93fe6c0 Delete type=0 #1065
-2026/02/28-17:23:47.094442 7f54e37ef6c0 Level-0 table #1070: started
-2026/02/28-17:23:47.094487 7f54e37ef6c0 Level-0 table #1070: 0 bytes OK
-2026/02/28-17:23:47.100985 7f54e37ef6c0 Delete type=0 #1068
-2026/02/28-17:23:47.119507 7f54e37ef6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.119555 7f54e37ef6c0 Manual compaction at level-1 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.782908 7f56e3fff6c0 Recovering log #1069
+2026/02/28-17:23:52.794098 7f56e3fff6c0 Delete type=3 #1067
+2026/02/28-17:23:52.794177 7f56e3fff6c0 Delete type=0 #1069
+2026/02/28-22:59:43.690888 7f54e37ef6c0 Level-0 table #1074: started
+2026/02/28-22:59:43.690928 7f54e37ef6c0 Level-0 table #1074: 0 bytes OK
+2026/02/28-22:59:43.696960 7f54e37ef6c0 Delete type=0 #1072
+2026/02/28-22:59:43.704444 7f54e37ef6c0 Manual compaction at level-0 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.704500 7f54e37ef6c0 Manual compaction at level-1 from '!items!0wCqg1UpGd50uJrS' @ 72057594037927935 : 1 .. '!items!znd0K3b7HzYpdehs' @ 0 : 0; will stop at (end)
diff --git a/packs/flaws/MANIFEST-001071 b/packs/flaws/MANIFEST-001075
similarity index 72%
rename from packs/flaws/MANIFEST-001071
rename to packs/flaws/MANIFEST-001075
index 11f8887..b6790e3 100644
Binary files a/packs/flaws/MANIFEST-001071 and b/packs/flaws/MANIFEST-001075 differ
diff --git a/packs/languages/001071.log b/packs/languages/001076.log
similarity index 100%
rename from packs/languages/001071.log
rename to packs/languages/001076.log
diff --git a/packs/languages/CURRENT b/packs/languages/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/languages/CURRENT
+++ b/packs/languages/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/languages/LOG b/packs/languages/LOG
index 229a7bc..6e9607f 100644
--- a/packs/languages/LOG
+++ b/packs/languages/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.896387 7f56f9bff6c0 Recovering log #1068
-2026/02/28-17:23:52.906464 7f56f9bff6c0 Delete type=3 #1066
-2026/02/28-17:23:52.906539 7f56f9bff6c0 Delete type=0 #1068
+2026/02/28-22:59:53.868071 7f56f9bff6c0 Recovering log #1072
+2026/02/28-22:59:53.878397 7f56f9bff6c0 Delete type=3 #1070
+2026/02/28-22:59:53.878486 7f56f9bff6c0 Delete type=0 #1072
+2026/03/01-01:08:46.384669 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.384685 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.391370 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.391711 7f54e37ef6c0 Manual compaction at level-0 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.391749 7f54e37ef6c0 Manual compaction at level-1 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
diff --git a/packs/languages/LOG.old b/packs/languages/LOG.old
index a7baa4a..5784c2a 100644
--- a/packs/languages/LOG.old
+++ b/packs/languages/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.684377 7f56f8bfd6c0 Recovering log #1064
-2026/02/28-16:33:30.694121 7f56f8bfd6c0 Delete type=3 #1062
-2026/02/28-16:33:30.694253 7f56f8bfd6c0 Delete type=0 #1064
-2026/02/28-17:23:47.163767 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.163790 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.169941 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.170068 7f54e37ef6c0 Manual compaction at level-0 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.170097 7f54e37ef6c0 Manual compaction at level-1 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.896387 7f56f9bff6c0 Recovering log #1068
+2026/02/28-17:23:52.906464 7f56f9bff6c0 Delete type=3 #1066
+2026/02/28-17:23:52.906539 7f56f9bff6c0 Delete type=0 #1068
+2026/02/28-22:59:43.731206 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.731246 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.737434 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.758397 7f54e37ef6c0 Manual compaction at level-0 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.758449 7f54e37ef6c0 Manual compaction at level-1 from '!items!46qF6OBN5gf0dqWc' @ 72057594037927935 : 1 .. '!items!vaAQiuAHdyQrQiUX' @ 0 : 0; will stop at (end)
diff --git a/packs/languages/MANIFEST-001070 b/packs/languages/MANIFEST-001074
similarity index 73%
rename from packs/languages/MANIFEST-001070
rename to packs/languages/MANIFEST-001074
index 6670a74..f2ee4e8 100644
Binary files a/packs/languages/MANIFEST-001070 and b/packs/languages/MANIFEST-001074 differ
diff --git a/packs/objets-alchimie/001071.log b/packs/objets-alchimie/001076.log
similarity index 100%
rename from packs/objets-alchimie/001071.log
rename to packs/objets-alchimie/001076.log
diff --git a/packs/objets-alchimie/CURRENT b/packs/objets-alchimie/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/objets-alchimie/CURRENT
+++ b/packs/objets-alchimie/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/objets-alchimie/LOG b/packs/objets-alchimie/LOG
index 5d8068b..3d00321 100644
--- a/packs/objets-alchimie/LOG
+++ b/packs/objets-alchimie/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.958813 7f56e3fff6c0 Recovering log #1068
-2026/02/28-17:23:52.968345 7f56e3fff6c0 Delete type=3 #1066
-2026/02/28-17:23:52.968393 7f56e3fff6c0 Delete type=0 #1068
+2026/02/28-22:59:53.934035 7f56f8bfd6c0 Recovering log #1072
+2026/02/28-22:59:53.944554 7f56f8bfd6c0 Delete type=3 #1070
+2026/02/28-22:59:53.944697 7f56f8bfd6c0 Delete type=0 #1072
+2026/03/01-01:08:46.417957 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.417992 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.425325 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.445276 7f54e37ef6c0 Manual compaction at level-0 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.445310 7f54e37ef6c0 Manual compaction at level-1 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
diff --git a/packs/objets-alchimie/LOG.old b/packs/objets-alchimie/LOG.old
index 5f4bfb3..a29e4d2 100644
--- a/packs/objets-alchimie/LOG.old
+++ b/packs/objets-alchimie/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.745872 7f56f93fe6c0 Recovering log #1064
-2026/02/28-16:33:30.756473 7f56f93fe6c0 Delete type=3 #1062
-2026/02/28-16:33:30.756549 7f56f93fe6c0 Delete type=0 #1064
-2026/02/28-17:23:47.196995 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.197070 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.203333 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.224558 7f54e37ef6c0 Manual compaction at level-0 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.224608 7f54e37ef6c0 Manual compaction at level-1 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.958813 7f56e3fff6c0 Recovering log #1068
+2026/02/28-17:23:52.968345 7f56e3fff6c0 Delete type=3 #1066
+2026/02/28-17:23:52.968393 7f56e3fff6c0 Delete type=0 #1068
+2026/02/28-22:59:43.764864 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.764900 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.771060 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.785345 7f54e37ef6c0 Manual compaction at level-0 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.785379 7f54e37ef6c0 Manual compaction at level-1 from '!items!0Yhn3r8AFsKXEKeS' @ 72057594037927935 : 1 .. '!items!xVWrSPiX0Nwccsn6' @ 0 : 0; will stop at (end)
diff --git a/packs/objets-alchimie/MANIFEST-001070 b/packs/objets-alchimie/MANIFEST-001074
similarity index 73%
rename from packs/objets-alchimie/MANIFEST-001070
rename to packs/objets-alchimie/MANIFEST-001074
index 30a4ba6..64aa97e 100644
Binary files a/packs/objets-alchimie/MANIFEST-001070 and b/packs/objets-alchimie/MANIFEST-001074 differ
diff --git a/packs/origins/001071.log b/packs/origins/001076.log
similarity index 100%
rename from packs/origins/001071.log
rename to packs/origins/001076.log
diff --git a/packs/origins/CURRENT b/packs/origins/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/origins/CURRENT
+++ b/packs/origins/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/origins/LOG b/packs/origins/LOG
index af4a0db..9c73fee 100644
--- a/packs/origins/LOG
+++ b/packs/origins/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.807927 7f56f93fe6c0 Recovering log #1068
-2026/02/28-17:23:52.818186 7f56f93fe6c0 Delete type=3 #1066
-2026/02/28-17:23:52.818257 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:53.772505 7f56f93fe6c0 Recovering log #1072
+2026/02/28-22:59:53.783195 7f56f93fe6c0 Delete type=3 #1070
+2026/02/28-22:59:53.783277 7f56f93fe6c0 Delete type=0 #1072
+2026/03/01-01:08:46.346982 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.347034 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.353085 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.366234 7f54e37ef6c0 Manual compaction at level-0 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.366287 7f54e37ef6c0 Manual compaction at level-1 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
diff --git a/packs/origins/LOG.old b/packs/origins/LOG.old
index 9eb0e0d..0b0199d 100644
--- a/packs/origins/LOG.old
+++ b/packs/origins/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.595096 7f56f9bff6c0 Recovering log #1064
-2026/02/28-16:33:30.604934 7f56f9bff6c0 Delete type=3 #1062
-2026/02/28-16:33:30.604985 7f56f9bff6c0 Delete type=0 #1064
-2026/02/28-17:23:47.132350 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.132377 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.138287 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.144369 7f54e37ef6c0 Manual compaction at level-0 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.144403 7f54e37ef6c0 Manual compaction at level-1 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.807927 7f56f93fe6c0 Recovering log #1068
+2026/02/28-17:23:52.818186 7f56f93fe6c0 Delete type=3 #1066
+2026/02/28-17:23:52.818257 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:43.684453 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.684483 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.690760 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.704428 7f54e37ef6c0 Manual compaction at level-0 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.704487 7f54e37ef6c0 Manual compaction at level-1 from '!items!2Wtl8xrKf46LMwBF' @ 72057594037927935 : 1 .. '!items!zIlZmEd9WAA473UX' @ 0 : 0; will stop at (end)
diff --git a/packs/origins/MANIFEST-001070 b/packs/origins/MANIFEST-001074
similarity index 72%
rename from packs/origins/MANIFEST-001070
rename to packs/origins/MANIFEST-001074
index 58a569b..54f4e11 100644
Binary files a/packs/origins/MANIFEST-001070 and b/packs/origins/MANIFEST-001074 differ
diff --git a/packs/potions-alchimie/001071.log b/packs/potions-alchimie/001076.log
similarity index 100%
rename from packs/potions-alchimie/001071.log
rename to packs/potions-alchimie/001076.log
diff --git a/packs/potions-alchimie/CURRENT b/packs/potions-alchimie/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/potions-alchimie/CURRENT
+++ b/packs/potions-alchimie/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/potions-alchimie/LOG b/packs/potions-alchimie/LOG
index d47c26b..0568878 100644
--- a/packs/potions-alchimie/LOG
+++ b/packs/potions-alchimie/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.947009 7f56f93fe6c0 Recovering log #1068
-2026/02/28-17:23:52.956752 7f56f93fe6c0 Delete type=3 #1066
-2026/02/28-17:23:52.956816 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:53.920918 7f56f9bff6c0 Recovering log #1072
+2026/02/28-22:59:53.931606 7f56f9bff6c0 Delete type=3 #1070
+2026/02/28-22:59:53.931749 7f56f9bff6c0 Delete type=0 #1072
+2026/03/01-01:08:46.404628 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.404660 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.411063 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.417852 7f54e37ef6c0 Manual compaction at level-0 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.417886 7f54e37ef6c0 Manual compaction at level-1 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
diff --git a/packs/potions-alchimie/LOG.old b/packs/potions-alchimie/LOG.old
index 4b92591..459b7df 100644
--- a/packs/potions-alchimie/LOG.old
+++ b/packs/potions-alchimie/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.732884 7f56f9bff6c0 Recovering log #1064
-2026/02/28-16:33:30.743613 7f56f9bff6c0 Delete type=3 #1062
-2026/02/28-16:33:30.743678 7f56f9bff6c0 Delete type=0 #1064
-2026/02/28-17:23:47.190627 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.190673 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.196754 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.196895 7f54e37ef6c0 Manual compaction at level-0 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.196926 7f54e37ef6c0 Manual compaction at level-1 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.947009 7f56f93fe6c0 Recovering log #1068
+2026/02/28-17:23:52.956752 7f56f93fe6c0 Delete type=3 #1066
+2026/02/28-17:23:52.956816 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:43.792509 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.792547 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.799172 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.813770 7f54e37ef6c0 Manual compaction at level-0 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.813815 7f54e37ef6c0 Manual compaction at level-1 from '!items!0a8UFoCOd3D35WBb' @ 72057594037927935 : 1 .. '!items!y9NHZCxKXMZEqcRo' @ 0 : 0; will stop at (end)
diff --git a/packs/potions-alchimie/MANIFEST-001070 b/packs/potions-alchimie/MANIFEST-001074
similarity index 73%
rename from packs/potions-alchimie/MANIFEST-001070
rename to packs/potions-alchimie/MANIFEST-001074
index 9771d80..c573f06 100644
Binary files a/packs/potions-alchimie/MANIFEST-001070 and b/packs/potions-alchimie/MANIFEST-001074 differ
diff --git a/packs/races/001071.log b/packs/races/001076.log
similarity index 100%
rename from packs/races/001071.log
rename to packs/races/001076.log
diff --git a/packs/races/CURRENT b/packs/races/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/races/CURRENT
+++ b/packs/races/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/races/LOG b/packs/races/LOG
index 54c3d90..f1403a2 100644
--- a/packs/races/LOG
+++ b/packs/races/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.820409 7f56e3fff6c0 Recovering log #1068
-2026/02/28-17:23:52.831852 7f56e3fff6c0 Delete type=3 #1066
-2026/02/28-17:23:52.831927 7f56e3fff6c0 Delete type=0 #1068
+2026/02/28-22:59:53.785285 7f56e3fff6c0 Recovering log #1072
+2026/02/28-22:59:53.795623 7f56e3fff6c0 Delete type=3 #1070
+2026/02/28-22:59:53.795753 7f56e3fff6c0 Delete type=0 #1072
+2026/03/01-01:08:46.353251 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.353286 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.359340 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.366250 7f54e37ef6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.366306 7f54e37ef6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
diff --git a/packs/races/LOG.old b/packs/races/LOG.old
index 27f9a2c..d706b6d 100644
--- a/packs/races/LOG.old
+++ b/packs/races/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.607336 7f56e3fff6c0 Recovering log #1064
-2026/02/28-16:33:30.617749 7f56e3fff6c0 Delete type=3 #1062
-2026/02/28-16:33:30.617797 7f56e3fff6c0 Delete type=0 #1064
-2026/02/28-17:23:47.119733 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.119789 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.126273 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.144350 7f54e37ef6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.144395 7f54e37ef6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.820409 7f56e3fff6c0 Recovering log #1068
+2026/02/28-17:23:52.831852 7f56e3fff6c0 Delete type=3 #1066
+2026/02/28-17:23:52.831927 7f56e3fff6c0 Delete type=0 #1068
+2026/02/28-22:59:43.724001 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.724047 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.730898 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.731066 7f54e37ef6c0 Manual compaction at level-0 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.731104 7f54e37ef6c0 Manual compaction at level-1 from '!items!3oOvUd7AIqrXzLDl' @ 72057594037927935 : 1 .. '!items!oWexVALVtDXmedMy' @ 0 : 0; will stop at (end)
diff --git a/packs/races/MANIFEST-001070 b/packs/races/MANIFEST-001074
similarity index 73%
rename from packs/races/MANIFEST-001070
rename to packs/races/MANIFEST-001074
index b20eed6..c872783 100644
Binary files a/packs/races/MANIFEST-001070 and b/packs/races/MANIFEST-001074 differ
diff --git a/packs/spells/001071.log b/packs/spells/001076.log
similarity index 100%
rename from packs/spells/001071.log
rename to packs/spells/001076.log
diff --git a/packs/spells/CURRENT b/packs/spells/CURRENT
index 210222d..c3c2e54 100644
--- a/packs/spells/CURRENT
+++ b/packs/spells/CURRENT
@@ -1 +1 @@
-MANIFEST-001070
+MANIFEST-001074
diff --git a/packs/spells/LOG b/packs/spells/LOG
index 6342eb5..061cf42 100644
--- a/packs/spells/LOG
+++ b/packs/spells/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.908514 7f56f93fe6c0 Recovering log #1068
-2026/02/28-17:23:52.918072 7f56f93fe6c0 Delete type=3 #1066
-2026/02/28-17:23:52.918131 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:53.881284 7f56e3fff6c0 Recovering log #1072
+2026/02/28-22:59:53.892564 7f56e3fff6c0 Delete type=3 #1070
+2026/02/28-22:59:53.892646 7f56e3fff6c0 Delete type=0 #1072
+2026/03/01-01:08:46.398276 7f54e37ef6c0 Level-0 table #1077: started
+2026/03/01-01:08:46.398304 7f54e37ef6c0 Level-0 table #1077: 0 bytes OK
+2026/03/01-01:08:46.404544 7f54e37ef6c0 Delete type=0 #1075
+2026/03/01-01:08:46.417843 7f54e37ef6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.417869 7f54e37ef6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
diff --git a/packs/spells/LOG.old b/packs/spells/LOG.old
index 207b04f..4ba484b 100644
--- a/packs/spells/LOG.old
+++ b/packs/spells/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.696883 7f56f93fe6c0 Recovering log #1064
-2026/02/28-16:33:30.706599 7f56f93fe6c0 Delete type=3 #1062
-2026/02/28-16:33:30.706663 7f56f93fe6c0 Delete type=0 #1064
-2026/02/28-17:23:47.183016 7f54e37ef6c0 Level-0 table #1069: started
-2026/02/28-17:23:47.183043 7f54e37ef6c0 Level-0 table #1069: 0 bytes OK
-2026/02/28-17:23:47.190475 7f54e37ef6c0 Delete type=0 #1067
-2026/02/28-17:23:47.196884 7f54e37ef6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.196917 7f54e37ef6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.908514 7f56f93fe6c0 Recovering log #1068
+2026/02/28-17:23:52.918072 7f56f93fe6c0 Delete type=3 #1066
+2026/02/28-17:23:52.918131 7f56f93fe6c0 Delete type=0 #1068
+2026/02/28-22:59:43.778924 7f54e37ef6c0 Level-0 table #1073: started
+2026/02/28-22:59:43.778984 7f54e37ef6c0 Level-0 table #1073: 0 bytes OK
+2026/02/28-22:59:43.785225 7f54e37ef6c0 Delete type=0 #1071
+2026/02/28-22:59:43.785364 7f54e37ef6c0 Manual compaction at level-0 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.785392 7f54e37ef6c0 Manual compaction at level-1 from '!items!2svd3uio8Hp4e5Wy' @ 72057594037927935 : 1 .. '!items!zq5h9kCpo8gK4oIH' @ 0 : 0; will stop at (end)
diff --git a/packs/spells/MANIFEST-001070 b/packs/spells/MANIFEST-001074
similarity index 73%
rename from packs/spells/MANIFEST-001070
rename to packs/spells/MANIFEST-001074
index a3e4753..7251be9 100644
Binary files a/packs/spells/MANIFEST-001070 and b/packs/spells/MANIFEST-001074 differ
diff --git a/packs/vehicleweapons/000978.log b/packs/vehicleweapons/000983.log
similarity index 100%
rename from packs/vehicleweapons/000978.log
rename to packs/vehicleweapons/000983.log
diff --git a/packs/vehicleweapons/CURRENT b/packs/vehicleweapons/CURRENT
index 760f0f8..f51a32f 100644
--- a/packs/vehicleweapons/CURRENT
+++ b/packs/vehicleweapons/CURRENT
@@ -1 +1 @@
-MANIFEST-000977
+MANIFEST-000981
diff --git a/packs/vehicleweapons/LOG b/packs/vehicleweapons/LOG
index df10a5d..4974235 100644
--- a/packs/vehicleweapons/LOG
+++ b/packs/vehicleweapons/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.871452 7f56f9bff6c0 Recovering log #975
-2026/02/28-17:23:52.881163 7f56f9bff6c0 Delete type=3 #973
-2026/02/28-17:23:52.881256 7f56f9bff6c0 Delete type=0 #975
+2026/02/28-22:59:53.839850 7f56f9bff6c0 Recovering log #979
+2026/02/28-22:59:53.850551 7f56f9bff6c0 Delete type=3 #977
+2026/02/28-22:59:53.850617 7f56f9bff6c0 Delete type=0 #979
+2026/03/01-01:08:46.378747 7f54e37ef6c0 Level-0 table #984: started
+2026/03/01-01:08:46.378770 7f54e37ef6c0 Level-0 table #984: 0 bytes OK
+2026/03/01-01:08:46.384608 7f54e37ef6c0 Delete type=0 #982
+2026/03/01-01:08:46.391700 7f54e37ef6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.391740 7f54e37ef6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
diff --git a/packs/vehicleweapons/LOG.old b/packs/vehicleweapons/LOG.old
index bed2d51..89be01b 100644
--- a/packs/vehicleweapons/LOG.old
+++ b/packs/vehicleweapons/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.657363 7f56f8bfd6c0 Recovering log #971
-2026/02/28-16:33:30.668267 7f56f8bfd6c0 Delete type=3 #969
-2026/02/28-16:33:30.668326 7f56f8bfd6c0 Delete type=0 #971
-2026/02/28-17:23:47.151742 7f54e37ef6c0 Level-0 table #976: started
-2026/02/28-17:23:47.151765 7f54e37ef6c0 Level-0 table #976: 0 bytes OK
-2026/02/28-17:23:47.157639 7f54e37ef6c0 Delete type=0 #974
-2026/02/28-17:23:47.170048 7f54e37ef6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.170083 7f54e37ef6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.871452 7f56f9bff6c0 Recovering log #975
+2026/02/28-17:23:52.881163 7f56f9bff6c0 Delete type=3 #973
+2026/02/28-17:23:52.881256 7f56f9bff6c0 Delete type=0 #975
+2026/02/28-22:59:43.743995 7f54e37ef6c0 Level-0 table #980: started
+2026/02/28-22:59:43.744036 7f54e37ef6c0 Level-0 table #980: 0 bytes OK
+2026/02/28-22:59:43.750443 7f54e37ef6c0 Delete type=0 #978
+2026/02/28-22:59:43.758428 7f54e37ef6c0 Manual compaction at level-0 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.758464 7f54e37ef6c0 Manual compaction at level-1 from '!items!2cqkViQnOYZ4qwU1' @ 72057594037927935 : 1 .. '!items!qcCZxbaV9sucG1XK' @ 0 : 0; will stop at (end)
diff --git a/packs/vehicleweapons/MANIFEST-000977 b/packs/vehicleweapons/MANIFEST-000981
similarity index 73%
rename from packs/vehicleweapons/MANIFEST-000977
rename to packs/vehicleweapons/MANIFEST-000981
index 686c2b7..f45901e 100644
Binary files a/packs/vehicleweapons/MANIFEST-000977 and b/packs/vehicleweapons/MANIFEST-000981 differ
diff --git a/packs/weapons/000984.log b/packs/weapons/000989.log
similarity index 100%
rename from packs/weapons/000984.log
rename to packs/weapons/000989.log
diff --git a/packs/weapons/CURRENT b/packs/weapons/CURRENT
index 1dfa95c..2dc6923 100644
--- a/packs/weapons/CURRENT
+++ b/packs/weapons/CURRENT
@@ -1 +1 @@
-MANIFEST-000983
+MANIFEST-000987
diff --git a/packs/weapons/LOG b/packs/weapons/LOG
index c9eb861..17b2865 100644
--- a/packs/weapons/LOG
+++ b/packs/weapons/LOG
@@ -1,3 +1,8 @@
-2026/02/28-17:23:52.846187 7f56f93fe6c0 Recovering log #981
-2026/02/28-17:23:52.856256 7f56f93fe6c0 Delete type=3 #979
-2026/02/28-17:23:52.856329 7f56f93fe6c0 Delete type=0 #981
+2026/02/28-22:59:53.812922 7f56f93fe6c0 Recovering log #985
+2026/02/28-22:59:53.822992 7f56f93fe6c0 Delete type=3 #983
+2026/02/28-22:59:53.823060 7f56f93fe6c0 Delete type=0 #985
+2026/03/01-01:08:46.359452 7f54e37ef6c0 Level-0 table #990: started
+2026/03/01-01:08:46.359484 7f54e37ef6c0 Level-0 table #990: 0 bytes OK
+2026/03/01-01:08:46.366109 7f54e37ef6c0 Delete type=0 #988
+2026/03/01-01:08:46.366268 7f54e37ef6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
+2026/03/01-01:08:46.366297 7f54e37ef6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
diff --git a/packs/weapons/LOG.old b/packs/weapons/LOG.old
index 7337c13..e4b6513 100644
--- a/packs/weapons/LOG.old
+++ b/packs/weapons/LOG.old
@@ -1,8 +1,8 @@
-2026/02/28-16:33:30.632587 7f56f93fe6c0 Recovering log #977
-2026/02/28-16:33:30.642029 7f56f93fe6c0 Delete type=3 #975
-2026/02/28-16:33:30.642091 7f56f93fe6c0 Delete type=0 #977
-2026/02/28-17:23:47.138374 7f54e37ef6c0 Level-0 table #982: started
-2026/02/28-17:23:47.138404 7f54e37ef6c0 Level-0 table #982: 0 bytes OK
-2026/02/28-17:23:47.144277 7f54e37ef6c0 Delete type=0 #980
-2026/02/28-17:23:47.144377 7f54e37ef6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
-2026/02/28-17:23:47.144417 7f54e37ef6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
+2026/02/28-17:23:52.846187 7f56f93fe6c0 Recovering log #981
+2026/02/28-17:23:52.856256 7f56f93fe6c0 Delete type=3 #979
+2026/02/28-17:23:52.856329 7f56f93fe6c0 Delete type=0 #981
+2026/02/28-22:59:43.717496 7f54e37ef6c0 Level-0 table #986: started
+2026/02/28-22:59:43.717545 7f54e37ef6c0 Level-0 table #986: 0 bytes OK
+2026/02/28-22:59:43.723858 7f54e37ef6c0 Delete type=0 #984
+2026/02/28-22:59:43.731055 7f54e37ef6c0 Manual compaction at level-0 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
+2026/02/28-22:59:43.731096 7f54e37ef6c0 Manual compaction at level-1 from '!items!2xxMC458KXaAgm3T' @ 72057594037927935 : 1 .. '!items!zjOFhNocHjeJZcy4' @ 0 : 0; will stop at (end)
diff --git a/packs/weapons/MANIFEST-000983 b/packs/weapons/MANIFEST-000987
similarity index 72%
rename from packs/weapons/MANIFEST-000983
rename to packs/weapons/MANIFEST-000987
index c378963..d653eda 100644
Binary files a/packs/weapons/MANIFEST-000983 and b/packs/weapons/MANIFEST-000987 differ
diff --git a/styles/components/actor.less b/styles/components/actor.less
index b2180b8..bc89c74 100644
--- a/styles/components/actor.less
+++ b/styles/components/actor.less
@@ -111,6 +111,28 @@
&:hover { color: #4b4a44; }
}
+ .horde-stat-label {
+ font-weight: bold;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1rem;
+ font-variant: small-caps;
+ color: #4b4a44;
+ display: flex;
+ align-items: center;
+ }
+
+ .horde-stat-row {
+ align-items: center;
+ margin-bottom: 4px;
+ }
+
+ .horde-stat-sep {
+ color: #4b4a44;
+ font-weight: bold;
+ padding: 0 4px;
+ flex: 0;
+ }
+
.bol-footer {
height: 62px;
max-height: 62px;
@@ -346,12 +368,166 @@
}
.character-summary-container {
- opacity: 0.95;
+ background: #f5f0e8;
+ padding: 4px;
+
+ // Table layout
+ .cs-table {
+ width: 100%;
+ margin: 0;
+ }
+
+ // Section headers (PJs / PNJs)
+ .cs-section-header {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ padding: 4px 6px;
+ min-height: 28px;
+ align-items: center;
+ margin-top: 2px;
+
+ .item-name,
+ .cs-name-col {
+ font-family: "Wolfsbane2Expanded", cursive !important;
+ font-size: 1.1em !important;
+ color: #fff !important;
+ text-shadow: 0 1px 2px rgba(0,0,0,0.5);
+ }
+ .cs-group-header {
+ font-family: 'Signika', sans-serif !important;
+ font-size: 0.75em !important;
+ color: #ffdddd !important;
+ text-align: center;
+ justify-content: center;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ border-left: 1px solid rgba(255,255,255,0.25);
+ }
+ }
+
+ // Column sub-header row (abbrevs)
+ .cs-col-row {
+ background: #ede0cc;
+ min-height: 20px;
+ padding: 1px 6px;
+ align-items: center;
+ border-bottom: 1px solid #c8b89a;
+ .cs-col-header {
+ font-family: 'Signika', sans-serif !important;
+ font-size: 0.75em !important;
+ color: #7a0000 !important;
+ text-align: center;
+ justify-content: center;
+ font-weight: bold;
+ }
+ }
+
+ // Actor portrait
+ .cs-portrait-col {
+ flex: 0 0 34px;
+ width: 34px;
+ min-width: 34px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ .cs-portrait {
+ width: 30px;
+ height: 30px;
+ border-radius: 3px;
+ border: 1px solid #c0a080;
+ object-fit: cover;
+ }
+
+ // Name column
+ .cs-name-col {
+ min-width: 9rem;
+ width: 9rem;
+ }
+
+ // Actor rows
+ .cs-actor-row {
+ min-height: 36px;
+ padding: 3px 4px;
+ border-bottom: 1px solid #d0c8b8;
+ align-items: center;
+ background: #faf6ee;
+ transition: background 0.15s;
+
+ &:hover {
+ background: #ede8dc;
+ }
+ }
+
+ // Actor name link
+ .cs-actor-name {
+ font-family: 'Signika', sans-serif;
+ font-size: 0.9em;
+ color: #7a0000;
+ font-weight: bold;
+ cursor: pointer;
+ text-decoration: none;
+
+ &:hover { text-decoration: underline; }
+ }
+
+ // Stat cells (clickable rolls)
+ .cs-stat {
+ justify-content: center;
+ text-align: center;
+ }
+ // Visual separator at start of a column group
+ .cs-group-sep {
+ border-left: 1px solid #c0a878;
+ }
+ .cs-col-row .cs-group-sep {
+ border-left: 1px solid #c0a878;
+ }
+ .cs-rollable {
+ display: inline-block;
+ min-width: 1.8em;
+ text-align: center;
+ color: #333;
+ font-size: 0.88em;
+ font-weight: bold;
+ font-family: 'Orbitron', sans-serif;
+ border-radius: 3px;
+ padding: 1px 3px;
+ cursor: pointer;
+ text-decoration: none;
+
+ &:hover {
+ background: darkred;
+ color: #fff;
+ }
+ }
+
+ // Resource cells (val/max)
+ .cs-resource {
+ justify-content: center;
+ font-size: 0.82em;
+ color: #555;
+ gap: 1px;
+ }
+ .cs-res-val { color: #191813; font-weight: bold; font-family: 'Orbitron', sans-serif; }
+ .cs-res-sep { color: #999; }
+ .cs-res-max { color: #888; font-family: 'Orbitron', sans-serif; }
+
+ // Horoscope inputs
+ .cs-input {
+ width: 3rem;
+ text-align: center;
+ border: 1px solid #c0a080;
+ border-radius: 3px;
+ padding: 2px 4px;
+ background: #fff;
+ font-size: 0.85em;
+ }
+
+ // Delete button
+ .actor-delete { color: #c0392b; }
+ .actor-delete:hover { color: #e74c3c; }
}
-.character-summary-rollable {
- text-decoration: underline;
-}
.activated-green {
color: darkgreen;
diff --git a/styles/components/common.less b/styles/components/common.less
index f5a265b..fa26abf 100644
--- a/styles/components/common.less
+++ b/styles/components/common.less
@@ -10,6 +10,156 @@ body.system-bol img#logo {
/* Reserved for future use */
}
+.bol.dialog {
+ & > section.window-content {
+ background: white;
+ border: 10px solid transparent;
+ border-image: url("/systems/bol/ui/box-border-large.webp") 36 repeat;
+ border-image-outset: 1;
+ padding: 10px;
+ }
+
+ .window-title {
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #4b4a44;
+ }
+
+ .sheet-header {
+ text-align: center;
+ margin-bottom: 6px;
+ padding: 4px 0;
+ border-bottom: 2px solid darkred;
+
+ h3 {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.3rem;
+ color: #191813;
+ margin: 0;
+ }
+ }
+
+ .roll-box, .box-roll,
+ div.flexrow:has(.bg-darkred) {
+ border-radius: 6px;
+ overflow: hidden;
+ margin-bottom: 1px;
+ background: #f5f0e8;
+ gap: 2px;
+
+ .bg-darkred {
+ padding: 4px 10px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.78rem;
+ letter-spacing: 0.6px;
+ border-radius: 5px;
+ margin: 2px 0 2px 2px;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ text-shadow: 0 1px 2px rgba(0,0,0,0.4);
+ }
+
+ .cell {
+ background: transparent;
+ padding: 2px 6px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #191813;
+ flex-wrap: wrap;
+
+ label.checkbox {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ }
+ }
+ }
+
+ select, input[type="text"], input[type="number"] {
+ background: transparent !important;
+ color: #191813 !important;
+ border: none !important;
+ box-shadow: none !important;
+ font-size: 0.88rem;
+ width: 100%;
+
+ option {
+ background: #f5f0e8;
+ color: #191813;
+ }
+ option:checked, option:hover {
+ background: darkred;
+ color: white;
+ }
+ }
+
+ input:disabled {
+ color: #8b0000 !important;
+ font-weight: bold;
+ font-size: 0.95rem;
+ }
+
+ .dice-options-cell {
+ display: flex !important;
+ flex-wrap: wrap;
+ gap: 4px;
+ padding: 4px 6px;
+ justify-content: center;
+
+ .dice-option {
+ display: flex;
+ align-items: center;
+ gap: 3px;
+ padding: 2px 7px;
+ border-radius: 4px;
+ font-size: 0.82rem;
+ cursor: pointer;
+ white-space: nowrap;
+
+ input[type="radio"] { margin: 0; }
+ }
+
+ .bdice-label { background: #e8f5e8; color: #1a5c1a; border: 1px solid #4caf50; }
+ .neutral-label { background: #f0ede5; color: #4b4a44; border: 1px solid #9e9e7a; }
+ .mdice-label { background: #fce8e8; color: #7a0000; border: 1px solid #e57373; }
+ }
+}
+
+.bol.sheet, .bol.dialog {
+ footer.form-footer {
+ display: flex;
+ gap: 8px;
+ margin-top: 8px;
+ padding-top: 6px;
+ border-top: 2px solid darkred;
+
+ button {
+ flex: 1;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ color: white;
+ border: 1px solid #6b0000;
+ border-radius: 5px;
+ padding: 5px 10px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.95rem;
+ letter-spacing: 0.6px;
+ text-shadow: 0 1px 2px rgba(0,0,0,0.4);
+ cursor: pointer;
+ transition: background 0.15s;
+
+ i { margin-right: 4px; }
+
+ &:hover { background: linear-gradient(135deg, #9b0000, #c00000); }
+
+ &[type="button"] {
+ background: linear-gradient(135deg, #2a2a2a, #4b4a44);
+ border-color: #2a2a2a;
+ &:hover { background: linear-gradient(135deg, #3a3a3a, #5b5a54); }
+ }
+ }
+ }
+}
+
.bol.sheet {
.window-header {
border: none;
@@ -88,6 +238,13 @@ body.system-bol img#logo {
border: 1px solid #4b4a44 !important;
border-radius: 0.5rem;
text-align: center;
+
+ &[type="select"],
+ &:is(select) {
+ border: 1px solid #4b4a44 !important;
+ border-radius: 0.5rem;
+ background-color: #2a2a2a30;
+ }
}
}
}
@@ -170,6 +327,18 @@ body.system-bol img#logo {
margin-top: 6px;
margin-bottom: 6px;
}
+
+ .editor,
+ .editor-content,
+ prose-mirror {
+ color: #191813;
+ }
+ prose-mirror .editor-content,
+ prose-mirror p,
+ prose-mirror div,
+ prose-mirror span {
+ color: #191813 !important;
+ }
}
&.description {
@@ -195,6 +364,12 @@ body.system-bol img#logo {
font-size: 0.95rem;
margin-left: 6px;
}
+ select.header-field-value {
+ background-color: #2a2a2a30;
+ border: 1px solid #4b4a44 !important;
+ border-radius: 0.5rem;
+ color: #4b4a44;
+ }
}
}
}
diff --git a/styles/components/item.less b/styles/components/item.less
index e891e88..59d0300 100644
--- a/styles/components/item.less
+++ b/styles/components/item.less
@@ -176,13 +176,14 @@
.form-group {
display: flex;
flex-direction: row;
- align-items: center;
+ align-items: flex-start;
margin: 3px 0;
- label {
+ > label:not(.checkbox) {
flex: 0 0 40%;
color: #191813;
font-weight: bold;
+ padding-top: 2px;
}
input[type="checkbox"] {
@@ -201,6 +202,12 @@
.form-fields {
flex: 1;
}
+
+ .form-fields {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
}
label.checkbox {
@@ -218,6 +225,13 @@
}
}
+ .vehicle-checkboxes {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 6px 16px;
+ padding: 4px 0;
+ }
+
input[type="text"],
input[type="number"],
input[type="text"]:hover,
diff --git a/styles/global/chat.less b/styles/global/chat.less
index 5b66bd7..dc9d56e 100644
--- a/styles/global/chat.less
+++ b/styles/global/chat.less
@@ -171,23 +171,33 @@
}
h2.critical {
- color: green;
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #1a7a1a;
font-weight: bold;
+ font-size: 1.1rem;
+ text-shadow: 0 1px 2px rgba(0,0,0,0.15);
}
h2.fumble {
- color: red;
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #8b0000;
font-weight: bold;
+ font-size: 1.1rem;
+ text-shadow: 0 1px 2px rgba(0,0,0,0.15);
}
h2.success {
- color: darkgreen;
+ font-family: "Wolfsbane2Expanded", cursive;
+ color: #1a5c1a;
font-weight: bold;
+ font-size: 1.05rem;
}
h2.failure {
+ font-family: "Wolfsbane2Expanded", cursive;
color: darkred;
font-weight: bold;
+ font-size: 1.05rem;
}
h2.roll {
@@ -208,13 +218,12 @@ h2.bad {
.chat-message {
margin: 3px;
- padding: 10px;
- font-size: 14px;
- border-radius: 0;
- background-color: white;
- background-image: url("/systems/bol/ui/box-border-large.webp");
- background-repeat: no-repeat;
- background-size: 100% 100%;
+ padding: 6px 8px;
+ font-size: 13px;
+ border-radius: 3px;
+ background-color: #faf7f2;
+ border: 1px solid #d4c8b0;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.12);
.message-header {
.flavor-text {
@@ -222,8 +231,555 @@ h2.bad {
font-size: 14px;
h2 {
- font-family: "Modesto Condensed", "Palatino Linotype", serif;
- font-size: 20px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.1rem;
+ margin: 2px 0;
+ }
+ }
+ }
+
+ // Status banner (success/failure h2)
+ h2.success, h2.failure, h2.critical, h2.fumble {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 4px 10px;
+ border-radius: 4px;
+ margin: 0 0 6px 0;
+ font-size: 1rem;
+ letter-spacing: 0.5px;
+
+ i { font-size: 0.9em; }
+ }
+
+ h2.success, h2.critical {
+ background: linear-gradient(135deg, #1a5c1a20, #2d7a2d15);
+ border: 1px solid #4caf5040;
+ color: #1a5c1a;
+ }
+
+ h2.critical {
+ background: linear-gradient(135deg, #1a5c1a30, #2d7a2d25);
+ border-color: #4caf5070;
+ }
+
+ h2.failure {
+ background: linear-gradient(135deg, #7a000015, #8b000010);
+ border: 1px solid #8b000030;
+ color: #8b0000;
+ }
+
+ h2.fumble {
+ background: linear-gradient(135deg, #7a000025, #8b000020);
+ border: 1px solid #8b000060;
+ color: #6b0000;
+ }
+
+ h3 {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.95rem;
+ color: #191813;
+ margin: 2px 0 5px 0;
+ border-bottom: 1px solid #d4c8b0;
+ padding-bottom: 3px;
+ letter-spacing: 0.3px;
+ }
+
+ .chat-icon {
+ float: right;
+ border: 1px solid #c4a882;
+ box-shadow: 1px 1px 3px rgba(0,0,0,0.25);
+ border-radius: 3px;
+ margin: 0 0 4px 6px;
+ width: 52px;
+ height: 52px;
+ object-fit: cover;
+ }
+
+ .actions-section {
+ font-size: 0.82rem;
+ color: #4b4a44;
+ line-height: 1.4;
+
+ & > div {
+ margin: 2px 0;
+ }
+ }
+
+ .chat-button,
+ .chat-damage-roll,
+ .chat-damage-apply,
+ .damage-handling,
+ .recup-vitalite {
+ display: block;
+ width: 100%;
+ margin: 3px 0;
+ padding: 4px 10px;
+ background: linear-gradient(135deg, #2a2a2a, #4b4a44);
+ color: #e8e0d0;
+ border: 1px solid #2a2a2a;
+ border-radius: 4px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.82rem;
+ letter-spacing: 0.4px;
+ cursor: pointer;
+ text-align: center;
+ transition: background 0.15s;
+
+ &:hover { background: linear-gradient(135deg, #3a3a3a, #5b5a54); }
+
+ &.hero-reroll {
+ background: linear-gradient(135deg, #7a5500, #a07000);
+ border-color: #6a4500;
+ &:hover { background: linear-gradient(135deg, #9a6500, #c08000); }
+ }
+
+ &.transform-heroic-roll, &.transform-legendary-roll {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+ &:hover { background: linear-gradient(135deg, #9b0000, #c00000); }
+ }
+ }
+
+ // Dommages normaux
+ .chat-damage-roll[data-damage-mode="normal-damage"] {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+ &:hover { background: linear-gradient(135deg, #9b0000, #c00000); }
+ }
+
+ // Dommages +6 / +12 (critique)
+ .chat-damage-roll[data-damage-mode^="damage-plus"] {
+ background: linear-gradient(135deg, #5a0070, #7a00a0);
+ border-color: #4a0060;
+ &:hover { background: linear-gradient(135deg, #7a0090, #9a00c0); }
+ }
+
+ // Appliquer dommages
+ .chat-damage-apply {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+ &:hover { background: linear-gradient(135deg, #9b0000, #c00000); }
+ }
+
+ // Récupération
+ .recup-vitalite {
+ background: linear-gradient(135deg, #1a5c1a, #2d7a2d);
+ border-color: #1a4a1a;
+ &:hover { background: linear-gradient(135deg, #2a7a2a, #3d9a3d); }
+ }
+
+ // Défense/gestion dommages
+ .damage-handling {
+ background: linear-gradient(135deg, #7a5500, #a07000);
+ border-color: #6a4500;
+ &:hover { background: linear-gradient(135deg, #9a6500, #c08000); }
+
+ &[data-defense-mode="damage-not-applied"] {
+ background: linear-gradient(135deg, #1a5c1a, #2d7a2d);
+ border-color: #1a4a1a;
+ &:hover { background: linear-gradient(135deg, #2a7a2a, #3d9a3d); }
+ }
+
+ &[data-defense-mode="hero-in-extremis"], &[data-defense-mode="hero-reduce-damage"] {
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-color: #6b0000;
+ &:hover { background: linear-gradient(135deg, #9b0000, #c00000); }
+ }
+ }
+
+// Damage & defense cards
+ .bol-damage-card, .bol-defense-card {
+ .damage-card-header, .defense-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 6px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+
+ .damage-weapon-img {
+ width: 44px;
+ height: 44px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ box-shadow: 1px 1px 3px rgba(0,0,0,0.25);
+ object-fit: cover;
+ flex: 0 0 44px;
+ }
+
+ .damage-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+
+ .damage-card-label {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.75rem;
+ color: #7a0000;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ }
+
+ .damage-weapon-name {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+ letter-spacing: 0.3px;
+ }
+
+ .damage-formula {
+ font-size: 0.78rem;
+ color: #6b6b5a;
+ font-style: italic;
+ }
+
+ .damage-total-badge {
+ display: inline-block;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ color: #e8d890;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.2rem;
+ font-weight: bold;
+ padding: 1px 10px;
+ border-radius: 4px;
+ letter-spacing: 1px;
+ align-self: flex-start;
+
+ &.damage-total-badge--hit {
+ background: linear-gradient(135deg, #7a5500, #a07000);
+ }
+ }
+ }
+ }
+
+ .damage-target {
+ font-size: 0.8rem;
+ color: #4b4a44;
+ font-style: italic;
+ margin-bottom: 4px;
+ }
+
+ .damage-note {
+ font-size: 0.78rem;
+ color: #4b4a44;
+ padding: 2px 6px;
+ margin-bottom: 4px;
+ border-left: 2px solid #c4a882;
+
+ &.damage-note--warn {
+ border-left-color: darkred;
+ color: darkred;
+ }
+ }
+
+ .defense-hero-separator {
+ text-align: center;
+ font-size: 0.72rem;
+ color: #8b7355;
+ font-family: "IMFellDWPicaSC-Regular", serif;
+ font-style: italic;
+ margin: 3px 0 1px;
+ }
+
+ .defense-footer-note {
+ font-size: 0.72rem;
+ color: #8b7355;
+ font-style: italic;
+ text-align: center;
+ margin-top: 4px;
+ padding-top: 3px;
+ border-top: 1px dashed #d4c8b0;
+ }
+ }
+
+ .bol-defense-summary-card {
+ .defense-summary-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 6px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+
+ .damage-weapon-img {
+ width: 44px;
+ height: 44px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ box-shadow: 1px 1px 3px rgba(0,0,0,0.25);
+ object-fit: cover;
+ flex: 0 0 44px;
+ }
+ }
+
+ .defense-summary-details {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ }
+
+ .defense-detail {
+ font-size: 0.82rem;
+ color: #4b4a44;
+ padding: 1px 4px;
+ border-left: 2px solid #c4a882;
+
+ &.warning {
+ border-left-color: darkred;
+ color: darkred;
+ }
+ }
+
+ .defense-final {
+ margin-top: 5px;
+ padding: 3px 8px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+ background: #f0ece0;
+ border-radius: 3px;
+ border-left: 3px solid darkred;
+
+ &.defense-final--safe {
+ border-left-color: #4a7a4a;
+ color: #2a5a2a;
+ background: #e8f5e8;
+ }
+ }
+
+ .damage-total-badge--none {
+ background: linear-gradient(135deg, #4a7a4a, #2d5a2d) !important;
+ }
+ }
+
+ // Vitality / death card
+ .bol-vitality-card {
+ .vitality-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 6px;
+ padding-bottom: 5px;
+ border-bottom: 2px solid #4b1010;
+
+ .damage-weapon-img {
+ width: 44px;
+ height: 44px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ box-shadow: 1px 1px 3px rgba(0,0,0,0.25);
+ object-fit: cover;
+ flex: 0 0 44px;
+ }
+ }
+
+ .vitality-card-body {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ }
+
+ .vitality-detail {
+ font-size: 0.82rem;
+ color: #4b4a44;
+ padding: 1px 4px;
+ border-left: 2px solid #c4a882;
+ }
+
+ .vitality-hint {
+ font-size: 0.78rem;
+ color: #6b6b5a;
+ font-style: italic;
+ padding-left: 6px;
+ }
+
+ .vitality-dead {
+ margin-top: 4px;
+ padding: 3px 8px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #f0e8d0;
+ background: linear-gradient(135deg, #4b1010, #7a0000);
+ border-radius: 3px;
+ }
+
+ .vitality-epitaph {
+ font-size: 0.78rem;
+ color: #6b6b5a;
+ font-style: italic;
+ text-align: center;
+ margin-top: 3px;
+ }
+ }
+
+ // Spell card
+ .bol-spell-card {
+ margin: 6px 0;
+ .spell-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 5px 0;
+ border-bottom: 1px solid #d4c8b0;
+ .spell-img {
+ width: 40px; height: 40px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ object-fit: cover;
+ flex: 0 0 40px;
+ }
+ .spell-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ .spell-name {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+ }
+ .spell-stats {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+ .spell-stat-badge {
+ display: inline-block;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.72rem;
+ padding: 1px 7px;
+ border-radius: 3px;
+ letter-spacing: 0.3px;
+ &.cost {
+ background: linear-gradient(135deg, #3a0080, #6a00c0);
+ color: #e8d0ff;
+ border: 1px solid #5a00a0;
+ }
+ &.remaining {
+ background: linear-gradient(135deg, #1a4a6a, #2a6a9a);
+ color: #d0e8ff;
+ border: 1px solid #1a3a5a;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Alchemy card
+ .bol-alchemy-card {
+ margin: 6px 0;
+ .alchemy-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+ .alchemy-img {
+ width: 40px; height: 40px;
+ border: 1px solid #c4a882;
+ border-radius: 3px;
+ object-fit: cover;
+ flex: 0 0 40px;
+ }
+ .alchemy-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ .alchemy-name {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+ }
+ .alchemy-stat-badge {
+ display: inline-block;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.72rem;
+ padding: 1px 7px;
+ border-radius: 3px;
+ background: linear-gradient(135deg, #5a3a00, #8a6000);
+ color: #ffe0a0;
+ border: 1px solid #4a3000;
+ }
+ }
+ }
+ .alchemy-result {
+ font-size: 0.78rem;
+ font-style: italic;
+ padding: 4px 6px;
+ margin-top: 5px;
+ border-radius: 3px;
+ line-height: 1.4;
+ &.success {
+ color: #1a4a1a;
+ background: #e8f5e8;
+ border: 1px solid #a0d0a0;
+ }
+ &.failure {
+ color: #4a1a1a;
+ background: #f5e8e8;
+ border: 1px solid #d0a0a0;
+ }
+ }
+ }
+
+ // Horoscope card
+ .bol-horoscope-card {
+ margin: 6px 0;
+ .horoscope-card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4c8b0;
+ .horoscope-icon {
+ font-size: 1.6rem;
+ color: #8a6500;
+ flex: 0 0 auto;
+ }
+ .horoscope-card-title {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ .horoscope-type {
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.9rem;
+ color: #191813;
+ }
+ .horoscope-stat-badge {
+ display: inline-block;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.72rem;
+ padding: 1px 7px;
+ border-radius: 3px;
+ background: linear-gradient(135deg, #6a5500, #a08000);
+ color: #ffe890;
+ border: 1px solid #5a4500;
+ }
+ }
+ }
+ .horoscope-result {
+ .horoscope-text {
+ display: block;
+ font-size: 0.78rem;
+ font-style: italic;
+ padding: 4px 6px;
+ margin-top: 5px;
+ border-radius: 3px;
+ line-height: 1.4;
+ &.success {
+ color: #1a4a1a;
+ background: #e8f5e8;
+ border: 1px solid #a0d0a0;
+ }
+ &.failure {
+ color: #4a1a1a;
+ background: #f5e8e8;
+ border: 1px solid #d0a0a0;
+ }
}
}
}
@@ -232,30 +788,97 @@ h2.bad {
.dice-roll {
.dice-result {
.dice-formula {
- border-radius: 0px;
- border: 1px inset lightgray;
- background-color: #282828;
- color: white;
+ border-radius: 4px;
+ border: 1px solid #555;
+ background: linear-gradient(135deg, #1a1a1a, #2a2a2a);
+ color: #d0c8b8;
+ font-size: 0.8rem;
+ padding: 2px 8px;
+ text-align: center;
+ margin-bottom: 3px;
}
.dice-tooltip {
+ background: #1a1a1a;
+ border: 1px solid #444;
+ border-radius: 4px;
+
.tooltip-part {
.part-total {
- border-radius: 0px;
- border: 1px inset lightgray;
+ border-radius: 0;
+ border: 1px inset #444;
background-color: #2a2a2a;
- color: white;
+ color: #d0c8b8;
}
}
}
.dice-total {
- border-radius: 0px;
- border: 1px inset lightgray;
- background-color: #2a2a2a;
- color: white;
+ border-radius: 4px;
+ border: 2px solid #4b4a44;
+ background: linear-gradient(135deg, #191813, #2a2a2a);
+ color: #e8d890;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 1.4rem;
+ font-weight: bold;
+ letter-spacing: 1px;
+ padding: 2px 0;
+ margin-top: 3px;
}
}
}
}
}
+
+.bol-welcome-card {
+ .welcome-header {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 8px;
+ padding-bottom: 6px;
+ border-bottom: 2px solid darkred;
+
+ .welcome-logo {
+ width: 52px;
+ height: 52px;
+ object-fit: contain;
+ flex: 0 0 52px;
+ }
+ }
+
+ .welcome-body {
+ font-size: 0.82rem;
+ color: #191813;
+ line-height: 1.4;
+
+ p {
+ margin: 4px 0;
+ padding-left: 4px;
+ border-left: 2px solid #d4c8b0;
+ }
+
+ a { color: darkred; }
+ }
+
+ .welcome-footer {
+ margin-top: 8px;
+ padding: 4px 10px;
+ font-family: "Wolfsbane2Expanded", cursive;
+ font-size: 0.95rem;
+ color: #e8d890;
+ background: linear-gradient(135deg, #7a0000, darkred);
+ border-radius: 4px;
+ letter-spacing: 0.5px;
+ }
+
+ .welcome-warning {
+ margin-top: 6px;
+ padding: 4px 8px;
+ font-size: 0.8rem;
+ color: #7a0000;
+ background: #fff3f3;
+ border: 1px solid #e57373;
+ border-radius: 3px;
+ }
+}
diff --git a/styles/global/forms.less b/styles/global/forms.less
index 60257d9..324a864 100644
--- a/styles/global/forms.less
+++ b/styles/global/forms.less
@@ -23,6 +23,17 @@
box-shadow: none;
}
+ /* Hide number input spinners */
+ input[type="number"]::-webkit-inner-spin-button,
+ input[type="number"]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+ }
+ input[type="number"] {
+ -moz-appearance: textfield;
+ appearance: textfield;
+ }
+
input:disabled:hover,
select:disabled:hover,
textarea:disabled:hover,
diff --git a/styles/global/typography.less b/styles/global/typography.less
index 05dd44c..95e7f92 100644
--- a/styles/global/typography.less
+++ b/styles/global/typography.less
@@ -9,6 +9,22 @@
src: url(https://fonts.gstatic.com/s/contrailone/v10/eLGbP-j_JA-kG0_Zo51noafdZQ.ttf) format('truetype');
}
+@font-face {
+ font-family: 'Orbitron';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyGy6BoWgz.woff2) format('woff2');
+}
+
+@font-face {
+ font-family: 'Orbitron';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/orbitron/v31/yMJMMIlzdpvBhQQL_SC3X9yhF25-T1nyKS6BoWgz.woff2) format('woff2');
+}
+
@font-face {
font-family: "CCMeanwhile";
src: url('../fonts/ccmeanwhile-regular.ttf');
diff --git a/templates/actor/horde-sheet.hbs b/templates/actor/horde-sheet.hbs
index 4501d7d..775e31b 100644
--- a/templates/actor/horde-sheet.hbs
+++ b/templates/actor/horde-sheet.hbs
@@ -5,7 +5,7 @@
{{!-- Sidebar --}}
@@ -15,8 +15,7 @@
@@ -34,24 +33,25 @@
+
-
-
-
diff --git a/templates/actor/parts/actor-header.hbs b/templates/actor/parts/actor-header.hbs
index d179dd2..b56b862 100644
--- a/templates/actor/parts/actor-header.hbs
+++ b/templates/actor/parts/actor-header.hbs
@@ -20,7 +20,7 @@
{{else}}
-
+
\ No newline at end of file
diff --git a/templates/actor/parts/tabs/horde-description.hbs b/templates/actor/parts/tabs/horde-description.hbs
index 37c6051..d9288c1 100644
--- a/templates/actor/parts/tabs/horde-description.hbs
+++ b/templates/actor/parts/tabs/horde-description.hbs
@@ -5,6 +5,7 @@
-{{editor description target="system.description" button=true owner=owner
-editable=editable}}
+
+ {{{description}}}
+
diff --git a/templates/actor/parts/tabs/vehicle-description.hbs b/templates/actor/parts/tabs/vehicle-description.hbs
index 37c6051..6dff23b 100644
--- a/templates/actor/parts/tabs/vehicle-description.hbs
+++ b/templates/actor/parts/tabs/vehicle-description.hbs
@@ -5,6 +5,7 @@
-{{editor description target="system.description" button=true owner=owner
-editable=editable}}
+
+ {{{description}}}
+
diff --git a/templates/actor/parts/tabs/vehicle-stats.hbs b/templates/actor/parts/tabs/vehicle-stats.hbs
index 74ac72e..5d68fbf 100644
--- a/templates/actor/parts/tabs/vehicle-stats.hbs
+++ b/templates/actor/parts/tabs/vehicle-stats.hbs
@@ -4,20 +4,20 @@
{{#each system.attributes as |attr key|}}
{{localize attr.label}}
-
-
+
+
{{/each}}
{{#if (eq system.vehicletype "boat")}}
{{localize system.row.label}}
-
-
+
+
{{/if}}
diff --git a/templates/actor/parts/tabs/vehicle-weapons.hbs b/templates/actor/parts/tabs/vehicle-weapons.hbs
index 5992492..904bef3 100644
--- a/templates/actor/parts/tabs/vehicle-weapons.hbs
+++ b/templates/actor/parts/tabs/vehicle-weapons.hbs
@@ -1,11 +1,10 @@
-{{localize "BOL.ui.vehicleWeapons"}}
{{#each weapons as |item id|}}
diff --git a/templates/actor/vehicle-sheet.hbs b/templates/actor/vehicle-sheet.hbs
index bdcc9c9..a1ea532 100644
--- a/templates/actor/vehicle-sheet.hbs
+++ b/templates/actor/vehicle-sheet.hbs
@@ -5,7 +5,7 @@
{{!-- Sidebar --}}
@@ -15,12 +15,11 @@