Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 78e5d29e2f | |||
| 41bde6dc02 | |||
| b0265a7089 | |||
| dbd8352d42 | |||
| 9aaf5dbe93 | |||
| b407f6e8c0 | |||
| aecc15d8b9 | |||
| a2b712b78d | |||
| fc6bb7a4b1 | |||
| f26130d208 | |||
| 39da08d4cb | |||
| e639b6ae3e | |||
| 8c247a8981 | |||
| a09e1a1d95 | |||
| 787f88873a | |||
| ac481e0dd9 | |||
| 375622d900 | |||
| 3bc055cc1f | |||
| c97b7a4889 | |||
| 5d13500838 | |||
| d21515e1e3 | |||
| 78ef009465 | |||
| e794611bf3 | |||
| 529a62045e | |||
| d462d22a0a | |||
| 710ee54531 | |||
| 7994aa7db4 | |||
| 5176b4ce87 | |||
| 3d6f195fc2 | |||
| 3693d68c24 | |||
| 16ccd2f3e1 | |||
| 631eb280ca |
@@ -11,42 +11,53 @@ jobs:
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||
|
||||
#- uses: actions/checkout@v3
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
- uses: https://github.com/RouxAntoine/checkout@v3.5.4
|
||||
|
||||
# get part of the tag after the `v`
|
||||
- name: Extract tag version number
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2
|
||||
uses: https://github.com/battila7/get-version-action@v2
|
||||
|
||||
# Substitute the Manifest and Download URLs in the module.json
|
||||
- name: Substitute Manifest and Download Links For Versioned Ones
|
||||
id: sub_manifest_link_version
|
||||
uses: microsoft/variable-substitution@v1
|
||||
uses: https://github.com/microsoft/variable-substitution@v1
|
||||
with:
|
||||
files: 'system.json'
|
||||
files: "system.json"
|
||||
env:
|
||||
version: ${{steps.get_version.outputs.version-without-v}}
|
||||
url: https://www.uberwald.me/gitea/${{gitea.repository}}
|
||||
manifest: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/latest/system.json
|
||||
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-te-deum-${{github.event.release.tag_name}}.zip
|
||||
manifest: https://www.uberwald.me/gitea/public/fvtt-te-deum/releases/download/latest/system.json
|
||||
download: https://www.uberwald.me/gitea/public/fvtt-te-deum/releases/download/${{github.event.release.tag_name}}/fvtt-te-deum.zip
|
||||
|
||||
# Create a zip file with all files required by the module to add to the release
|
||||
- run: |
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
|
||||
- run: zip -r ./fvtt-te-deum-${{github.event.release.tag_name}}.zip system.json template.json README.md LICENSE.txt assets/ fonts/ images/ lang/ modules/ styles/ packs/ templates/ te-deum.mjs
|
||||
- run: zip -r ./fvtt-te-deum.zip system.json README.md LICENSE.txt assets/ fonts/ images/ lang/ modules/ styles/ packs/ templates/
|
||||
|
||||
- name: setup go
|
||||
uses: https://github.com/actions/setup-go@v4
|
||||
with:
|
||||
go-version: '>=1.20.1'
|
||||
go-version: ">=1.20.1"
|
||||
|
||||
- name: Use Go Action
|
||||
id: use-go-action
|
||||
uses: https://gitea.com/actions/release-action@main
|
||||
with:
|
||||
files: |-
|
||||
./fvtt-te-deum-${{github.event.release.tag_name}}.zip
|
||||
./fvtt-te-deum.zip
|
||||
system.json
|
||||
api_key: '${{secrets.ALLOW_PUSH_RELEASE}}'
|
||||
api_key: "${{secrets.ALLOW_PUSH_RELEASE}}"
|
||||
|
||||
- name: Publish to Foundry server
|
||||
uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
|
||||
with:
|
||||
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
|
||||
id: 'fvtt-te-deum'
|
||||
version: ${{github.event.release.tag_name}}
|
||||
manifest: 'https://www.uberwald.me/gitea/public/fvtt-te-deum/releases/download/latest/system.json'
|
||||
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-te-deum.zip'
|
||||
compatibility-minimum: '13'
|
||||
compatibility-verified: '13'
|
||||
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
package-lock.json
|
||||
|
||||
# Build outputs
|
||||
styles/tedeum.css
|
||||
styles/*.css.map
|
||||
|
||||
# IDE & Editor files
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.DS_Store
|
||||
|
||||
# System files
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
|
||||
# Logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
*.log
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.temp
|
||||
.cache/
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
|
||||
# Optional: Uncomment if you want to ignore pack database files
|
||||
# These are usually committed for systems, but can be regenerated
|
||||
# packs/**/*.ldb
|
||||
# packs/**/LOG
|
||||
# packs/**/LOG.old
|
||||
# packs/**/MANIFEST-*
|
||||
# packs/**/CURRENT
|
||||
|
||||
# Compiled source
|
||||
dist/
|
||||
build/
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
@@ -1,3 +1,7 @@
|
||||
# 13.0.0
|
||||
|
||||
- Support de Foundry v13
|
||||
|
||||
# 12.0.23
|
||||
|
||||
- Correction sur les jets réussie en tir
|
||||
|
||||
+8
-16
@@ -1,25 +1,17 @@
|
||||
var gulp = require('gulp');
|
||||
|
||||
var less = require('gulp-less');
|
||||
var postcss = require('gulp-postcss');
|
||||
|
||||
var autoprefixer = require('autoprefixer');
|
||||
var cssnext = require('postcss-preset-env');
|
||||
var precss = require('precss');
|
||||
|
||||
gulp.task('css', function () {
|
||||
|
||||
var processors = [
|
||||
autoprefixer,
|
||||
cssnext,
|
||||
precss
|
||||
];
|
||||
|
||||
return gulp.src('./postcss/*.css')
|
||||
.pipe(postcss(processors))
|
||||
return gulp.src('./less/*.less')
|
||||
.pipe(less())
|
||||
.pipe(postcss([autoprefixer]))
|
||||
.pipe(gulp.dest('./styles'));
|
||||
});
|
||||
|
||||
gulp.task('watch', function () {
|
||||
gulp.watch('./less/*.less', gulp.series('css'));
|
||||
});
|
||||
|
||||
function watchUpdates() {
|
||||
gulp.watch('./postcss/*.css', css);
|
||||
}
|
||||
gulp.task('default', gulp.series('css'));
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
@@ -0,0 +1,469 @@
|
||||
.editor {
|
||||
border: 2;
|
||||
height: 100%;
|
||||
padding: 0 3px;
|
||||
}
|
||||
|
||||
.medium-editor {
|
||||
border: 2;
|
||||
height: 240px;
|
||||
max-height: 240px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding: 0 3px;
|
||||
|
||||
prose-mirror, .editor, .editor-content, .ProseMirror {
|
||||
overflow: hidden;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.small-editor {
|
||||
border: 2;
|
||||
height: 120px;
|
||||
max-height: 120px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding: 0 3px;
|
||||
|
||||
prose-mirror, .editor, .editor-content, .ProseMirror {
|
||||
overflow: hidden;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.questionnaire-reponse {
|
||||
max-width: 42rem;
|
||||
margin-left: 1rem;
|
||||
}
|
||||
|
||||
.questionnaire-element {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
// Style unifié pour tous les inputs et selects (fiches acteur, item, roll dialogs)
|
||||
.fvtt-te-deum {
|
||||
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="submit"]):not([type="image"]):not([type="file"]),
|
||||
select {
|
||||
background: rgba(248, 245, 238, 0.95);
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
border: 1px solid rgba(139, 115, 85, 0.35);
|
||||
border-radius: 3px;
|
||||
padding: 0.15rem 0.3rem;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
border-color: rgba(139, 115, 85, 0.65);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
outline: none;
|
||||
border-color: rgba(139, 115, 85, 0.85);
|
||||
box-shadow: 0 0 0 2px rgba(139, 115, 85, 0.2);
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
color: rgba(19, 18, 18, 0.4);
|
||||
background: rgba(220, 216, 205, 0.6);
|
||||
border-color: rgba(139, 115, 85, 0.15);
|
||||
}
|
||||
}
|
||||
|
||||
textarea {
|
||||
background: rgba(248, 245, 238, 0.95);
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
border: 1px solid rgba(139, 115, 85, 0.35);
|
||||
border-radius: 3px;
|
||||
padding: 0.2rem 0.4rem;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
border-color: rgba(139, 115, 85, 0.65);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
outline: none;
|
||||
border-color: rgba(139, 115, 85, 0.85);
|
||||
box-shadow: 0 0 0 2px rgba(139, 115, 85, 0.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.fvtt-te-deum.window-app .window-content,
|
||||
.fvtt-te-deum.application .window-content,
|
||||
.fvtt-te-deum.window-app.sheet .window-content .sheet-body,
|
||||
.fvtt-te-deum.application.sheet .window-content .sheet-body {
|
||||
font-size: 0.8rem;
|
||||
background: rgba(226, 226, 222, 0.95);
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
}
|
||||
|
||||
// Améliorations pour les fiches d'items
|
||||
.item-form {
|
||||
.sheet-header {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(226, 226, 222, 0.95) 0%,
|
||||
rgba(240, 235, 225, 0.9) 100%
|
||||
);
|
||||
padding: 0.8rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
|
||||
border: 1px solid rgba(139, 115, 85, 0.3);
|
||||
margin-bottom: 0.5rem;
|
||||
|
||||
h1.charname input {
|
||||
// Voir règles haute-spécificité charname ci-dessous
|
||||
}
|
||||
}
|
||||
|
||||
.sheet-body {
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
li.flexrow {
|
||||
background: rgba(255, 255, 255, 0.3);
|
||||
padding: 0.4rem 0.6rem;
|
||||
margin: 0.3rem 0;
|
||||
border-radius: 4px;
|
||||
border-left: 3px solid rgba(139, 115, 85, 0.3);
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
background: rgba(255, 255, 255, 0.5);
|
||||
border-left-color: rgba(139, 115, 85, 0.6);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(196, 186, 166, 0.6) 0%,
|
||||
rgba(226, 226, 222, 0.5) 100%
|
||||
);
|
||||
padding: 0.4rem 0.6rem;
|
||||
margin: 0.8rem 0 0.4rem 0;
|
||||
border-radius: 4px;
|
||||
border-left: 4px solid rgba(139, 115, 85, 0.6);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
font-family: MailartRubberstamp;
|
||||
font-size: 1.1rem;
|
||||
color: #3d3a2e;
|
||||
}
|
||||
|
||||
input[type="checkbox"] {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Champ "name" — règles haute-spécificité (spec 0,6,2 / 0,7,2) pour surcharger les règles génériques d'input
|
||||
// Fiche acteur : font-size 3rem
|
||||
.fvtt-te-deum.application .window-content .sheet-header h1.charname input[name="name"],
|
||||
.fvtt-te-deum.window-app .window-content .sheet-header h1.charname input[name="name"] {
|
||||
font-family: "GreatPrimer";
|
||||
font-size: 3rem;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-bottom: 2px solid rgba(139, 115, 85, 0.4);
|
||||
color: rgba(50, 35, 15, 0.95);
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
letter-spacing: 0.05em;
|
||||
transition: border-color 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
border-width: 2px;
|
||||
border-color: rgba(139, 115, 85, 0.7);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
border-bottom-color: rgba(139, 115, 85, 0.9);
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
// Fiche item : même style mais font-size plus petit
|
||||
.fvtt-te-deum.application .window-content .item-form .sheet-header h1.charname input[name="name"],
|
||||
.fvtt-te-deum.window-app .window-content .item-form .sheet-header h1.charname input[name="name"] {
|
||||
font-size: 1.6rem;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.fvtt-te-deum .sheet-body {
|
||||
padding: 0.25rem 0.5rem;
|
||||
|
||||
&:after {
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
}
|
||||
|
||||
.fvtt-te-deum nav {
|
||||
&.tabs {
|
||||
.item {
|
||||
z-index: 2;
|
||||
position: relative;
|
||||
opacity: 1;
|
||||
color: rgba(29, 28, 31);
|
||||
padding: 0 0.25rem;
|
||||
|
||||
&:after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
height: 2rem;
|
||||
width: 1px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.select-diff {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.fvtt-te-deum.window-app.sheet .window-content .carac-value,
|
||||
.fvtt-te-deum.application.sheet .window-content .carac-value,
|
||||
.fvtt-te-deum.window-app.sheet .window-content .competence-xp,
|
||||
.fvtt-te-deum.application.sheet .window-content .competence-xp {
|
||||
margin: 0.05rem;
|
||||
flex-basis: 3rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.fvtt-te-deum h1,
|
||||
.fvtt-te-deum h2,
|
||||
.fvtt-te-deum h3,
|
||||
.fvtt-te-deum h4 {
|
||||
font-weight: bold;
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
}
|
||||
|
||||
.fvtt-te-deum .malus-sante {
|
||||
font-size: 0.88rem;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.fvtt-te-deum .malus-sante-active {
|
||||
color: rgba(200, 80, 10, 0.95);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.fvtt-te-deum ul,
|
||||
.fvtt-te-deum ol {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.fvtt-te-deum ul,
|
||||
.fvtt-te-deum li {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.header-fields {
|
||||
li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.alterne-list {
|
||||
& > .list-item {
|
||||
&:hover {
|
||||
background: rgba(226, 226, 222, 0.4);
|
||||
transform: translateX(2px);
|
||||
}
|
||||
|
||||
&:nth-child(even) {
|
||||
background: rgba(240, 235, 225, 0.3);
|
||||
}
|
||||
|
||||
&:nth-child(odd) {
|
||||
background: rgba(250, 245, 235, 0.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.specialisation-label {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.carac-label,
|
||||
.attr-label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.list-item {
|
||||
margin: 0.125rem;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 0.3rem;
|
||||
padding: 0.3rem 0.4rem;
|
||||
flex: 1 1 5rem;
|
||||
border: 1px solid rgba(139, 115, 85, 0.15);
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
|
||||
border-color: rgba(139, 115, 85, 0.3);
|
||||
background: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
.list-item-shadow {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(170, 168, 167, 0.25) 0%,
|
||||
rgba(200, 195, 185, 0.2) 100%
|
||||
);
|
||||
flex-grow: 0;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: flex-start;
|
||||
border-left: 3px solid rgba(139, 115, 85, 0.3);
|
||||
}
|
||||
|
||||
.list-item-shadow2 {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(87, 60, 32, 0.2) 0%,
|
||||
rgba(120, 90, 60, 0.15) 100%
|
||||
);
|
||||
flex-grow: 0;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: flex-start;
|
||||
border-left: 3px solid rgba(87, 60, 32, 0.4);
|
||||
}
|
||||
|
||||
.item-display-show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.item-display-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.item-quantite {
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
|
||||
.list-item-margin1 {
|
||||
margin-left: 1rem;
|
||||
}
|
||||
|
||||
.list-item-margin2 {
|
||||
margin-left: 2rem;
|
||||
}
|
||||
|
||||
.list-item-margin3 {
|
||||
margin-left: 3rem;
|
||||
}
|
||||
|
||||
.list-item-margin4 {
|
||||
margin-left: 4rem;
|
||||
}
|
||||
|
||||
.sheet-competence-img {
|
||||
width: 24px;
|
||||
max-width: 24px;
|
||||
height: 24px;
|
||||
max-height: 24px;
|
||||
flex-grow: 0;
|
||||
margin-right: 0.25rem;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
|
||||
border: 1px solid rgba(139, 115, 85, 0.3);
|
||||
}
|
||||
|
||||
.competence-column {
|
||||
flex-direction: column;
|
||||
align-content: flex-start;
|
||||
justify-content: flex-start;
|
||||
flex-grow: 0;
|
||||
flex-basis: 1;
|
||||
}
|
||||
|
||||
.competence-header {
|
||||
align-content: flex-start;
|
||||
justify-content: flex-start;
|
||||
font-weight: bold;
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
.comp-li {
|
||||
max-width: 8rem;
|
||||
width: 8rem;
|
||||
}
|
||||
|
||||
.description-label {
|
||||
flex-grow: 2;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.status-header-label {
|
||||
margin-left: 2px;
|
||||
}
|
||||
|
||||
.roll-dialog-label {
|
||||
margin: 4px 0;
|
||||
min-width: 96px;
|
||||
}
|
||||
|
||||
.short-label {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.keyword-label {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.item-sheet-label {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.item-text-long-line {
|
||||
flex-grow: 3;
|
||||
}
|
||||
|
||||
.score-label {
|
||||
flex-grow: 2;
|
||||
align-content: center;
|
||||
}
|
||||
|
||||
.attribut-value,
|
||||
.carac-value {
|
||||
flex-grow: 0;
|
||||
flex-basis: 64px;
|
||||
margin-right: 4px;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.sante-value,
|
||||
.competence-value {
|
||||
flex-grow: 0;
|
||||
flex-basis: 2rem;
|
||||
margin-right: 0.25rem;
|
||||
margin-left: 0.25rem;
|
||||
}
|
||||
|
||||
.description-value {
|
||||
flex-grow: 0;
|
||||
flex-basis: 4rem;
|
||||
margin-right: 0.25rem;
|
||||
margin-left: 0.25rem;
|
||||
}
|
||||
|
||||
.small-label {
|
||||
margin-top: 5px;
|
||||
}
|
||||
+235
@@ -0,0 +1,235 @@
|
||||
.fvtt-te-deum.window-app,
|
||||
.fvtt-te-deum.application {
|
||||
text-align: justify;
|
||||
font-size: 16px;
|
||||
letter-spacing: 1px;
|
||||
|
||||
&.sheet {
|
||||
.window-content {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: "GreatPrimer";
|
||||
|
||||
.sheet-header {
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
background: rgba(226, 226, 222, 0.95);
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
&:hover {
|
||||
.tooltiptext {
|
||||
top: 2rem;
|
||||
left: 2rem;
|
||||
margin: 0;
|
||||
padding: 0.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.fvtt-te-deum.sheet header.sheet-header h1 input,
|
||||
.window-app .window-header,
|
||||
.application .window-header,
|
||||
#actors .directory-list,
|
||||
#navigation #scene-list .scene.nav-item {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.fvtt-te-deum.sheet {
|
||||
nav {
|
||||
&.sheet-tabs,
|
||||
&.tabs {
|
||||
font-size: 0.8rem;
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
height: 3rem;
|
||||
flex: 0 0 3rem;
|
||||
margin: 0;
|
||||
padding: 0 0 0 0.25rem;
|
||||
text-align: center;
|
||||
line-height: 1.5rem;
|
||||
border-top: 0 none;
|
||||
border-bottom: 0 none;
|
||||
background:
|
||||
linear-gradient(rgba(226, 226, 222, 0.5), rgba(226, 226, 222, 0.5)),
|
||||
url("../images/ui/frise_bottom_01.webp");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
header {
|
||||
&.sheet-header {
|
||||
.profile-img {
|
||||
-o-object-fit: cover;
|
||||
object-fit: cover;
|
||||
-o-object-position: 50% 0;
|
||||
object-position: 50% 0;
|
||||
margin: 0.5rem 0 0.5rem 0.5rem;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.flex-compteurs {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.resource-content {
|
||||
width: 2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tab[data-tab] {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin: 0.2rem;
|
||||
padding: 0.15rem;
|
||||
}
|
||||
}
|
||||
|
||||
.fvtt-te-deum.window-app input,
|
||||
.fvtt-te-deum.application input,
|
||||
.fvtt-te-deum .item-form,
|
||||
.fvtt-te-deum.sheet header.sheet-header .flex-group-center.flex-compteurs,
|
||||
.fvtt-te-deum.sheet header.sheet-header .flex-group-center.flex-fatigue,
|
||||
.fvtt-te-deum select,
|
||||
.fvtt-te-deum button,
|
||||
.item-checkbox,
|
||||
#sidebar,
|
||||
#players,
|
||||
#navigation #nav-toggle {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.window-header {
|
||||
background: rgba(0, 0, 0, 0.75);
|
||||
}
|
||||
|
||||
.strong-text {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.fvtt-te-deum .tabs .item.active,
|
||||
.fvtt-te-deum .blessures-list li ul li:first-child:hover,
|
||||
.fvtt-te-deum a:hover {
|
||||
text-shadow: 1px 0px 0px #ff6600;
|
||||
}
|
||||
|
||||
.rollable:hover,
|
||||
.rollable:focus {
|
||||
color: #000;
|
||||
text-shadow: 0 0 10px red;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li.folder > .folder-header h3 {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.fvtt-te-deum table {
|
||||
border: 1px solid #7a7971;
|
||||
}
|
||||
|
||||
.grid,
|
||||
.grid-2col {
|
||||
display: grid;
|
||||
grid-column: span 2 / span 2;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
grid-gap: 10px;
|
||||
grid-gap: 10px;
|
||||
gap: 10px;
|
||||
margin: 10px 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.grid-3col {
|
||||
grid-column: span 3 / span 3;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-4col {
|
||||
grid-column: span 4 / span 4;
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-5col {
|
||||
grid-column: span 5 / span 5;
|
||||
grid-template-columns: repeat(5, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-6col {
|
||||
grid-column: span 5 / span 5;
|
||||
grid-template-columns: repeat(5, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-7col {
|
||||
grid-column: span 7 / span 7;
|
||||
grid-template-columns: repeat(7, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-8col {
|
||||
grid-column: span 8 / span 8;
|
||||
grid-template-columns: repeat(8, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-9col {
|
||||
grid-column: span 9 / span 9;
|
||||
grid-template-columns: repeat(9, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-10col {
|
||||
grid-column: span 10 / span 10;
|
||||
grid-template-columns: repeat(10, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-11col {
|
||||
grid-column: span 11 / span 11;
|
||||
grid-template-columns: repeat(11, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.grid-12col {
|
||||
grid-column: span 12 / span 12;
|
||||
grid-template-columns: repeat(12, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.flex-group-center,
|
||||
.flex-group-left,
|
||||
.flex-group-right {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.flex-group-left {
|
||||
justify-content: flex-start;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.flex-group-right {
|
||||
justify-content: flex-end;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.flex-center {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.table-create-actor {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.flex-between {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.flex-shrink {
|
||||
flex: "flex-shrink";
|
||||
}
|
||||
+581
@@ -0,0 +1,581 @@
|
||||
.chat-message-header {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(226, 226, 222, 0.95) 0%,
|
||||
rgba(196, 186, 166, 0.9) 100%
|
||||
);
|
||||
font-size: 0.9rem;
|
||||
min-height: 26px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-bottom: 2px solid rgba(139, 115, 85, 0.6);
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
|
||||
padding: 0.1rem 0.3rem;
|
||||
border-radius: 6px 6px 0 0;
|
||||
}
|
||||
|
||||
.chat-message .message-header .flavor-text,
|
||||
.chat-message .message-header .whisper-to {
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.chat-result-text {
|
||||
font-weight: bold;
|
||||
font-family: GreatPrimer;
|
||||
font-size: 1.1rem;
|
||||
color: rgba(80, 50, 15, 0.95);
|
||||
padding: 0 0 0.1rem 0;
|
||||
line-height: 1.3;
|
||||
border-bottom: 1px solid rgba(139, 115, 85, 0.4);
|
||||
display: block;
|
||||
margin-bottom: 0.2rem;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
.chat-actor-name {
|
||||
font-weight: bold;
|
||||
font-family: GreatPrimer;
|
||||
font-size: 1.1rem;
|
||||
color: rgba(80, 50, 15, 0.95);
|
||||
line-height: 1;
|
||||
letter-spacing: 0.03em;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.chat-actor-name-opposition {
|
||||
font-weight: bold;
|
||||
font-family: GreatPrimer;
|
||||
font-size: 1.1rem;
|
||||
color: rgba(80, 50, 15, 0.95);
|
||||
padding: 0.1rem 0.3rem;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
.chat-result-success {
|
||||
color: #2d5016;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(144, 238, 144, 0.3),
|
||||
rgba(107, 186, 107, 0.25)
|
||||
);
|
||||
padding: 0.25rem 0.6rem;
|
||||
border-radius: 4px;
|
||||
border-left: 3px solid #4a7c2c;
|
||||
display: inline-block;
|
||||
margin: 0.15rem 0;
|
||||
box-shadow: 0 1px 3px rgba(45, 80, 22, 0.2);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.chat-result-failure {
|
||||
color: #7a1a1a;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(255, 160, 160, 0.3),
|
||||
rgba(205, 120, 120, 0.25)
|
||||
);
|
||||
padding: 0.25rem 0.6rem;
|
||||
border-radius: 4px;
|
||||
border-left: 3px solid #a82020;
|
||||
display: inline-block;
|
||||
margin: 0.15rem 0;
|
||||
box-shadow: 0 1px 3px rgba(122, 26, 26, 0.2);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.chat-img {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.chat-command-img {
|
||||
border: 0px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
transition:
|
||||
transform 0.2s ease,
|
||||
box-shadow 0.2s ease;
|
||||
border-radius: 4px;
|
||||
|
||||
&:hover {
|
||||
transform: scale(1.1);
|
||||
box-shadow: 0 3px 8px rgba(255, 102, 0, 0.4);
|
||||
}
|
||||
}
|
||||
|
||||
.chat-result-column {
|
||||
min-width: 70%;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
.roll-dialog-header {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(226, 226, 222, 0.95) 0%,
|
||||
rgba(196, 186, 166, 0.9) 100%
|
||||
);
|
||||
min-height: 48px;
|
||||
padding: 0.4rem 0.6rem;
|
||||
border-radius: 6px 6px 0 0;
|
||||
border-bottom: 2px solid rgba(139, 115, 85, 0.6);
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 0.5rem;
|
||||
|
||||
.actor-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
border: 2px solid rgba(139, 115, 85, 0.5);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.dialog-roll-title {
|
||||
font-family: GreatPrimer;
|
||||
font-size: 1.1rem;
|
||||
margin: 0;
|
||||
color: #3d3a2e;
|
||||
text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
.actor-icon {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
padding: 1px;
|
||||
border-radius: 50%;
|
||||
border: 2px solid rgba(139, 115, 85, 0.5);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
||||
flex-shrink: 0;
|
||||
margin-right: 0.4rem;
|
||||
}
|
||||
|
||||
.padding-dice {
|
||||
padding-top: 0.2rem;
|
||||
padding-bottom: 0.2rem;
|
||||
}
|
||||
|
||||
.dice-image {
|
||||
box-sizing: border-box;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.dice-image-reroll {
|
||||
background-color: rgba(115, 224, 115, 0.25);
|
||||
border-color: #011d33;
|
||||
box-sizing: border-box;
|
||||
border: 1px;
|
||||
border-radius: 0%;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.chat-dice {
|
||||
width: 15%;
|
||||
height: 15%;
|
||||
font-size: 15px;
|
||||
padding: 10px;
|
||||
padding-bottom: 20px;
|
||||
padding-top: 0.2rem;
|
||||
padding-bottom: 0.2rem;
|
||||
}
|
||||
|
||||
.div-center {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.chat-message {
|
||||
background: rgba(240, 235, 225, 0.95);
|
||||
font-size: 0.9rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15);
|
||||
border: 1px solid rgba(139, 115, 85, 0.3);
|
||||
|
||||
&.whisper {
|
||||
background: rgba(220, 220, 210, 0.85);
|
||||
border: 2px solid #545469;
|
||||
box-shadow: 0 3px 10px rgba(84, 84, 105, 0.3);
|
||||
}
|
||||
|
||||
.chat-icon {
|
||||
border: 0;
|
||||
padding: 2px 6px 2px 2px;
|
||||
float: left;
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
}
|
||||
}
|
||||
|
||||
.ability-icon {
|
||||
border: 0;
|
||||
padding: 2px 2px 2px 2px;
|
||||
max-width: 32px;
|
||||
max-height: 32px;
|
||||
width: auto;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.small-ability-icon {
|
||||
border: 0;
|
||||
padding: 2px 2px 2px 2px;
|
||||
max-width: 16px;
|
||||
max-height: 16px;
|
||||
width: auto;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.combat-icon {
|
||||
border: 0;
|
||||
padding: 2px 2px 2px 2px;
|
||||
max-width: 24px;
|
||||
max-height: 24px;
|
||||
width: auto;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
#sidebar-tabs {
|
||||
flex: 0 0 32px;
|
||||
box-sizing: border-box;
|
||||
margin: 0 0 5px;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0);
|
||||
box-shadow: inset 0 0 2rem rgba(0, 0, 0, 0.5);
|
||||
|
||||
& > .item {
|
||||
&.active {
|
||||
border: 1px solid rgba(114, 98, 72, 1);
|
||||
background: rgba(30, 25, 20, 0.75);
|
||||
box-shadow: 0 0 6px inset rgba(114, 98, 72, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#controls .scene-control,
|
||||
#controls .control-tool {
|
||||
box-shadow: 0 0 3px #000;
|
||||
margin: 0 0 8px;
|
||||
border-radius: 0;
|
||||
background: rgba(30, 25, 20, 1);
|
||||
background-origin: padding-box;
|
||||
border-image-width: 4px;
|
||||
border-image-outset: 0px;
|
||||
}
|
||||
|
||||
#controls .scene-control.active,
|
||||
#controls .control-tool.active,
|
||||
#controls .scene-control:hover,
|
||||
#controls .control-tool:hover {
|
||||
background: rgba(72, 46, 28, 1);
|
||||
background-origin: padding-box;
|
||||
border-image-width: 4px;
|
||||
border-image-outset: 0px;
|
||||
box-shadow: 0 0 3px #ff6400;
|
||||
}
|
||||
|
||||
#hotbar {
|
||||
#action-bar {
|
||||
#macro-list {
|
||||
border: 1px solid rgba(72, 46, 28, 1);
|
||||
box-shadow: 2px 2px 5px #000000;
|
||||
}
|
||||
|
||||
.macro {
|
||||
border-image: url(img/ui/bg_control.jpg) 21 repeat;
|
||||
border-image-slice: 6 6 6 6 fill;
|
||||
border-image-width: 6px 6px 6px 6px;
|
||||
border-image-outset: 0px 0px 0px 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.bar-controls {
|
||||
background: rgba(30, 25, 20, 1);
|
||||
border: 1px solid rgba(72, 46, 28, 1);
|
||||
}
|
||||
}
|
||||
|
||||
#players {
|
||||
border-image-width: 4px;
|
||||
border-image-outset: 0px;
|
||||
background: rgba(30, 25, 20, 1);
|
||||
}
|
||||
|
||||
#navigation {
|
||||
#scene-list {
|
||||
.scene {
|
||||
&.nav-item {
|
||||
background: rgba(30, 25, 20, 1);
|
||||
background-origin: padding-box;
|
||||
border-image-width: 4px;
|
||||
border-image-outset: 0px;
|
||||
|
||||
&.active {
|
||||
background: rgba(72, 46, 28, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#nav-toggle {
|
||||
background: rgba(30, 25, 20, 1);
|
||||
background-origin: padding-box;
|
||||
border-image-width: 4px;
|
||||
border-image-outset: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
#navigation #scene-list .scene.view,
|
||||
#navigation #scene-list .scene.context {
|
||||
background: rgba(72, 46, 28, 1);
|
||||
background-origin: padding-box;
|
||||
border-image-width: 4px;
|
||||
border-image-outset: 0px;
|
||||
box-shadow: 0 0 3px #ff6400;
|
||||
}
|
||||
|
||||
.chat-card-button {
|
||||
box-shadow: inset 0px 1px 0px 0px #a6827e;
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
rgba(33, 55, 74, 0.98824) 5%,
|
||||
rgba(21, 40, 51, 0.67059) 100%
|
||||
);
|
||||
background-color: rgba(125, 93, 59, 0);
|
||||
border-radius: 3px;
|
||||
border: 2px ridge #846109;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
color: #ffffff;
|
||||
font-size: 0.8rem;
|
||||
padding: 4px 12px 0px 12px;
|
||||
text-decoration: none;
|
||||
text-shadow: 0px 1px 0px #4d3534;
|
||||
position: relative;
|
||||
margin: 2px;
|
||||
|
||||
&:hover {
|
||||
background: linear-gradient(to bottom, #800000 5%, #3e0101 100%);
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
&:active {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
.plus-minus-button {
|
||||
box-shadow: inset 0px 1px 0px 0px #a6827e;
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
rgba(33, 55, 74, 0.98824) 5%,
|
||||
rgba(21, 40, 51, 0.67059) 100%
|
||||
);
|
||||
background-color: rgba(125, 93, 59, 0);
|
||||
border-radius: 2px;
|
||||
border: 1px ridge #846109;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
color: #ffffff;
|
||||
margin: 2px 2px 2px 2px;
|
||||
padding: 2px 2px 2px 2px;
|
||||
text-decoration: none;
|
||||
text-shadow: 0px 1px 0px #4d3534;
|
||||
position: relative;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.plus-minus-button:hover,
|
||||
.chat-card-button:hover {
|
||||
background: linear-gradient(to bottom, #800000 5%, #3e0101 100%);
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.plus-minus-button:active,
|
||||
.chat-card-button:active {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
|
||||
.plus-minus {
|
||||
font-size: 0.9rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.ul-level1 {
|
||||
padding-left: 2rem;
|
||||
}
|
||||
|
||||
#pause {
|
||||
font-size: 2rem;
|
||||
|
||||
& > h3 {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
& > img {
|
||||
content: url(../images/ui/logo_tedeum_pause.webp);
|
||||
height: 200px;
|
||||
width: 200px;
|
||||
top: -200px;
|
||||
left: calc(50% - 132px);
|
||||
}
|
||||
}
|
||||
|
||||
#logo {
|
||||
content: url(../images/ui/logo_tedeum_pause.webp);
|
||||
width: 100px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
.dice-cell {
|
||||
padding-left: 12px;
|
||||
padding-right: 12px;
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.dice-formula,
|
||||
.dice-total {
|
||||
height: 54px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
// Améliorations esthétiques pour les messages de chat
|
||||
.chat-roll-details {
|
||||
background: rgba(255, 255, 255, 0.4);
|
||||
border-radius: 4px;
|
||||
padding: 0.4rem 0.5rem;
|
||||
margin: 0.25rem 0;
|
||||
border: 1px solid rgba(139, 115, 85, 0.25);
|
||||
|
||||
ul {
|
||||
margin: 0;
|
||||
padding-left: 0.8rem;
|
||||
|
||||
li {
|
||||
padding: 0.05rem 0;
|
||||
line-height: 1.25;
|
||||
|
||||
strong {
|
||||
color: rgba(70, 67, 49, 0.9);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.chat-roll-result-section {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(255, 250, 240, 0.6),
|
||||
rgba(245, 240, 230, 0.5)
|
||||
);
|
||||
border-radius: 4px;
|
||||
padding: 0.35rem;
|
||||
margin: 0.2rem 0;
|
||||
border: 2px solid rgba(139, 115, 85, 0.3);
|
||||
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
|
||||
.chat-total-result {
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
color: #3d3a2e;
|
||||
text-align: center;
|
||||
padding: 0.25rem;
|
||||
background: rgba(226, 226, 222, 0.5);
|
||||
border-radius: 4px;
|
||||
margin-bottom: 0.25rem;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
.chat-dice-formula {
|
||||
display: inline-block;
|
||||
background: rgba(139, 115, 85, 0.15);
|
||||
padding: 0.15rem 0.4rem;
|
||||
border-radius: 3px;
|
||||
font-family: monospace;
|
||||
font-size: 0.9em;
|
||||
border: 1px solid rgba(139, 115, 85, 0.3);
|
||||
color: #5a4a3a;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.chat-difficulty-badge {
|
||||
display: inline-block;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(180, 160, 130, 0.4),
|
||||
rgba(160, 140, 110, 0.35)
|
||||
);
|
||||
padding: 0.15rem 0.5rem;
|
||||
border-radius: 10px;
|
||||
font-weight: bold;
|
||||
border: 1px solid rgba(139, 115, 85, 0.4);
|
||||
color: #4a3a2a;
|
||||
font-size: 0.85em;
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.chat-info-badge {
|
||||
display: inline-block;
|
||||
background: rgba(100, 149, 237, 0.15);
|
||||
padding: 0.15rem 0.4rem;
|
||||
border-radius: 3px;
|
||||
border-left: 2px solid rgba(70, 130, 180, 0.6);
|
||||
margin: 0.08rem 0;
|
||||
font-size: 0.8em;
|
||||
color: #2c4a6a;
|
||||
}
|
||||
|
||||
.chat-warning-badge {
|
||||
display: inline-block;
|
||||
background: rgba(255, 200, 100, 0.2);
|
||||
padding: 0.15rem 0.4rem;
|
||||
border-radius: 3px;
|
||||
border-left: 2px solid rgba(218, 165, 32, 0.7);
|
||||
margin: 0.08rem 0;
|
||||
font-size: 0.8em;
|
||||
color: #7a5a1a;
|
||||
}
|
||||
|
||||
.chat-actions-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 0.3rem;
|
||||
padding: 0.4rem;
|
||||
background: rgba(226, 226, 222, 0.4);
|
||||
border-top: 1px solid rgba(139, 115, 85, 0.25);
|
||||
border-radius: 0 0 6px 6px;
|
||||
margin-top: 0.25rem;
|
||||
|
||||
a {
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.chat-negative-dice {
|
||||
display: inline-block;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(255, 100, 100, 0.2),
|
||||
rgba(220, 80, 80, 0.15)
|
||||
);
|
||||
padding: 0.2rem 0.5rem;
|
||||
border-radius: 4px;
|
||||
border: 2px solid rgba(178, 34, 34, 0.4);
|
||||
font-weight: bold;
|
||||
color: #8b0000;
|
||||
margin: 0.15rem 0;
|
||||
box-shadow: 0 1px 3px rgba(178, 34, 34, 0.2);
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
.te-deum-roll-dialog {
|
||||
.window-header {
|
||||
border-radius: 10px 10px 0% 0%;
|
||||
}
|
||||
|
||||
.window-content {
|
||||
border-radius: 0% 0% 10px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.skill-roll-dialog {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(240, 235, 225, 0.98) 0%,
|
||||
rgba(250, 245, 235, 0.95) 100%
|
||||
);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(139, 115, 85, 0.3);
|
||||
overflow: hidden;
|
||||
|
||||
.flexcol {
|
||||
padding: 0.6rem 0.8rem;
|
||||
gap: 0.4rem;
|
||||
}
|
||||
|
||||
.flexrow {
|
||||
margin: 0.3rem 0;
|
||||
padding: 0.4rem 0.5rem;
|
||||
background: rgba(255, 255, 255, 0.4);
|
||||
border-radius: 4px;
|
||||
border-left: 3px solid rgba(139, 115, 85, 0.3);
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
background: rgba(255, 255, 255, 0.6);
|
||||
border-left-color: rgba(139, 115, 85, 0.6);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
.roll-dialog-label {
|
||||
font-family: GreatPrimer;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
color: #3d3a2e;
|
||||
min-width: 140px;
|
||||
|
||||
&:first-child {
|
||||
color: rgba(70, 67, 49, 0.9);
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
|
||||
input[type="checkbox"] {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
div {
|
||||
margin-top: 4px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.sheet-footer {
|
||||
padding: 0.5rem 0.8rem;
|
||||
gap: 0.5rem;
|
||||
border-top: 1px solid rgba(139, 115, 85, 0.3);
|
||||
margin-top: 0.5rem;
|
||||
|
||||
button {
|
||||
flex: 1;
|
||||
padding: 0.4rem 0.8rem;
|
||||
border-radius: 4px;
|
||||
font-family: "GreatPrimer";
|
||||
font-size: 0.9rem;
|
||||
cursor: pointer;
|
||||
border: 1px solid rgba(139, 115, 85, 0.5);
|
||||
background: linear-gradient(135deg, rgba(196, 186, 166, 0.8) 0%, rgba(226, 226, 222, 0.9) 100%);
|
||||
color: rgba(50, 35, 15, 0.95);
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
background: linear-gradient(135deg, rgba(196, 186, 166, 1) 0%, rgba(210, 205, 195, 1) 100%);
|
||||
border-color: rgba(139, 115, 85, 0.8);
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.confront-dice {
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.bonus-spec {
|
||||
max-width: 48px;
|
||||
}
|
||||
|
||||
.confront-bonus-container {
|
||||
position: relative;
|
||||
flex-grow: 1;
|
||||
text-align: center;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.pool-list {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.corps-combat-block {
|
||||
position: relative;
|
||||
width: 600px;
|
||||
height: 600px;
|
||||
}
|
||||
|
||||
.silhouette-combat-picture {
|
||||
width: 250px;
|
||||
max-width: 250px;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.silhouette-combat-block {
|
||||
position: absolute;
|
||||
background: white;
|
||||
border-color: darkgray;
|
||||
border-style: ridge;
|
||||
border: 1;
|
||||
width: 180px;
|
||||
min-height: 84px;
|
||||
height: auto;
|
||||
margin: 0 auto;
|
||||
font-size: 0.8rem;
|
||||
align-self: center;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.silhouette-combat-space {
|
||||
width: 60px;
|
||||
min-width: 60px;
|
||||
}
|
||||
|
||||
.center-content {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.chat-message .message {
|
||||
font-family: "GreatPrimer";
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.fvtt-te-deum-character-creator {
|
||||
/*background: rgba(226, 226, 222, 0.95);*/
|
||||
font-family: "GreatPrimer";
|
||||
font-size: 0.9rem;
|
||||
|
||||
.field-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
color: rgba(30, 25, 15, 0.9);
|
||||
}
|
||||
|
||||
.status-section {
|
||||
display: block;
|
||||
max-width: 34rem;
|
||||
}
|
||||
|
||||
.creator-finished-section {
|
||||
display: block;
|
||||
max-width: 34rem;
|
||||
text-align: center;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.stage-main-details {
|
||||
text-align: center;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
.grace-texte {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.chat-welcome {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.item-name-label {
|
||||
min-width: 12rem;
|
||||
}
|
||||
|
||||
.compendium-sidebar .directory-item.compendium.locked .compendium-name {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.compendium-sidebar .directory-item.compendium .compendium-name {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.compendium-sidebar .directory-item.compendium:hover .compendium-name {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
background: rgba(0, 0, 0, 0.9);
|
||||
}
|
||||
|
||||
.compendium-sidebar .directory-item.compendium .compendium-footer .source {
|
||||
display: inline-block;
|
||||
font-size: var(--font-size-12);
|
||||
padding: 1px 0.5rem 0 0.25rem;
|
||||
border-radius: 0 3px 0 0;
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.tedeum-create-character {
|
||||
align-self: anchor-center;
|
||||
}
|
||||
|
||||
.message-chat-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.welcome-message-h3 {
|
||||
font-size: 1.2rem;
|
||||
text-align: center;
|
||||
margin-bottom: 0.5rem;
|
||||
color: darkred;
|
||||
}
|
||||
+414
@@ -0,0 +1,414 @@
|
||||
.padd-right {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.padd-left {
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.fortune-row {
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
gap: 0.4rem;
|
||||
padding: 0.3rem 0.5rem;
|
||||
margin-bottom: 0.5rem;
|
||||
|
||||
label {
|
||||
flex: 0 0 auto;
|
||||
min-width: unset;
|
||||
font-weight: 600;
|
||||
color: rgba(70, 67, 49, 0.9);
|
||||
}
|
||||
|
||||
input {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
}
|
||||
|
||||
.stack-left {
|
||||
align-items: center;
|
||||
flex-shrink: 1;
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
.packed-left {
|
||||
white-space: nowrap;
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
.input-numeric-short {
|
||||
width: 52px;
|
||||
max-width: 52px;
|
||||
flex-grow: 0;
|
||||
flex-shrink: 0;
|
||||
flex-basis: 52px;
|
||||
margin-right: 0.15rem;
|
||||
margin-left: 0.15rem;
|
||||
}
|
||||
|
||||
.abilities-table {
|
||||
align-content: flex-start;
|
||||
}
|
||||
|
||||
.tokenhudext {
|
||||
display: flex;
|
||||
flex: 0 !important;
|
||||
font-weight: 600;
|
||||
|
||||
&.left {
|
||||
justify-content: flex-start;
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
top: 2.75rem;
|
||||
right: 4rem;
|
||||
}
|
||||
|
||||
&.right {
|
||||
justify-content: flex-start;
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
top: 2.75rem;
|
||||
left: 4rem;
|
||||
}
|
||||
}
|
||||
|
||||
.control-icon {
|
||||
&.tokenhudicon {
|
||||
width: -moz-fit-content;
|
||||
width: fit-content;
|
||||
height: -moz-fit-content;
|
||||
height: fit-content;
|
||||
min-width: 6rem;
|
||||
flex-basis: auto;
|
||||
padding: 0;
|
||||
line-height: 1rem;
|
||||
margin: 0.25rem;
|
||||
|
||||
&.right {
|
||||
margin-left: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#token-hud {
|
||||
.status-effects {
|
||||
&.active {
|
||||
z-index: 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.token-sheet {
|
||||
.window-content {
|
||||
.flexcol {
|
||||
.sheet-tabs {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.item-checkbox {
|
||||
height: 25px;
|
||||
border: 1px solid rgba(115, 105, 83, 0.65098);
|
||||
border-left: none;
|
||||
font-weight: 500;
|
||||
font-size: 1rem;
|
||||
color: black;
|
||||
padding-top: 5px;
|
||||
margin-right: 0px;
|
||||
width: 45px;
|
||||
position: relative;
|
||||
left: 0px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.skill-label {
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
.skill-good-checkbox {
|
||||
max-height: 10px;
|
||||
max-width: 10px;
|
||||
}
|
||||
|
||||
.flex-actions-bar {
|
||||
flex-grow: 2;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
font-size: 1rem;
|
||||
background-color: #f5f5f5;
|
||||
background-position: 0px 35px;
|
||||
background-repeat: no-repeat;
|
||||
background: rgba(226, 226, 222, 0.95);
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
|
||||
&.collapsed {
|
||||
height: 470px !important;
|
||||
}
|
||||
|
||||
#sidebar-tabs {
|
||||
i {
|
||||
display: inline-block;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#sidebar-tabs > .collapsed,
|
||||
#chat-controls .chat-control-icon {
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75);
|
||||
}
|
||||
|
||||
.sidebar-tab {
|
||||
.directory-list {
|
||||
.entity {
|
||||
border-top: 1px rgba(0, 0, 0, 0.25);
|
||||
border-bottom: 0 none;
|
||||
padding: 0.25rem 0;
|
||||
|
||||
&:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status-small-label {
|
||||
font-size: 0.65rem;
|
||||
}
|
||||
|
||||
.no-grow {
|
||||
flex-grow: 1;
|
||||
max-width: 32px;
|
||||
}
|
||||
|
||||
.status-col-name {
|
||||
max-width: 72px;
|
||||
}
|
||||
|
||||
.img-no-border {
|
||||
max-width: 48px;
|
||||
max-height: 48px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
.items-title-bg {
|
||||
margin-top: 6px;
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(196, 186, 166, 0.6) 0%,
|
||||
rgba(226, 226, 222, 0.5) 100%
|
||||
);
|
||||
border-radius: 4px;
|
||||
padding: 0.3rem 0.5rem;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
border-left: 4px solid rgba(139, 115, 85, 0.6);
|
||||
|
||||
h3 {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 1.15rem;
|
||||
font-weight: 600;
|
||||
color: rgba(19, 18, 18, 0.95);
|
||||
}
|
||||
}
|
||||
|
||||
.item-name-label-header-long2 {
|
||||
flex-grow: 1;
|
||||
max-width: 14rem;
|
||||
min-width: 14rem;
|
||||
}
|
||||
|
||||
.impact-box {
|
||||
border-width: 2px;
|
||||
border-color: #000000;
|
||||
border-radius: 6px;
|
||||
border: 2px ridge #443307;
|
||||
margin: 4px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.impact-title {
|
||||
font-size: bold;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.items-title-text {
|
||||
text-align: center;
|
||||
font-family: MailartRubberstamp;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.lock-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.item-sheet-img {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border: 2px solid rgba(139, 115, 85, 0.4);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.item-name-img {
|
||||
flex-grow: 1;
|
||||
max-width: 2rem;
|
||||
min-width: 2rem;
|
||||
}
|
||||
|
||||
.item-field {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.item-field-xp {
|
||||
margin-top: 4px;
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
}
|
||||
|
||||
.item-field-label-short {
|
||||
flex-grow: 1;
|
||||
max-width: 4rem;
|
||||
min-width: 4rem;
|
||||
}
|
||||
|
||||
.item-field-label-medium {
|
||||
flex-grow: 1;
|
||||
max-width: 6rem;
|
||||
min-width: 6rem;
|
||||
}
|
||||
|
||||
.item-field-label-long,
|
||||
.item-name-label-long {
|
||||
font-weight: 600;
|
||||
color: rgba(70, 67, 49, 0.9);
|
||||
min-width: 160px;
|
||||
}
|
||||
|
||||
.item-field-skill {
|
||||
flex-grow: 1;
|
||||
max-width: 6.8rem;
|
||||
min-width: 6.8rem;
|
||||
}
|
||||
|
||||
.item-field-label-long {
|
||||
flex-grow: 1;
|
||||
max-width: 10rem;
|
||||
min-width: 10rem;
|
||||
}
|
||||
|
||||
.item-field-title-long {
|
||||
flex-grow: 1;
|
||||
max-width: 12rem;
|
||||
min-width: 12rem;
|
||||
}
|
||||
|
||||
.item-field-label-long14 {
|
||||
flex-grow: 1;
|
||||
max-width: 14rem;
|
||||
min-width: 14rem;
|
||||
color: rgba(70, 67, 49, 0.9);
|
||||
font-size: 1.0rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.carac-box {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(226, 226, 222, 0.4) 0%,
|
||||
rgba(240, 235, 225, 0.3) 100%
|
||||
);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 0.45rem;
|
||||
padding: 0.3rem 0.5rem;
|
||||
border: 1px solid rgba(139, 115, 85, 0.2);
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
border-color: rgba(139, 115, 85, 0.4);
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
}
|
||||
|
||||
.comp-box {
|
||||
max-width: 16rem;
|
||||
min-width: 16rem;
|
||||
width: 16rem;
|
||||
min-height: 1.6rem;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(250, 245, 235, 0.5) 0%,
|
||||
rgba(255, 255, 255, 0.3) 100%
|
||||
);
|
||||
padding: 0.25rem 0.4rem;
|
||||
margin: 0.15rem;
|
||||
border-radius: 3px;
|
||||
border-left: 2px solid rgba(139, 115, 85, 0.3);
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
background: rgba(226, 226, 222, 0.4);
|
||||
border-left-color: rgba(139, 115, 85, 0.6);
|
||||
transform: translateX(2px);
|
||||
}
|
||||
}
|
||||
|
||||
.item-control-end {
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
.alternate-list {
|
||||
margin-top: 4px;
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.item-filler {
|
||||
flex-grow: 6;
|
||||
flex-shrink: 7;
|
||||
}
|
||||
|
||||
.item-controls-fixed {
|
||||
min-width: 2rem;
|
||||
max-width: 2rem;
|
||||
}
|
||||
|
||||
.item-controls-fixed-full {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
|
||||
.item-left-pad {
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.attribute-label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.flexrow-no-expand {
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
.item-input-small {
|
||||
max-width: 16px;
|
||||
max-height: 12px;
|
||||
}
|
||||
|
||||
.character-summary-rollable {
|
||||
text-decoration: underline;
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
.fvtt-te-deum.window-app.sheet .window-content,
|
||||
.fvtt-te-deum.application.sheet .window-content {
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
// AppV2: le part wrapper et la section root du template doivent propager la hauteur
|
||||
// Uniquement pour les fiches (.sheet) — les autres fenêtres (dialogs) gardent un layout block normal
|
||||
.application.fvtt-te-deum.sheet .window-content > [data-application-part],
|
||||
.application.fvtt-te-deum.sheet .window-content > [data-application-part] > section {
|
||||
flex: 1 1 0;
|
||||
min-height: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.fvtt-te-deum {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
|
||||
.sheet-header {
|
||||
flex: 0 0 auto;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start;
|
||||
margin-bottom: 10px;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(226, 226, 222, 0.95) 0%,
|
||||
rgba(240, 235, 225, 0.9) 100%
|
||||
);
|
||||
padding: 0.3rem 0.8rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
|
||||
border: 1px solid rgba(139, 115, 85, 0.3);
|
||||
|
||||
.profile-img {
|
||||
flex: 0 0 128px;
|
||||
width: 128px;
|
||||
height: auto;
|
||||
max-height: 128px;
|
||||
margin-top: 0px;
|
||||
margin-right: 10px;
|
||||
-o-object-fit: cover;
|
||||
object-fit: cover;
|
||||
-o-object-position: 50% 0;
|
||||
object-position: 50% 0;
|
||||
border-width: 0px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
||||
border: 2px solid rgba(139, 115, 85, 0.4);
|
||||
}
|
||||
|
||||
.header-fields {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
h1 {
|
||||
&.charname {
|
||||
height: 50px;
|
||||
padding: 0px;
|
||||
margin: 5px 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.header-identity-fields {
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
gap: 0.3rem;
|
||||
margin-top: 0.2rem;
|
||||
|
||||
input, select {
|
||||
flex: 1 1 auto;
|
||||
font-size: 0.75rem;
|
||||
height: 1.6rem;
|
||||
}
|
||||
}
|
||||
|
||||
.header-identity-label {
|
||||
flex: 0 0 auto;
|
||||
font-size: 0.7rem;
|
||||
font-weight: 600;
|
||||
color: rgba(70, 67, 49, 0.9);
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.sheet-tabs {
|
||||
flex: 0;
|
||||
font-family: "MailartRubberstamp";
|
||||
font-size: 2.2rem;
|
||||
}
|
||||
|
||||
.tox {
|
||||
.tox-editor-container {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.tox-edit-area {
|
||||
padding: 0 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.resource-label {
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
height: 40px;
|
||||
border-top: 1px solid rgba(139, 115, 85, 0.4);
|
||||
border-bottom: 1px solid rgba(139, 115, 85, 0.4);
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
rgba(226, 226, 222, 0.5) 0%,
|
||||
rgba(240, 235, 225, 0.3) 100%
|
||||
);
|
||||
color: #000000;
|
||||
font-family: "GreatPrimer";
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
|
||||
.item {
|
||||
line-height: 40px;
|
||||
font-weight: bold;
|
||||
padding: 0 1rem;
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
background: rgba(226, 226, 222, 0.6);
|
||||
color: rgba(70, 67, 49, 0.9);
|
||||
}
|
||||
|
||||
&.active {
|
||||
text-decoration: underline;
|
||||
text-shadow: none;
|
||||
background: rgba(196, 186, 166, 0.4);
|
||||
border-bottom: 3px solid rgba(139, 115, 85, 0.8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.items-list {
|
||||
list-style: none;
|
||||
margin: 1px 0;
|
||||
padding: 0;
|
||||
overflow-y: auto;
|
||||
|
||||
.item-header {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.item {
|
||||
height: 30px;
|
||||
line-height: 24px;
|
||||
padding: 1px 0;
|
||||
border-bottom: 1px solid #bbb;
|
||||
|
||||
.item-image {
|
||||
flex: 0 0 24px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.item-name {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.item-controls {
|
||||
flex: 0 0 86px;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.profile-img-container {
|
||||
margin-right: 0.2rem;
|
||||
max-width: 140px;
|
||||
width: 140px;
|
||||
}
|
||||
|
||||
.button-img {
|
||||
vertical-align: baseline;
|
||||
width: 8%;
|
||||
height: 8%;
|
||||
max-height: 48px;
|
||||
border-width: 0px;
|
||||
border: 1px solid rgba(0, 0, 0, 0);
|
||||
|
||||
&:hover {
|
||||
color: rgba(255, 255, 128, 0.7);
|
||||
border: 1px solid rgba(255, 128, 0, 0.8);
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.button-effect-img {
|
||||
vertical-align: baseline;
|
||||
width: 16px;
|
||||
max-height: 16px;
|
||||
height: 16;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
.small-button-container {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
border: 0;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.fvtt-te-deum .sheet-body {
|
||||
flex: 1 1 0;
|
||||
min-height: 0;
|
||||
overflow: hidden;
|
||||
font-size: 0.8rem;
|
||||
font-family: "GreatPrimer";
|
||||
}
|
||||
|
||||
.fvtt-te-deum .sheet-body .tab {
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
font-size: 0.8rem;
|
||||
font-family: "GreatPrimer";
|
||||
}
|
||||
|
||||
.fvtt-te-deum .sheet-body .tab .editor {
|
||||
height: 100%;
|
||||
font-size: 0.8rem;
|
||||
font-family: "GreatPrimer";
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
@import "variables";
|
||||
@import "base";
|
||||
@import "layout";
|
||||
@import "actor-sheet";
|
||||
@import "items";
|
||||
@import "chat";
|
||||
@import "dialogs";
|
||||
@@ -0,0 +1,30 @@
|
||||
@font-face {
|
||||
font-family: "MailartRubberstamp";
|
||||
src: url("../fonts/MailartRubberstamp-Regular.woff") format("woff");
|
||||
font-family: "GreatPrimer";
|
||||
src: url("../fonts/IM_FELL_Great_Primer_Roman.woff") format("woff");
|
||||
}
|
||||
|
||||
// Variables LESS
|
||||
@window-header-title-font-size: 1.3rem;
|
||||
@window-header-title-font-weight: normal;
|
||||
@window-header-title-color: #f5f5f5;
|
||||
@major-button-font-size: 1.05rem;
|
||||
@major-button-font-weight: normal;
|
||||
@major-button-color: #dadada;
|
||||
@tab-header-font-size: 1rem;
|
||||
@tab-header-font-weight: 700;
|
||||
@tab-header-color: #403f3e;
|
||||
@tab-header-color-active: #4a0404;
|
||||
@actor-input-font-size: 0.8rem;
|
||||
@actor-input-font-weight: 500;
|
||||
@actor-input-color: black;
|
||||
@actor-label-font-size: 0.8rem;
|
||||
@actor-label-font-weight: 700;
|
||||
@actor-label-color: rgba(70, 67, 49, 0.76863);
|
||||
@debug-background-color-red: rgba(255, 0, 0, 0.32941);
|
||||
@debug-background-color-blue: rgba(29, 0, 255, 0.32941);
|
||||
@debug-background-color-green: rgba(84, 255, 0, 0.32941);
|
||||
@debug-box-shadow-red: inset 0 0 2px red;
|
||||
@debug-box-shadow-blue: inset 0 0 2px blue;
|
||||
@debug-box-shadow-green: inset 0 0 2px green;
|
||||
@@ -1,176 +1,227 @@
|
||||
/**
|
||||
* Extend the basic ActorSheet with some very simple modifications
|
||||
* @extends {ActorSheet}
|
||||
* Feuille de personnage Te Deum - AppV2
|
||||
*/
|
||||
|
||||
import { TeDeumUtility } from "../common/tedeum-utility.js";
|
||||
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class TeDeumActorPJSheet extends ActorSheet {
|
||||
export class TeDeumActorPJSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {
|
||||
|
||||
constructor(options = {}) {
|
||||
super(options)
|
||||
this._sheetMode = this.constructor.SHEET_MODES.PLAY
|
||||
}
|
||||
|
||||
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["fvtt-te-deum", "sheet", "actor"],
|
||||
template: "systems/fvtt-te-deum/templates/actors/actor-sheet.hbs",
|
||||
position: {
|
||||
width: 860,
|
||||
height: 680,
|
||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }],
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
closeOnSubmit: false,
|
||||
},
|
||||
window: {
|
||||
resizable: true,
|
||||
},
|
||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
||||
editScore: true
|
||||
});
|
||||
actions: {
|
||||
editImage: TeDeumActorPJSheet.#onEditImage,
|
||||
toggleSheet: TeDeumActorPJSheet.#onToggleSheet,
|
||||
editItem: TeDeumActorPJSheet.#onEditItem,
|
||||
deleteItem: TeDeumActorPJSheet.#onDeleteItem,
|
||||
createItem: TeDeumActorPJSheet.#onCreateItem,
|
||||
createBlessure: TeDeumActorPJSheet.#onCreateBlessure,
|
||||
createCompetence: TeDeumActorPJSheet.#onCreateCompetence,
|
||||
equipItem: TeDeumActorPJSheet.#onEquipItem,
|
||||
modifyQuantity: TeDeumActorPJSheet.#onModifyQuantity,
|
||||
rollCompetence: TeDeumActorPJSheet.#onRollCompetence,
|
||||
rollArme: TeDeumActorPJSheet.#onRollArme,
|
||||
rollDegats: TeDeumActorPJSheet.#onRollDegats,
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
sheet: {
|
||||
template: "systems/fvtt-te-deum/templates/actors/actor-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
tabGroups = { primary: "principal" }
|
||||
|
||||
get isEditMode() {
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.EDIT
|
||||
}
|
||||
|
||||
get isPlayMode() {
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.PLAY
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
|
||||
let formData = {
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const actor = this.document
|
||||
return {
|
||||
title: this.title,
|
||||
id: this.actor.id,
|
||||
type: this.actor.type,
|
||||
img: this.actor.img,
|
||||
name: this.actor.name,
|
||||
id: actor.id,
|
||||
type: actor.type,
|
||||
img: actor.img,
|
||||
name: actor.name,
|
||||
editable: this.isEditable,
|
||||
cssClass: this.isEditable ? "editable" : "locked",
|
||||
system: foundry.utils.duplicate(this.object.system),
|
||||
limited: this.object.limited,
|
||||
competences: this.actor.getCompetences(),
|
||||
system: foundry.utils.duplicate(actor.system),
|
||||
systemFields: actor.system.schema.fields,
|
||||
limited: actor.limited,
|
||||
competences: actor.getCompetences(),
|
||||
config: foundry.utils.duplicate(game.system.tedeum.config),
|
||||
armes: this.actor.getArmes(),
|
||||
caracList: this.actor.prepareCaracteristiques(),
|
||||
providence: this.actor.prepareProvidence(),
|
||||
arbreCompetences: this.actor.prepareArbreCompetences(),
|
||||
equipements: this.actor.getEquipements(),
|
||||
simples: this.actor.getSimples(),
|
||||
armures: this.actor.getArmures(),
|
||||
graces: this.actor.getGraces(),
|
||||
blessures: this.actor.getBlessures(),
|
||||
maladies: this.actor.getMaladies(),
|
||||
poisons: this.actor.getPoisons(),
|
||||
combat: this.actor.prepareCombat(),
|
||||
bonusDegats: this.actor.getBonusDegats(),
|
||||
nbActions: this.actor.getNbActions(),
|
||||
initiative: this.actor.getInitiative(),
|
||||
pointsArmuresLourdes: this.actor.getNbArmures(),
|
||||
nbArmuresLourdes: this.actor.getNbArmuresLourdesActuel(),
|
||||
santeModifier: this.actor.getSanteModifier(),
|
||||
educations: this.actor.getEducations(),
|
||||
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
|
||||
equipmentfree: await TextEditor.enrichHTML(this.object.system.equipmentfree, { async: true }),
|
||||
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
|
||||
histoire: await TextEditor.enrichHTML(this.object.system.histoire, { async: true }),
|
||||
options: this.options,
|
||||
owner: this.document.isOwner,
|
||||
editScore: this.options.editScore,
|
||||
isGM: game.user.isGM
|
||||
armes: actor.getArmes(),
|
||||
caracList: actor.prepareCaracteristiques(),
|
||||
providence: actor.prepareProvidence(),
|
||||
arbreCompetences: actor.prepareArbreCompetences(),
|
||||
equipements: actor.getEquipements(),
|
||||
simples: actor.getSimples(),
|
||||
armures: actor.getArmures(),
|
||||
graces: actor.getGraces(),
|
||||
blessures: actor.getBlessures(),
|
||||
maladies: actor.getMaladies(),
|
||||
poisons: actor.getPoisons(),
|
||||
combat: actor.prepareCombat(),
|
||||
bonusDegats: actor.getBonusDegats(),
|
||||
nbActions: actor.getNbActions(),
|
||||
initiative: actor.getInitiative(),
|
||||
pointsArmuresLourdes: actor.getNbArmures(),
|
||||
nbArmuresLourdes: actor.getNbArmuresLourdesActuel(),
|
||||
santeModifier: actor.getSanteModifier(),
|
||||
educations: actor.getEducations(),
|
||||
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.description, { async: true }),
|
||||
enrichedEquipmentFree: await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.equipmentfree, { async: true }),
|
||||
enrichedNotes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.notes, { async: true }),
|
||||
enrichedHistoire: await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.histoire, { async: true }),
|
||||
owner: actor.isOwner,
|
||||
isEditMode: this.isEditMode,
|
||||
isPlayMode: this.isPlayMode,
|
||||
isGM: game.user.isGM,
|
||||
}
|
||||
this.formData = formData;
|
||||
|
||||
console.log("PC : ", formData, this.object);
|
||||
return formData;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
if (!this.options.editable) return;
|
||||
|
||||
html.bind("keydown", function(e) { // Ignore Enter in actores sheet
|
||||
if (e.keyCode === 13) return false;
|
||||
});
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item-id")
|
||||
let itemId = li.data("item-id")
|
||||
const item = this.actor.items.get( itemId );
|
||||
item.sheet.render(true);
|
||||
});
|
||||
// Delete Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item-id")
|
||||
TeDeumUtility.confirmDelete(this, li).catch("Error : No deletion confirmed")
|
||||
})
|
||||
html.find('.item-add').click(ev => {
|
||||
let dataType = $(ev.currentTarget).data("type")
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouveau " + dataType, type: dataType }], { renderSheet: true })
|
||||
})
|
||||
html.find('.competence-add').click(ev => {
|
||||
let dataType = $(ev.currentTarget).data("type")
|
||||
let caracKey = $(ev.currentTarget).data("carac-key")
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + dataType, type: dataType, system: {caracteristique: caracKey} }], { renderSheet: true })
|
||||
})
|
||||
|
||||
html.find('.subactor-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let actorId = li.data("actor-id");
|
||||
let actor = game.actors.get( actorId );
|
||||
actor.sheet.render(true);
|
||||
});
|
||||
|
||||
html.find('.subactor-delete').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let actorId = li.data("actor-id");
|
||||
this.actor.delSubActor(actorId);
|
||||
});
|
||||
html.find('.quantity-minus').click(event => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
this.actor.incDecQuantity( li.data("item-id"), -1 );
|
||||
} );
|
||||
html.find('.quantity-plus').click(event => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
this.actor.incDecQuantity( li.data("item-id"), +1 );
|
||||
} );
|
||||
|
||||
html.find('.roll-competence').click((event) => {
|
||||
let compId = $(event.currentTarget).data("comp-id")
|
||||
this.actor.rollCompetence(compId)
|
||||
});
|
||||
html.find('.roll-arme').click((event) => {
|
||||
const armeId = $(event.currentTarget).data("arme-id")
|
||||
this.actor.rollArme(armeId)
|
||||
});
|
||||
html.find('.roll-degats').click((event) => {
|
||||
const armeId = $(event.currentTarget).data("arme-id")
|
||||
this.actor.rollDegatsArme(armeId)
|
||||
});
|
||||
|
||||
|
||||
html.find('.lock-unlock-sheet').click((event) => {
|
||||
this.options.editScore = !this.options.editScore;
|
||||
this.render(true);
|
||||
});
|
||||
html.find('.item-equip').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.equipItem( li.data("item-id") );
|
||||
this.render(true);
|
||||
});
|
||||
html.find('.update-field').change(ev => {
|
||||
const fieldName = $(ev.currentTarget).data("field-name");
|
||||
let value = Number(ev.currentTarget.value);
|
||||
this.actor.update( { [`${fieldName}`]: value } );
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
setPosition(options = {}) {
|
||||
const position = super.setPosition(options);
|
||||
const sheetBody = this.element.find(".sheet-body");
|
||||
const bodyHeight = position.height - 192;
|
||||
sheetBody.css("height", bodyHeight);
|
||||
return position;
|
||||
_onRender(context, options) {
|
||||
super._onRender(context, options)
|
||||
|
||||
// Tab navigation
|
||||
const nav = this.element.querySelector('nav.tabs[data-group]')
|
||||
if (nav) {
|
||||
const group = nav.dataset.group
|
||||
const activeTab = this.tabGroups[group] || "principal"
|
||||
nav.querySelectorAll('[data-tab]').forEach(link => {
|
||||
const tab = link.dataset.tab
|
||||
link.classList.toggle('active', tab === activeTab)
|
||||
link.addEventListener('click', event => {
|
||||
event.preventDefault()
|
||||
this.tabGroups[group] = tab
|
||||
this.render()
|
||||
})
|
||||
})
|
||||
this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach(content => {
|
||||
content.classList.toggle('active', content.dataset.tab === activeTab)
|
||||
})
|
||||
}
|
||||
|
||||
// Ignore Enter key in sheet inputs
|
||||
this.element.addEventListener('keydown', e => {
|
||||
if (e.keyCode === 13 && e.target.tagName !== 'TEXTAREA') e.preventDefault()
|
||||
})
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
_updateObject(event, formData) {
|
||||
// Update the Actor
|
||||
return this.object.update(formData);
|
||||
// #region Static action handlers
|
||||
|
||||
static async #onEditImage(event) {
|
||||
const fp = new FilePicker({
|
||||
type: "image",
|
||||
current: this.document.img,
|
||||
callback: path => this.document.update({ img: path }),
|
||||
})
|
||||
fp.browse()
|
||||
}
|
||||
|
||||
static async #onToggleSheet(event) {
|
||||
this._sheetMode = this.isEditMode
|
||||
? this.constructor.SHEET_MODES.PLAY
|
||||
: this.constructor.SHEET_MODES.EDIT
|
||||
this.render()
|
||||
}
|
||||
|
||||
static async #onEditItem(event, target) {
|
||||
const li = target.closest("[data-item-id]")
|
||||
const item = this.actor.items.get(li?.dataset.itemId)
|
||||
if (item) item.sheet.render(true)
|
||||
}
|
||||
|
||||
static async #onDeleteItem(event, target) {
|
||||
const li = target.closest("[data-item-id]")
|
||||
await TeDeumUtility.confirmDelete(this, li)
|
||||
}
|
||||
|
||||
static async #onCreateItem(event, target) {
|
||||
const type = target.dataset.type
|
||||
await this.actor.createEmbeddedDocuments('Item', [{ name: "Nouveau " + type, type }], { renderSheet: true })
|
||||
}
|
||||
|
||||
static async #onCreateBlessure(event, target) {
|
||||
const type = target.dataset.type
|
||||
await this.actor.createEmbeddedDocuments('Item', [{
|
||||
name: "Nouvelle " + type, type,
|
||||
system: { typeBlessure: "estafilade", localisation: "corps", value: 0, appliquee: true, description: "" }
|
||||
}], { renderSheet: true })
|
||||
}
|
||||
|
||||
static async #onCreateCompetence(event, target) {
|
||||
const type = target.dataset.type
|
||||
const caracKey = target.dataset.caracKey
|
||||
await this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + type, type, system: { caracteristique: caracKey } }], { renderSheet: true })
|
||||
}
|
||||
|
||||
static async #onEquipItem(event, target) {
|
||||
const li = target.closest("[data-item-id]")
|
||||
if (!li?.dataset.itemId) return
|
||||
await this.actor.equipItem(li.dataset.itemId)
|
||||
}
|
||||
|
||||
static async #onModifyQuantity(event, target) {
|
||||
const li = target.closest("[data-item-id]")
|
||||
if (!li?.dataset.itemId) return
|
||||
const item = this.actor.items.get(li.dataset.itemId)
|
||||
if (!item) return
|
||||
const delta = parseInt(target.dataset.qty) || 0
|
||||
await this.actor.incDecQuantity(li.dataset.itemId, delta)
|
||||
}
|
||||
|
||||
static async #onRollCompetence(event, target) {
|
||||
const li = target.closest("[data-item-id]")
|
||||
if (!li?.dataset.itemId) return
|
||||
await this.actor.rollCompetence(li.dataset.itemId)
|
||||
}
|
||||
|
||||
static async #onRollArme(event, target) {
|
||||
const li = target.closest("[data-item-id]")
|
||||
if (!li?.dataset.itemId) return
|
||||
await this.actor.rollArme(li.dataset.itemId)
|
||||
}
|
||||
|
||||
static async #onRollDegats(event, target) {
|
||||
const li = target.closest("[data-item-id]")
|
||||
if (!li?.dataset.itemId) return
|
||||
await this.actor.rollDegatsArme(li.dataset.itemId)
|
||||
}
|
||||
|
||||
// #endregion
|
||||
}
|
||||
|
||||
+147
-32
@@ -65,14 +65,43 @@ export class TeDeumActor extends Actor {
|
||||
super._preUpdate(changed, options, user);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getCompetenceScore(compName) {
|
||||
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
|
||||
if (competence) {
|
||||
if (competence.system.isBase) {
|
||||
return this.system.caracteristiques[competence.system.caracteristique].value
|
||||
}
|
||||
return competence.system.score
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getMeilleureCompetenceMainGauche(comp) {
|
||||
let compScore = this.getCompetenceScore(comp.name)
|
||||
let mainGaucheScore = this.getCompetenceScore("main gauche")
|
||||
if (mainGaucheScore < compScore) {
|
||||
ui.notifications.info(`${this.name} : Utilisation de la compétence Main Gauche au lieu de ${comp.name}`)
|
||||
let mainGaucheComp = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "main gauche")
|
||||
if (!mainGaucheComp) {
|
||||
// Create a fake competence object
|
||||
mainGaucheComp = foundry.utils.duplicate(comp)
|
||||
mainGaucheComp.name = "Main Gauche"
|
||||
mainGaucheComp.system.isBase = false
|
||||
mainGaucheComp.system.score = 0
|
||||
mainGaucheComp.system.caracteristique = "adresse"
|
||||
mainGaucheComp.system.description = "Compétence Main Gauche (automatique)"
|
||||
mainGaucheComp.system.isMainGauche = true
|
||||
return mainGaucheComp
|
||||
} else {
|
||||
return mainGaucheComp
|
||||
}
|
||||
} else {
|
||||
return comp
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_onUpdate(changed, options, userId) {
|
||||
let updates = []
|
||||
@@ -112,12 +141,6 @@ export class TeDeumActor extends Actor {
|
||||
updates.push({ _id: initiative.id, "system.score": Number(newScore) })
|
||||
}
|
||||
|
||||
let actionsTour = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "actions/tour")
|
||||
newScore = this.getCommonBaseValue(this.system.caracteristiques.adresse.value)
|
||||
if (actionsTour && actionsTour?.system.score != newScore) {
|
||||
updates.push({ _id: actionsTour.id, "system.score": Number(newScore) })
|
||||
}
|
||||
|
||||
let effort = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "effort")
|
||||
newScore = this.getCommonBaseValue(this.system.caracteristiques.puissance.value)
|
||||
if (effort && effort?.system.score != newScore) {
|
||||
@@ -147,7 +170,7 @@ export class TeDeumActor extends Actor {
|
||||
getCommonBaseValue(value) {
|
||||
return game.system.tedeum.config.COMMON_VALUE[value]?.value || 0
|
||||
}
|
||||
getInitiative() {
|
||||
getInitiativeValue() {
|
||||
return game.system.tedeum.config.COMMON_VALUE[this.system.caracteristiques.adresse.value]?.value || 0
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
@@ -155,6 +178,24 @@ export class TeDeumActor extends Actor {
|
||||
return game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value]
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getAttaqueBonusDegats(rollData = undefined) {
|
||||
let base = game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value].value
|
||||
let additionalBonus = 0
|
||||
if (rollData) {
|
||||
// Spécificité armes naturelle avec gantelet
|
||||
if (rollData?.arme?.system.specificites?.poing?.hasSpec && this.items.find(item => item.type == "armure" && item.name.toLowerCase() == "gantelet" && item.system.equipe)) {
|
||||
additionalBonus += 1
|
||||
rollData.gantelet = true
|
||||
}
|
||||
if (rollData.isChargeAPied) {
|
||||
additionalBonus += this.getCompetenceScore("course")
|
||||
} else if (rollData.isChargeACheval) {
|
||||
additionalBonus += this.getCompetenceScore("equitation")
|
||||
}
|
||||
}
|
||||
return base + additionalBonus
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getNbArmures() {
|
||||
return game.system.tedeum.config.MAX_ARMURES_LOURDES[this.system.caracteristiques.puissance.value]
|
||||
}
|
||||
@@ -266,41 +307,105 @@ export class TeDeumActor extends Actor {
|
||||
modTotal += blessDef.modifier
|
||||
}
|
||||
// Si le nombre de blessures est supérieur au score d'endurance, alors malus supplémentaire
|
||||
let endurance = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "endurance")
|
||||
if (blessures.length > endurance.system.score) {
|
||||
let enduranceScore = this.getCompetenceScore("endurance")
|
||||
if (blessures.length > enduranceScore) {
|
||||
modTotal += -1
|
||||
}
|
||||
return modTotal
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async appliquerDegats(rollData) {
|
||||
let combat = this.prepareCombat()
|
||||
rollData.defenderName = this.name
|
||||
let touche = combat[rollData.loc.id].touche
|
||||
if (rollData.degats > 0 && rollData.degats > touche) {
|
||||
let diff = rollData.degats - touche
|
||||
for (let bId in game.system.tedeum.config.blessures) {
|
||||
let blessure = game.system.tedeum.config.blessures[bId]
|
||||
if (diff >= blessure.degatsMin && diff <= blessure.degatsMax) {
|
||||
async appliquerBlessure(blessureId, locId, comment = "") {
|
||||
let blessure = game.system.tedeum.config.blessures[blessureId]
|
||||
if (!blessure) {
|
||||
ui.notifications.warn("Type de blessure inconnu : " + blessureId)
|
||||
console.error("Type de blessure inconnu : " + blessureId)
|
||||
return
|
||||
}
|
||||
// Create a new blessure object
|
||||
let blessureObj = {
|
||||
name: blessure.label,
|
||||
type: "blessure",
|
||||
system: {
|
||||
typeBlessure: bId,
|
||||
typeBlessure: blessureId,
|
||||
localisation: locId || "maindroite",
|
||||
value: blessure.value,
|
||||
appliquee: true,
|
||||
description: comment,
|
||||
}
|
||||
}
|
||||
this.createEmbeddedDocuments('Item', [blessureObj]);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getArmorDegatsModifier(rollData, combat) {
|
||||
let loc = combat[rollData.loc.id]
|
||||
// Sans armure
|
||||
if (loc.armures.length == 0) {
|
||||
return rollData.arme.system.degatsArmure.sansarmure
|
||||
}
|
||||
// Avec armure de cuir
|
||||
if (loc.armures.find(a => a.system.typeArmure == "cuir")) {
|
||||
return rollData.arme.system.degatsArmure.cuir
|
||||
}
|
||||
// Avec armure de maille
|
||||
if (loc.armures.find(a => a.system.typeArmure == "maille")) {
|
||||
return rollData.arme.system.degatsArmure.mailles
|
||||
}
|
||||
// Avec armure de plate
|
||||
if (loc.armures.find(a => a.system.typeArmure == "plate")) {
|
||||
return rollData.arme.system.degatsArmure.plates
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async appliquerDegats(rollData) {
|
||||
let combat = this.prepareCombat()
|
||||
rollData.defenderName = this.name
|
||||
let touche = combat[rollData.loc.id].touche
|
||||
let armorDegatModifier = this.getArmorDegatsModifier(rollData, combat)
|
||||
rollData.degats += armorDegatModifier
|
||||
rollData.armorDegatModifier = armorDegatModifier
|
||||
|
||||
let blessureId = "indemne"
|
||||
if (rollData.degats > 0 && rollData.degats > touche) {
|
||||
let diff = rollData.degats - touche
|
||||
for (let bId in game.system.tedeum.config.blessures) {
|
||||
let blessure = game.system.tedeum.config.blessures[bId]
|
||||
if (diff >= blessure.degatsMin && diff <= blessure.degatsMax) {
|
||||
if (rollData.isReussiteCritique) {
|
||||
bId = game.system.tedeum.config.blessuresOrder[blessure.value + 1]
|
||||
}
|
||||
blessureId = bId
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rollData.isReussiteCritique && blessureId == "indemne") { // Critical success without degats => lightest blessure
|
||||
blessureId = "estafilade"
|
||||
}
|
||||
console.log("Appliquer dégats", rollData, combat, blessureId)
|
||||
if (blessureId != "indemne") {
|
||||
let blessure = game.system.tedeum.config.blessures[blessureId]
|
||||
// Create a new blessure object
|
||||
let blessureObj = {
|
||||
name: blessure.label,
|
||||
type: "blessure",
|
||||
system: {
|
||||
typeBlessure: blessureId,
|
||||
localisation: rollData.loc.id,
|
||||
value: blessure.value,
|
||||
appliquee: true,
|
||||
description: "Blessure infligée par un coup de " + rollData.arme.name + " de " + rollData.alias,
|
||||
}
|
||||
}
|
||||
rollData.blessure = blessureObj
|
||||
rollData.touche = touche
|
||||
this.createEmbeddedDocuments('Item', [blessureObj]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Display the relevant chat message
|
||||
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-blessure-result.hbs`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-blessure-result.hbs`, rollData)
|
||||
})
|
||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||
}
|
||||
@@ -334,7 +439,7 @@ export class TeDeumActor extends Actor {
|
||||
let providence = foundry.utils.deepClone(this.system.providence)
|
||||
providence.name = "Providence"
|
||||
if (this.system.genre.toLowerCase() == "homme") {
|
||||
providence.qualite = game.system.tedeum.config.providence[providence.value].labelH
|
||||
providence.qualite = game.system.tedeum.config.providence[providence.value].labelM
|
||||
} else {
|
||||
providence.qualite = game.system.tedeum.config.providence[providence.value].labelF
|
||||
}
|
||||
@@ -382,6 +487,7 @@ export class TeDeumActor extends Actor {
|
||||
xp = Math.max(xp + value, 0)
|
||||
await this.update({ [`system.caracteristiques.${key}.experience`]: xp })
|
||||
this.sheet?.render(true)
|
||||
ui.notifications.info(`+${value} XP en ${game.system.tedeum.config.caracteristiques[key].label}`)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -529,12 +635,16 @@ export class TeDeumActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getInitiativeScore() {
|
||||
let initiative = this.items.find(it => it.type == "competence" && it.name.toLowerCase() == "initiative")
|
||||
if (initiative) {
|
||||
return initiative.system.score
|
||||
let initiative = this.getInitiativeValue()
|
||||
// Vérifie les armes avec bonus d'initiative
|
||||
let armes = this.getArmes()
|
||||
for (let arme of armes) {
|
||||
if (arme.system.equipe && Number(arme.system.initiativeBonus) && Number(arme.system.initiativeBonus) != 0) {
|
||||
ui.notifications.info("L'arme " + arme.name + " vous confère un bonus d'initiative de " + arme.system.initiativeBonus)
|
||||
initiative += arme.system.initiativeBonus
|
||||
}
|
||||
ui.notifications.warn("Impossible de trouver la compétence Initiative pour l'acteur " + this.name)
|
||||
return -1;
|
||||
}
|
||||
return initiative
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -595,6 +705,7 @@ export class TeDeumActor extends Actor {
|
||||
let rollData = this.getCommonCompetence(compId)
|
||||
rollData.mode = "competence"
|
||||
rollData.title = rollData.competence.name
|
||||
rollData.compScore = rollData.competence.system.isBase ? this.system.caracteristiques[rollData.competence.system.caracteristique].value : rollData.competence.system.score
|
||||
this.startRoll(rollData).catch("Error on startRoll")
|
||||
}
|
||||
|
||||
@@ -602,7 +713,7 @@ export class TeDeumActor extends Actor {
|
||||
async rollDegatsArme(armeId) {
|
||||
let weapon = this.items.get(armeId)
|
||||
if (weapon) {
|
||||
let bDegats = 0
|
||||
let bDegats = { value: 0 }
|
||||
if (weapon.system.typeArme == "melee") {
|
||||
bDegats = this.getBonusDegats()
|
||||
}
|
||||
@@ -617,7 +728,7 @@ export class TeDeumActor extends Actor {
|
||||
rollData.degats = degatsRoll.total
|
||||
|
||||
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-degats-result.hbs`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-degats-result.hbs`, rollData)
|
||||
})
|
||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||
console.log("Rolldata result", rollData)
|
||||
@@ -653,9 +764,14 @@ export class TeDeumActor extends Actor {
|
||||
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
|
||||
if (competence) {
|
||||
rollData.competence = competence
|
||||
rollData.compScore = rollData.competence.system.isBase ? this.system.caracteristiques[rollData.competence.system.caracteristique].value : rollData.competence.system.score
|
||||
let c = foundry.utils.duplicate(this.system.caracteristiques[competence.system.caracteristique])
|
||||
this.updateCarac(c, competence.system.caracteristique)
|
||||
rollData.carac = c
|
||||
rollData.allongeLabel = game.system.tedeum.config.armeAllonges[weapon.system.allonge].label
|
||||
rollData.allongeId = "courte"
|
||||
rollData.allonges = foundry.utils.duplicate(game.system.tedeum.config.allonges[weapon.system.allonge])
|
||||
|
||||
} else {
|
||||
ui.notifications.warn("Impossible de trouver la compétence " + compName)
|
||||
return
|
||||
@@ -669,8 +785,7 @@ export class TeDeumActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async startRoll(rollData) {
|
||||
console.log("startRoll", rollData)
|
||||
let rollDialog = await TeDeumRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await TeDeumRollDialog.create(this, rollData)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,13 +6,14 @@ export class TeDeumCharacterCreator {
|
||||
async init() {
|
||||
this.stages = {}
|
||||
this.currentStage = "origineSociale"
|
||||
this.sex = undefined
|
||||
this.sexe = undefined
|
||||
this.origineSociale = undefined
|
||||
this.religion = undefined
|
||||
this.caracBonus = {}
|
||||
this.competenceBonus = {}
|
||||
this.suiviReponses = []
|
||||
this.competences = TeDeumUtility.getCompetencesForDropDown()
|
||||
this.choiceSummary = {}
|
||||
|
||||
for (let k in game.system.tedeum.config.caracteristiques) {
|
||||
this.caracBonus[k] = { value: 0 }
|
||||
@@ -39,6 +40,7 @@ export class TeDeumCharacterCreator {
|
||||
} else {
|
||||
this.competenceBonus[compName].value += 1
|
||||
}
|
||||
this.choiceSummary[this.currentStage].competences[compName] = 1
|
||||
}
|
||||
|
||||
/*--------------------------------------------*/
|
||||
@@ -69,7 +71,7 @@ export class TeDeumCharacterCreator {
|
||||
|
||||
/*--------------------------------------------*/
|
||||
async askStageName(context) {
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-stage-name.hbs", context)
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-stage-name.hbs", context)
|
||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: context.title },
|
||||
classes: ["fvtt-te-deum"],
|
||||
@@ -116,6 +118,7 @@ export class TeDeumCharacterCreator {
|
||||
/*--------------------------------------------*/
|
||||
async askQuestionnaire(stage, context) {
|
||||
context.subtitle = "Questionnaire"
|
||||
this.choiceSummary[this.currentStage].questionnaire = {}
|
||||
|
||||
for (let key in stage.system.questionnaire) {
|
||||
let question = stage.system.questionnaire[key]
|
||||
@@ -127,7 +130,7 @@ export class TeDeumCharacterCreator {
|
||||
context.competences = {}
|
||||
context.responseKey = "reponse1" // By default
|
||||
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-questions.hbs", context)
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-questions.hbs", context)
|
||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: context.title },
|
||||
classes: ["fvtt-te-deum"],
|
||||
@@ -170,13 +173,14 @@ export class TeDeumCharacterCreator {
|
||||
let compName = context.competences[context.responseKey] || selectedResponse.compName
|
||||
this.increaseCompetence(compName)
|
||||
|
||||
this.suiviReponses.push({ etape: stage.name, question: question.question, reponse: selectedResponse.reponse, compName: compName })
|
||||
this.suiviReponses.push({ key: this.currentStage, etape: stage.name, question: question.question, reponse: selectedResponse.reponse, compName: compName })
|
||||
}
|
||||
}
|
||||
|
||||
/*------------- -------------------------------*/
|
||||
async askCompetences(stage, context) {
|
||||
context.subtitle = "Choix des Compétences"
|
||||
this.choiceSummary[this.currentStage].competences = {}
|
||||
|
||||
context.fixedCompetences = {}
|
||||
context.selectCompetences = {}
|
||||
@@ -192,7 +196,7 @@ export class TeDeumCharacterCreator {
|
||||
}
|
||||
}
|
||||
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: context.title },
|
||||
classes: ["fvtt-te-deum"],
|
||||
@@ -236,7 +240,7 @@ export class TeDeumCharacterCreator {
|
||||
}
|
||||
}
|
||||
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: context.title },
|
||||
classes: ["fvtt-te-deum"],
|
||||
@@ -273,6 +277,10 @@ export class TeDeumCharacterCreator {
|
||||
/*------------- -------------------------------*/
|
||||
async askCarac(stage, context) {
|
||||
context.subtitle = "Choix des Caractéristiques"
|
||||
this.choiceSummary[this.currentStage] = {
|
||||
caracBonus : {},
|
||||
competences : {}
|
||||
}
|
||||
|
||||
let selected = []
|
||||
for (let i = 0; i < stage.system.nbChoixCarac; i++) {
|
||||
@@ -283,7 +291,7 @@ export class TeDeumCharacterCreator {
|
||||
context.caracList.push(game.system.tedeum.config.caracteristiques[carac.caracId])
|
||||
}
|
||||
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-carac.hbs", context)
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-carac.hbs", context)
|
||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: context.title },
|
||||
classes: ["fvtt-te-deum"],
|
||||
@@ -312,6 +320,7 @@ export class TeDeumCharacterCreator {
|
||||
}
|
||||
this.caracBonus[choiceResult.carac].value += 1
|
||||
selected.push(choiceResult.carac)
|
||||
this.choiceSummary[this.currentStage].caracBonus[choiceResult.carac] = 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -325,7 +334,7 @@ export class TeDeumCharacterCreator {
|
||||
origineChoice: game.system.tedeum.config.origineSociale
|
||||
}
|
||||
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-origine.hbs", context)
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-origine.hbs", context)
|
||||
const label = "Valider le choix de l'Origine Sociale"
|
||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: context.title },
|
||||
@@ -360,6 +369,12 @@ export class TeDeumCharacterCreator {
|
||||
for (let key in this.origineSociale.caracteristiques) {
|
||||
this.caracBonus[key].value += this.origineSociale.caracteristiques[key]
|
||||
}
|
||||
this.choiceSummary['origineSociale'] = {
|
||||
sexe: this.sexe,
|
||||
religion: this.religion,
|
||||
origineSociale: this.origineSociale.label,
|
||||
caracBonus: this.caracBonus,
|
||||
}
|
||||
this.currentStage = "pouponniere"
|
||||
|
||||
}
|
||||
@@ -388,6 +403,7 @@ export class TeDeumCharacterCreator {
|
||||
this.pouponniere = foundry.utils.duplicate(stage.items.find(item => item.id === choiceResult.selectedItem))
|
||||
context.title = `La Pouponnière - ${this.pouponniere.name}`
|
||||
TeDeumUtility.prepareEducationContent(this.pouponniere);
|
||||
this.choiceSummary['pouponniere'] = {}
|
||||
|
||||
context.label = "Valider l'augmentation de caracteristique"
|
||||
await this.askCarac(this.pouponniere, context)
|
||||
@@ -559,7 +575,7 @@ export class TeDeumCharacterCreator {
|
||||
for (let compName in this.competenceBonus) {
|
||||
let comp = actor.items.find( i => i.type == "competence" && i.name.toLowerCase() === compName.toLowerCase())
|
||||
if (comp) {
|
||||
updateComp.push({ _id: comp._id, "system.score": this.competenceBonus[compName].value })
|
||||
updateComp.push({ _id: comp._id, "system.score": comp.system.score + this.competenceBonus[compName].value })
|
||||
} else {
|
||||
toAdd.push( compName)
|
||||
}
|
||||
@@ -581,8 +597,36 @@ export class TeDeumCharacterCreator {
|
||||
await actor.update({ [`system.fortune.${this.origineSociale.cagnotteUnit}`]: newArgent})
|
||||
|
||||
let histoire = ""
|
||||
for (let reponse of this.suiviReponses) {
|
||||
histoire += `<p>${reponse.question}<br>${reponse.reponse} (${reponse.compName})</p>`
|
||||
for ( let key in this.choiceSummary) {
|
||||
let stageSummary = this.choiceSummary[key]
|
||||
if (stageSummary.sexe) {
|
||||
histoire += `<h3>Origine Sociale</h3>`
|
||||
histoire += `<p>${stageSummary.sexe} - ${stageSummary.religion} - ${stageSummary.origineSociale}</p>`
|
||||
} else {
|
||||
histoire += `<h3>${game.system.tedeum.config.etapesEducation[key].label}</h3>`
|
||||
}
|
||||
if (stageSummary.caracBonus) {
|
||||
histoire += `<p><strong>Caractéristiques : </strong><ul>`
|
||||
for (let caracKey in stageSummary.caracBonus) {
|
||||
histoire += `<li>${TeDeumUtility.upperFirst(caracKey)} +1</li>`
|
||||
}
|
||||
histoire += `</ul></p>`
|
||||
}
|
||||
if (stageSummary.competences) {
|
||||
histoire += `<p><strong>Compétences : </strong><ul>`
|
||||
for (let compName in stageSummary.competences) {
|
||||
histoire += `<li>${TeDeumUtility.upperFirst(compName)} +1</li>`
|
||||
}
|
||||
histoire += `</ul></p>`
|
||||
}
|
||||
let questions = this.suiviReponses.filter( r => r.key === key)
|
||||
if (questions.length > 0) {
|
||||
histoire += `<p><strong>Réponses au questionnaire : </strong><ul>`
|
||||
for (let question of questions) {
|
||||
histoire += `<li>${question.question} : <i>${question.reponse}</i> (${TeDeumUtility.upperFirst(question.compName)}+1)</li>`
|
||||
}
|
||||
histoire += `</ul></p>`
|
||||
}
|
||||
}
|
||||
await actor.update({ "system.histoire": histoire})
|
||||
actor.render(true)
|
||||
@@ -596,7 +640,7 @@ export class TeDeumCharacterCreator {
|
||||
"adresse": { score: actor.getCompetenceScore("Initiative"), label: "Adresse" },
|
||||
}
|
||||
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-finished.hbs", context)
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-finished.hbs", context)
|
||||
const label = "Terminer"
|
||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: context.title },
|
||||
|
||||
@@ -10,12 +10,36 @@ export class TeDeumCombat extends Combat {
|
||||
for (let cId of ids) {
|
||||
const c = this.combatants.get(cId);
|
||||
let initBonus = c.actor ? c.actor.getInitiativeScore(this.id, cId) : -1;
|
||||
console.log("Init Bonus : ", c.name, initBonus)
|
||||
await this.updateEmbeddedDocuments("Combatant", [{ _id: cId, initiative: initBonus }]);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async modifyAction(combatantId, delta, isMainGauche = false) {
|
||||
let combatant = this.combatants.get(combatantId)
|
||||
if (!combatant) return;
|
||||
let ca = combatant.getFlag("world", "available-actions")
|
||||
if (!ca) {
|
||||
ca = { nbActions: 1, nbActionsMainGauche: 0 }
|
||||
}
|
||||
if (isMainGauche) {
|
||||
ca.nbActionsMainGauche += delta
|
||||
} else {
|
||||
ca.nbActions += delta
|
||||
}
|
||||
if (ca.nbActionsMainGauche < 0) ca.nbActionsMainGauche = 0
|
||||
if (ca.nbActions < 0) ca.nbActions = 0
|
||||
console.log("Modify Action : ", combatant.name, ca)
|
||||
if (game.user.isGM) {
|
||||
await TeDeumUtility.updateCombatantActions(combatant, ca)
|
||||
} else {
|
||||
game.socket.emit("system.fvtt-te-deum", { msg: "msg_modify_combat_action", data: { combatantId: combatantId, ca: ca } })
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async checkTurnPosition() {
|
||||
while (game.combat.turn > 0) {
|
||||
|
||||
@@ -15,19 +15,35 @@ export const TEDEUM_CONFIG = {
|
||||
{ value: 10 }, { value: 30 }, { value: 50 }],
|
||||
|
||||
LOCALISATION: {
|
||||
"pieddroit": { label: "Pied Droit", value: 1, locMod: 0, id: "pieddroit", nbArmure: 1, score: { min: 1, max: 1 }, coord: { top: 500, left: 0 } },
|
||||
"jambedroite": { label: "Jambe Droite", value: 1, locMod: -1, id: "jambedroite", nbArmure: 1, score: { min: 3, max: 4 }, coord: { top: 400, left: 100 } },
|
||||
"jambegauche": { label: "Jambe Gauche", value: 1, locMod: -1, id: "jambegauche", nbArmure: 1, score: { min: 5, max: 6 }, coord: { top: 400, left: 300 } },
|
||||
"piedgauche": { label: "Pied Gauche", value: 1, locMod: 0, id: "piedgauche", nbArmure: 1, score: { min: 2, max: 2 }, coord: { top: 500, left: 400 } },
|
||||
"maindroite": { label: "Main Droite", value: 1, locMod: 0, id: "maindroite", nbArmure: 1, score: { min: 7, max: 7 }, coord: { top: 0, left: 0 } },
|
||||
"maingauche": { label: "Main Gauche", value: 1, locMod: 0, id: "maingauche", nbArmure: 1, score: { min: 8, max: 8 }, coord: { top: 0, left: 400 } },
|
||||
"brasdroit": { label: "Bras Droit", value: 1, locMod: -1, id: "brasdroit", nbArmure: 2, score: { min: 9, max: 10 }, coord: { top: 200, left: 0 } },
|
||||
"brasgauche": { label: "Bras Gauche", value: 1, locMod: -1, id: "brasgauche", nbArmure: 2, score: { min: 11, max: 12 }, coord: { top: 200, left: 400 } },
|
||||
"corps": { label: "Corps", value: 1, id: "corps", locMod: -2, nbArmure: 2, score: { min: 13, max: 17 }, coord: { top: 200, left: 200 } },
|
||||
"tete": { label: "Tête", value: 1, id: "tete", locMod: -2, nbArmure: 2, score: { min: 18, max: 20 }, coord: { top: 0, left: 200 } },
|
||||
"pieddroit": { label: "Pied Droit", value: 1, locMod: 0, id: "pieddroit", categorie: "pied", nbArmure: 1, score: { min: 1, max: 1 }, coord: { top: 500, left: 0 } },
|
||||
"jambedroite": { label: "Jambe Droite", value: 1, locMod: -1, id: "jambedroite", categorie: "jambe", nbArmure: 1, score: { min: 3, max: 4 }, coord: { top: 400, left: 100 } },
|
||||
"jambegauche": { label: "Jambe Gauche", value: 1, locMod: -1, id: "jambegauche", categorie: "jambe", nbArmure: 1, score: { min: 5, max: 6 }, coord: { top: 400, left: 300 } },
|
||||
"piedgauche": { label: "Pied Gauche", value: 1, locMod: 0, id: "piedgauche", categorie: "pied", nbArmure: 1, score: { min: 2, max: 2 }, coord: { top: 500, left: 400 } },
|
||||
"maindroite": { label: "Main Droite", value: 1, locMod: 0, id: "maindroite", categorie: "main", nbArmure: 1, score: { min: 7, max: 7 }, coord: { top: 0, left: 0 } },
|
||||
"maingauche": { label: "Main Gauche", value: 1, locMod: 0, id: "maingauche", categorie: "main", nbArmure: 1, score: { min: 8, max: 8 }, coord: { top: 0, left: 400 } },
|
||||
"brasdroit": { label: "Bras Droit", value: 1, locMod: -1, id: "brasdroit", categorie: "bras", nbArmure: 2, score: { min: 9, max: 10 }, coord: { top: 200, left: 0 } },
|
||||
"brasgauche": { label: "Bras Gauche", value: 1, locMod: -1, id: "brasgauche", categorie: "bras", nbArmure: 2, score: { min: 11, max: 12 }, coord: { top: 200, left: 400 } },
|
||||
"corps": { label: "Corps", value: 1, id: "corps", categorie: "corps", locMod: -2, nbArmure: 2, score: { min: 13, max: 17 }, coord: { top: 200, left: 200 } },
|
||||
"tete": { label: "Tête", value: 1, id: "tete", categorie: "tete", locMod: -2, nbArmure: 2, score: { min: 18, max: 20 }, coord: { top: 0, left: 200 } },
|
||||
},
|
||||
|
||||
ATTAQUE_CIBLEES: {
|
||||
"aucune": { label: "Aucune", id: "aucune", locMod: 0, description: "Attaque non ciblée" },
|
||||
"pieddroit": { label: "Pied Droit", id: "pieddroit", locMod: 0, description: "Attaque ciblée sur le pied droit" },
|
||||
"jambedroite": { label: "Jambe Droite", id: "jambedroite", locMod: -1, description: "Attaque ciblée sur la jambe droite" },
|
||||
"jambegauche": { label: "Jambe Gauche", id: "jambegauche", locMod: -1, description: "Attaque ciblée sur la jambe gauche" },
|
||||
"piedgauche": { label: "Pied Gauche", id: "piedgauche", locMod: 0, description: "Attaque ciblée sur le pied gauche" },
|
||||
"maindroite": { label: "Main Droite", id: "maindroite", locMod: 0, description: "Attaque ciblée sur la main droite" },
|
||||
"maingauche": { label: "Main Gauche", id: "maingauche", locMod: 0, description: "Attaque ciblée sur la main gauche" },
|
||||
"brasdroit": { label: "Bras Droit", id: "brasdroit", locMod: -1, description: "Attaque ciblée sur le bras droit" },
|
||||
"brasgauche": { label: "Bras Gauche", id: "brasgauche", locMod: -1, description: "Attaque ciblée sur le bras gauche" },
|
||||
"corps": { label: "Corps", id: "corps", locMod: -2, description: "Attaque ciblée sur le corps" },
|
||||
"tete": { label: "Tête", id: "tete", locMod: -2, description: "Attaque ciblée sur la tête" },
|
||||
},
|
||||
|
||||
ARME_SPECIFICITE: {
|
||||
"poing": { label: "Poings", id: "poing", melee: true, tir: false },
|
||||
"pied": { label: "Pieds", id: "pied", melee: true, tir: false },
|
||||
"encombrante": { label: "Encombrante", id: "encombrante", melee: true, tir: true },
|
||||
"maintiendistance": { label: "Maintien à distance", id: "maintiendistance", melee: true, tir: false },
|
||||
"coupassomant": { label: "Coup assomant", id: "coupassomant", melee: true, tir: false },
|
||||
@@ -43,11 +59,11 @@ export const TEDEUM_CONFIG = {
|
||||
},
|
||||
|
||||
ARME_PORTEES: {
|
||||
"brulepourpoint": { label: "Brûle-pourpoint", difficulty: "facile", id: "brulepourpoint" },
|
||||
"courte": { label: "Courte", difficulty: "pardefaut", id: "courte" },
|
||||
"moyenne": { label: "Moyenne", difficulty: "difficile", id: "moyenne" },
|
||||
"longue": { label: "Longue", difficulty: "perilleux", id: "longue" },
|
||||
"extreme": { label: "Extrême", difficulty: "desespere", id: "extreme" },
|
||||
"brulepourpoint": { label: "Brûle-pourpoint (5)", difficulty: "facile", id: "brulepourpoint" },
|
||||
"courte": { label: "Courte (7)", difficulty: "pardefaut", id: "courte" },
|
||||
"moyenne": { label: "Moyenne (11)", difficulty: "difficile", id: "moyenne" },
|
||||
"longue": { label: "Longue (13)", difficulty: "perilleux", id: "longue" },
|
||||
"extreme": { label: "Extrême (15)", difficulty: "desespere", id: "extreme" },
|
||||
},
|
||||
|
||||
genre: {
|
||||
@@ -102,10 +118,10 @@ export const TEDEUM_CONFIG = {
|
||||
adresse: { id: "adresse", value: "adresse", label: "Adresse", description: "Cette caractéristique correspond à la rapidité et la dextérité du personnage. Elle livre le nombre d'actions qu'un personnage peut accomplir en un tour de combat et permet d'évaluer les compétences de base Initiative & Course." },
|
||||
},
|
||||
allonges: {
|
||||
courte: { courte: { malus: 0 }, moyenne: { malus: -1 }, longue: { malus: -2 }, treslongue: { malus: 0, esquive: 2 } },
|
||||
moyenne: { courte: { malus: 0 }, moyenne: { malus: 0 }, longue: { malus: -1 }, treslongue: { malus: 0, esquive: 2 } },
|
||||
longue: { courte: { malus: -2 }, moyenne: { malus: -1 }, longue: { malus: 0 }, treslongue: { malus: -1, esquive: 1 } },
|
||||
treslongue: { courte: { malus: 0, esquive: 2 }, moyenne: { malus: 0, esquive: 2 }, longue: { malus: 0, esquive: 1 }, treslongue: { malus: 0 } },
|
||||
courte: { courte: { label: "Courte (0)", malus: 0 }, moyenne: { label: "Moyenne (-1)", malus: -1 }, longue: { label: "Longue (-2)", malus: -2 }, treslongue: { label: "Très longue (0, 2 Esquives)", malus: 0, esquive: 2 } },
|
||||
moyenne: { courte: { label: "Courte (0)", malus: 0 }, moyenne: { label: "Moyenne (0)", malus: 0 }, longue: { label: "Longue (-1)", malus: -1 }, treslongue: { label: "Très longue (0, 2 Esquives)", malus: 0, esquive: 2 } },
|
||||
longue: { courte: { label: "Courte (-2)", malus: -2 }, moyenne: { label: "Moyenne (-1)", malus: -1 }, longue: { label: "Longue (0)", malus: 0 }, treslongue: { label: "Très longue (-1, 2 Esquives)", malus: -1, esquive: 1 } },
|
||||
treslongue: { courte: { label: "Courte (0, 2 Esquives)", malus: 0, esquive: 2 }, moyenne: { label: "Moyenne (0, 2 Esquives)", malus: 0, esquive: 2 }, longue: { label: "Longue (0, 1 Esquive)", malus: 0, esquive: 1 }, treslongue: { label: "Très longue (0)", malus: 0 } },
|
||||
},
|
||||
providence: [
|
||||
{ labelM: "Brebis égarée", labelF: "Brebis égarée", value: 0, diceValue: "0" },
|
||||
@@ -152,13 +168,13 @@ export const TEDEUM_CONFIG = {
|
||||
},
|
||||
difficulte: {
|
||||
aucune: { label: "Aucune", key: "aucune", value: 0 },
|
||||
routine: { label: "Routine", key: "routine", value: 3 },
|
||||
facile: { label: "Facile", key: "facile", value: 5 },
|
||||
pardefaut: { label: "Par Défaut", key: "pardefaut", value: 7 },
|
||||
malaise: { label: "Malaisé", key: "malaise", value: 9 },
|
||||
difficile: { label: "Difficile", key: "difficile", value: 11 },
|
||||
perilleux: { label: "Perilleux", key: "perilleux", value: 13 },
|
||||
desespere: { label: "Désespéré", key: "desespere", value: 15 }
|
||||
routine: { label: "Routine (3)", key: "routine", value: 3 },
|
||||
facile: { label: "Facile (5)", key: "facile", value: 5 },
|
||||
pardefaut: { label: "Par Défaut (7)", key: "pardefaut", value: 7 },
|
||||
malaise: { label: "Malaisé (9)", key: "malaise", value: 9 },
|
||||
difficile: { label: "Difficile (11)", key: "difficile", value: 11 },
|
||||
perilleux: { label: "Perilleux (13)", key: "perilleux", value: 13 },
|
||||
desespere: { label: "Désespéré (15)", key: "desespere", value: 15 }
|
||||
},
|
||||
monnaie: {
|
||||
denier: { label: "Deniers", id: "denier", value: 1 },
|
||||
@@ -195,13 +211,14 @@ export const TEDEUM_CONFIG = {
|
||||
{ value: "1", label: "+1 niveau" },
|
||||
{ value: "2", label: "+2 niveaux" }
|
||||
],
|
||||
blessuresOrder: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet", "tuenet", "tuenet", "tuenet", "tuenet"],
|
||||
blessures: {
|
||||
indemne: { value: 0, label: "Indemne", key: "indemne", degatsMax: -1, count: 0, modifier: 0 },
|
||||
estafilade: { value: 1, label: "Estafilade", key: "estafilade", degatsMin: 0, degatsMax: 2, count: 1, modifier: 0 },
|
||||
plaie: { value: 2, label: "Plaie", key: "plaie", degatsMin: 3, degatsMax: 4, count: 1, modifier: -1 },
|
||||
plaiebeante: { value: 3, label: "Plaie béante", key: "plaiebeante", degatsMin: 5, degatsMax: 6, count: 1, modifier: -2 },
|
||||
plaieatroce: { value: 4, label: "Plaie atroce", key: "plaieatroce", degatsMin: 7, degatsMax: 8, count: 1, horsCombat: true, modifier: -12 },
|
||||
tunenet: { value: 5, label: "Tué net", key: "tuenet", degatsMin: 9, degatsMax: 100, count: 1, horsCombat: true, mort: true, modifier: -12 }
|
||||
tuenet: { value: 5, label: "Tué net", key: "tuenet", degatsMin: 9, degatsMax: 100, count: 1, horsCombat: true, mort: true, modifier: -100 }
|
||||
},
|
||||
virulence: {
|
||||
aucune: { label: "Aucune", value: "aucune", modifier: 0 },
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
const ECRYME_WELCOME_MESSAGE_URL = "https://www.uberwald.me/gitea/public/fvtt-te-deum/raw/branch/main/welcome-message-tedeum.html"
|
||||
|
||||
export class TeDeumUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -12,22 +14,68 @@ export class TeDeumUtility {
|
||||
CONFIG.JournalEntry.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
||||
CONFIG.Macro.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
||||
CONFIG.Adventure.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
||||
}
|
||||
|
||||
Hooks.on('renderChatLog', (log, html, data) => TeDeumUtility.chatListeners(html));
|
||||
static installHooks() {
|
||||
Hooks.on('renderChatMessageHTML', (message, html) => {
|
||||
TeDeumUtility.chatListeners(html);
|
||||
TeDeumUtility.onRenderChatMessage(message, html);
|
||||
});
|
||||
|
||||
Hooks.on("renderActorDirectory", (app, html, data) => {
|
||||
if (game.user.can('ACTOR_CREATE')) {
|
||||
const button = document.createElement('button');
|
||||
button.style.width = '90%';
|
||||
button.style.width = '60%';
|
||||
button.classList.add('tedeum-create-character');
|
||||
button.innerHTML = 'Créer un Personnage'
|
||||
button.addEventListener('click', () => {
|
||||
let cr = new game.system.tedeum.TeDeumCharacterCreator();
|
||||
cr.init()
|
||||
})
|
||||
html.find('.header-actions').after(button)
|
||||
$(html).find('.header-actions').after(button)
|
||||
}
|
||||
})
|
||||
//Hooks.on("getChatLogEntryContext", (html, options) => TeDeumUtility.chatMenuManager(html, options));
|
||||
|
||||
Hooks.on("combatStart", async (combat, updateData, options) => {
|
||||
this.resetCombatActions(combat)
|
||||
});
|
||||
|
||||
Hooks.on("combatRound", (combat, updateData, updateOptions) => {
|
||||
// List all actors related to combatant
|
||||
if (game.user.isGM) {
|
||||
this.resetCombatActions(combat)
|
||||
}
|
||||
})
|
||||
|
||||
Hooks.on("getCombatTrackerContextOptions", (html, options) => {
|
||||
console.log("Get Combat Tracker Context", html, options)
|
||||
this.pushCombatOptions(html, options);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static pushCombatOptions(html, options) {
|
||||
options.push({ name: "Actions +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1); } })
|
||||
options.push({ name: "Actions -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1); } })
|
||||
options.push({ name: "Actions MG +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1, true); } })
|
||||
options.push({ name: "Actions MG -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1, true); } })
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async resetCombatActions(combat) {
|
||||
if (game.user.isGM) {
|
||||
for (let c of combat.combatants) {
|
||||
let actor = game.actors.get(c.actorId)
|
||||
if (actor) {
|
||||
let nbActions = actor.getNbActions()?.value || 0
|
||||
let isMainGauche = (actor.getCompetenceScore("Main gauche") > 0)
|
||||
let nbActionsMainGauche = isMainGauche ? nbActions : 0
|
||||
await c.setFlag("world", "available-actions", { nbActions, nbActionsMainGauche })
|
||||
await c.update({ name: `${c.token.name} (${nbActions} / ${nbActionsMainGauche})` })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -99,6 +147,14 @@ export class TeDeumUtility {
|
||||
}
|
||||
return value
|
||||
})
|
||||
// Handle v12 removal of this helper
|
||||
Handlebars.registerHelper('select', function (selected, options) {
|
||||
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
|
||||
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
|
||||
const html = options.fn(this);
|
||||
return html.replace(rgx, "$& selected");
|
||||
});
|
||||
|
||||
|
||||
// Load compendium data
|
||||
const competences = await TeDeumUtility.loadCompendium("fvtt-te-deum.competences")
|
||||
@@ -126,14 +182,24 @@ export class TeDeumUtility {
|
||||
/* -------------------------------------------- */
|
||||
static welcomeMessage() {
|
||||
if (game.user.isGM) {
|
||||
// Try to fetch the welcome message from the github repo "welcome-message-ecryme.html"
|
||||
fetch(ECRYME_WELCOME_MESSAGE_URL)
|
||||
.then(response => response.text())
|
||||
.then(html => {
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
whisper: [game.user.id],
|
||||
content: `<div id="chat-welcome welcome-message-tedeum"><span class="rdd-roll-part">
|
||||
<strong>Bienvenu dans Te Deum Pour Un Massacre !</strong>
|
||||
<div class="chat-welcome">Ce système vous est proposé par Open Sesame Games.<br>
|
||||
Vous trouverez de l'aide dans @UUID[Compendium.fvtt-te-deum.aides.JournalEntry.uNwJgi4kXBCiZmAH]{Aide pour Te Deum}<br>
|
||||
ainsi que sur le Discord de Foundry FR : https://discord.gg/pPSDNJk</div>` });
|
||||
content: html
|
||||
});
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error fetching welcome message:", error);
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
whisper: [game.user.id],
|
||||
content: "<b>Bienvenue dans Ecryme RPG !</b><br>Visitez le site officiel pour plus d'informations."
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,7 +266,7 @@ export class TeDeumUtility {
|
||||
return actor
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */ /* -------------------------------------------- */
|
||||
/* -------------------------------------------- */
|
||||
static async manageOpposition(rollData) {
|
||||
if (!this.currentOpposition) {
|
||||
// Store rollData as current GM opposition
|
||||
@@ -209,39 +275,76 @@ export class TeDeumUtility {
|
||||
} else {
|
||||
// Perform the opposition
|
||||
let isAttackWinner = true
|
||||
let rWinner = this.currentOpposition
|
||||
let rLooser = rollData
|
||||
if (rWinner.total < rLooser.total) {
|
||||
rWinner = rollData
|
||||
rLooser = this.currentOpposition
|
||||
let rWinner, rLooser
|
||||
if (this.currentOpposition.total <= rollData.total) {
|
||||
rWinner = foundry.utils.duplicate(rollData)
|
||||
rLooser = foundry.utils.duplicate(this.currentOpposition)
|
||||
isAttackWinner = false
|
||||
} else {
|
||||
rWinner = foundry.utils.duplicate(this.currentOpposition)
|
||||
rLooser = foundry.utils.duplicate(rollData)
|
||||
isAttackWinner = true
|
||||
}
|
||||
this.currentOpposition = undefined // Reset opposition
|
||||
let oppositionData = {
|
||||
winner: rWinner,
|
||||
looser: rLooser
|
||||
}
|
||||
// Update difficulty
|
||||
rWinner.difficulty = rLooser.total
|
||||
rLooser.difficulty = rWinner.total
|
||||
await this.computeResults(rWinner)
|
||||
await this.computeResults(rLooser)
|
||||
// Auto XP management when opposed
|
||||
if (rWinner.isReussiteCritique) {
|
||||
let actor = this.getActorFromRollData(rWinner)
|
||||
actor.modifyXP(rWinner.carac.key, 1)
|
||||
}
|
||||
if (rLooser.isEchecCritique) {
|
||||
let actor = this.getActorFromRollData(rLooser)
|
||||
actor.modifyXP(rLooser.carac.key, 1)
|
||||
}
|
||||
|
||||
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-opposition-result.hbs`, oppositionData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-opposition-result.hbs`, oppositionData)
|
||||
})
|
||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||
|
||||
// Si le gagnant est l'attaquant, appliquer les dégats sur la victime
|
||||
if (isAttackWinner && rWinner.isSuccess && rWinner.mode == "arme" && rWinner.arme?.system.typeArme == "melee" && rWinner.defenderTokenId) {
|
||||
this.appliquerDegats(rWinner)
|
||||
await this.appliquerDegats(rWinner)
|
||||
}
|
||||
|
||||
console.log("Rolldata result", rollData)
|
||||
console.log("Opposition result", rollData, isAttackWinner, oppositionData)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */ /* -------------------------------------------- */
|
||||
/* -------------------------------------------- */
|
||||
static getTokenActorFromId(tokenId) {
|
||||
for (let scene of game.scenes) {
|
||||
const tokenDoc = scene.tokens.get(tokenId)
|
||||
if (tokenDoc) return tokenDoc.actor
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async appliquerDegats(rollData) {
|
||||
await this.processAttaqueMelee(rollData)
|
||||
let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId)
|
||||
if (defenderToken) {
|
||||
let actor = defenderToken.actor
|
||||
await actor.appliquerDegats(rollData)
|
||||
let defenderActor = this.getTokenActorFromId(rollData.defenderTokenId)
|
||||
if (defenderActor) {
|
||||
if (game.user.isGM || defenderActor.isOwner) {
|
||||
await defenderActor.appliquerDegats(rollData)
|
||||
} else {
|
||||
// Send a socket message — seul le premier MJ actif le traitera
|
||||
game.socket.emit("system.fvtt-te-deum", { name: "msg_apply_damage", data: { rollData } });
|
||||
}
|
||||
// Attaque naturelle avec dégats inférieur à -2
|
||||
if ((rollData?.arme?.system.specificites?.poing?.hasSpec || rollData?.arme?.system.specificites?.pied?.hasSpec) && rollData.degats < -2) {
|
||||
let attacker = this.getActorFromRollData(rollData)
|
||||
attacker.appliquerBlessure("estafilade", "maindroite", "Contusion suite à une attaque naturelle")
|
||||
ui.notifications.info(`${attacker.name} subit 1 contusion en infligeant ${rollData.degats} dégâts à mains nues`)
|
||||
}
|
||||
} else {
|
||||
ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué")
|
||||
}
|
||||
@@ -250,7 +353,7 @@ export class TeDeumUtility {
|
||||
/* -------------------------------------------- */ /* -------------------------------------------- */
|
||||
static async chatListeners(html) {
|
||||
|
||||
html.on("click", '.chat-command-opposition', event => {
|
||||
$(html).on("click", '.chat-command-opposition', event => {
|
||||
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
let rollData = message.getFlag("world", "te-deum-rolldata")
|
||||
@@ -258,7 +361,7 @@ export class TeDeumUtility {
|
||||
TeDeumUtility.manageOpposition(rollData, messageId)
|
||||
}
|
||||
})
|
||||
html.on("click", '.chat-command-appliquer-degats', event => {
|
||||
$(html).on("click", '.chat-command-appliquer-degats', event => {
|
||||
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
let rollData = message.getFlag("world", "te-deum-rolldata")
|
||||
@@ -266,6 +369,25 @@ export class TeDeumUtility {
|
||||
TeDeumUtility.appliquerDegats(rollData, messageId)
|
||||
}
|
||||
})
|
||||
$(html).on("click", '.chat-command-gain-xp', async event => {
|
||||
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
let rollData = message.getFlag("world", "te-deum-rolldata")
|
||||
if (rollData) {
|
||||
let actor = TeDeumUtility.getActorFromRollData(rollData)
|
||||
actor.modifyXP(rollData.carac.key, 1)
|
||||
event.currentTarget.style.display = 'none'; // feedback immédiat local
|
||||
await message.setFlag("world", "te-deum-xp-used", true) // sync tous les clients
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static onRenderChatMessage(message, html) {
|
||||
if (message.getFlag("world", "te-deum-xp-used")) {
|
||||
const btn = html.querySelector('.chat-command-gain-xp');
|
||||
if (btn) btn.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -275,9 +397,19 @@ export class TeDeumUtility {
|
||||
'systems/fvtt-te-deum/templates/actors/editor-notes-gm.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/partial-item-nav.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/partial-item-description.hbs',
|
||||
'systems/fvtt-te-deum/templates/dialogs/partial-creator-status.hbs'
|
||||
'systems/fvtt-te-deum/templates/dialogs/partial-creator-status.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-arme-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-armure-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-blessure-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-competence-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-education-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-equipement-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-grace-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-maladie-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-origine-sheet.hbs',
|
||||
'systems/fvtt-te-deum/templates/items/item-simple-sheet.hbs',
|
||||
]
|
||||
return loadTemplates(templatePaths);
|
||||
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -354,12 +486,34 @@ export class TeDeumUtility {
|
||||
let rollData = msg.data.rollData
|
||||
if (game.user.isGM) {
|
||||
let chatMsg = await this.createChatMessage(rollData.alias, "blindroll", {
|
||||
content: await renderTemplate(msg.data.template, rollData),
|
||||
content: await foundry.applications.handlebars.renderTemplate(msg.data.template, rollData),
|
||||
whisper: game.user.id
|
||||
})
|
||||
chatMsg.setFlag("world", "tedeum-rolldata", rollData)
|
||||
}
|
||||
}
|
||||
if (msg.name == "msg_modify_combat_action") {
|
||||
if (game.user.isGM) {
|
||||
let { combatantId, ca } = msg.data
|
||||
let combatant = game.combat.combatants.get(combatantId)
|
||||
if (combatant) {
|
||||
console.log("sock - Modify Combat Action : ", combatant.name, ca)
|
||||
await TeDeumUtility.updateCombatantActions(combatant, ca)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (msg.name == "msg_apply_damage") {
|
||||
const firstGM = game.users.find(u => u.isGM && u.active)
|
||||
if (game.user === firstGM) {
|
||||
let rollData = msg.data.rollData
|
||||
let defenderActor = TeDeumUtility.getTokenActorFromId(rollData.defenderTokenId)
|
||||
if (defenderActor) {
|
||||
await defenderActor.appliquerDegats(rollData)
|
||||
} else {
|
||||
ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -445,9 +599,11 @@ export class TeDeumUtility {
|
||||
}
|
||||
if (rollData.diceSum == 1) {
|
||||
let critiqueRoll = await new Roll(rollData.carac.negativeDice)
|
||||
rollData.isSuccess = false
|
||||
await critiqueRoll.evaluate()
|
||||
await this.showDiceSoNice(critiqueRoll, game.settings.get("core", "rollMode"))
|
||||
rollData.critiqueRoll = foundry.utils.duplicate(critiqueRoll)
|
||||
rollData.critiqueTotal = critiqueRoll.total
|
||||
if (critiqueRoll.total > rollData.competence.system.score) {
|
||||
rollData.isEchecCritique = true
|
||||
}
|
||||
@@ -476,9 +632,18 @@ export class TeDeumUtility {
|
||||
if (rollData.isMouvement) {
|
||||
localModifier -= 1
|
||||
}
|
||||
if (rollData.arme && rollData.allongeId) {
|
||||
localModifier += rollData.allonges[rollData.allongeId].malus
|
||||
rollData.allongeMalus = rollData.allonges[rollData.allongeId].malus
|
||||
rollData.nbEsquives = rollData.allonges[rollData.allongeId]?.esquive || 0
|
||||
}
|
||||
if (rollData.attaqueCiblee && rollData.attaqueCiblee != "aucune") {
|
||||
localModifier -= 1
|
||||
rollData.loc = foundry.utils.duplicate(game.system.tedeum.config.LOCALISATION[rollData.attaqueCiblee])
|
||||
}
|
||||
let diceBase = this.modifyDice(rollData.carac.dice, localModifier + Number(rollData.bonusMalus) + rollData.santeModifier)
|
||||
if (!diceBase) return;
|
||||
diceFormula = diceBase + "x + " + rollData.competence.system.score
|
||||
diceFormula = diceBase + "x + " + rollData.compScore
|
||||
}
|
||||
if (rollData.enableProvidence) {
|
||||
diceFormula += " + " + rollData.providence.dice
|
||||
@@ -488,9 +653,12 @@ export class TeDeumUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async getLocalisation(rollData) {
|
||||
let locRoll = await new Roll("1d20").roll()
|
||||
let locRoll
|
||||
if (rollData.loc) {
|
||||
locRoll = await new Roll(String(rollData.loc.score.min)).roll()
|
||||
} else {
|
||||
locRoll = await new Roll("1d20").roll()
|
||||
await this.showDiceSoNice(locRoll, game.settings.get("core", "rollMode"))
|
||||
rollData.locRoll = foundry.utils.duplicate(locRoll)
|
||||
for (let key in game.system.tedeum.config.LOCALISATION) {
|
||||
let loc = game.system.tedeum.config.LOCALISATION[key]
|
||||
if (locRoll.total >= loc.score.min && locRoll.total <= loc.score.max) {
|
||||
@@ -499,13 +667,16 @@ export class TeDeumUtility {
|
||||
}
|
||||
}
|
||||
}
|
||||
rollData.locRoll = foundry.utils.duplicate(locRoll)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async processAttaqueMelee(rollData) {
|
||||
await this.getLocalisation(rollData)
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
let bDegats = actor.getBonusDegats()
|
||||
let degatsRoll = await new Roll(rollData.arme.system.degats + "+" + bDegats.value).roll()
|
||||
let bDegats = actor.getAttaqueBonusDegats(rollData)
|
||||
rollData.degatsFormula = rollData.arme.system.degats + "+" + bDegats
|
||||
let degatsRoll = await new Roll(rollData.degatsFormula).roll()
|
||||
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
|
||||
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
|
||||
rollData.degats = degatsRoll.total
|
||||
@@ -521,12 +692,51 @@ export class TeDeumUtility {
|
||||
await this.getLocalisation(rollData)
|
||||
// Now the degats
|
||||
let degatsRoll = await new Roll(rollData.arme.system.degats).roll()
|
||||
await this.showDiceSoNice(rollData.locRoll, game.settings.get("core", "rollMode"))
|
||||
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
|
||||
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
|
||||
rollData.degats = degatsRoll.total
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async updateCombatantActions(combatant, ca) {
|
||||
await combatant.setFlag("world", "available-actions", ca)
|
||||
await combatant.update({ name: `${combatant.token.name} (${ca.nbActions} / ${ca.nbActionsMainGauche})` })
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async manageCombatActions(actor, rollData) {
|
||||
let combat = game.combats.active
|
||||
if (!combat) return;
|
||||
let combatant = combat.getCombatantByActor(actor)
|
||||
if (!combatant) return;
|
||||
let ca = combatant.getFlag("world", "available-actions")
|
||||
if (!ca) return;
|
||||
if (rollData.mode == "arme" && rollData.isMainGauche) {
|
||||
if (ca.nbActionsMainGauche > 0) {
|
||||
ca.nbActionsMainGauche -= 1
|
||||
ca.nbActions = Math.max(ca.nbActions - 1, 0)
|
||||
} else {
|
||||
ui.notifications.error(`${actor.name} n'a plus d'actions disponibles à la main gauche pour ce round`)
|
||||
}
|
||||
}
|
||||
if (ca.nbActions > 0) {
|
||||
ca.nbActions -= 1
|
||||
} else {
|
||||
ui.notifications.error(`${actor.name} n'a plus d'actions disponibles pour ce round`)
|
||||
}
|
||||
console.log("Manage combat actions 1", actor.name, combatant)
|
||||
if (game.user.isGM) {
|
||||
await this.updateCombatantActions(combatant, ca)
|
||||
} else {
|
||||
// Send a socket message
|
||||
game.socket.emit("system.fvtt-te-deum", { name: "msg_modify_combat_action", data: { combatantId: combatant.id, ca } });
|
||||
}
|
||||
rollData.hasActions = true
|
||||
rollData.remainingActions = ca.nbActions
|
||||
rollData.remainingActionsMainGauche = ca.nbActionsMainGauche
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async rollTeDeum(rollData) {
|
||||
|
||||
@@ -536,6 +746,18 @@ export class TeDeumUtility {
|
||||
rollData.difficulty = "pardefaut"
|
||||
}
|
||||
rollData.difficulty = game.system.tedeum.config.difficulte[rollData.difficulty].value
|
||||
|
||||
// Compute the real competence score
|
||||
if (rollData.competence) {
|
||||
if (rollData.isMainGauche) {
|
||||
rollData.competence = actor.getMeilleureCompetenceMainGauche(rollData.competence)
|
||||
}
|
||||
if (rollData.competence.system.isBase) {
|
||||
rollData.compScore = actor.system.caracteristiques[rollData.competence.system.caracteristique].value
|
||||
} else {
|
||||
rollData.compScore = rollData.competence.system.score
|
||||
}
|
||||
}
|
||||
let diceFormula = this.computeRollFormula(rollData, actor)
|
||||
if (!diceFormula) return;
|
||||
console.log("RollData", rollData, diceFormula)
|
||||
@@ -552,8 +774,10 @@ export class TeDeumUtility {
|
||||
|
||||
await this.processAttaqueDistance(rollData)
|
||||
|
||||
await this.manageCombatActions(actor, rollData)
|
||||
|
||||
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData)
|
||||
})
|
||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||
console.log("Rolldata result", rollData)
|
||||
@@ -562,10 +786,6 @@ export class TeDeumUtility {
|
||||
if (rollData.enableProvidence) {
|
||||
actor.modifyProvidence(-1)
|
||||
}
|
||||
// Manage XP
|
||||
if (rollData.isReussiteCritique || rollData.isEchecCritique) {
|
||||
actor.modifyXP(rollData.carac.key, 1)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -683,7 +903,7 @@ export class TeDeumUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async confirmDelete(actorSheet, li) {
|
||||
let itemId = li.data("item-id");
|
||||
let itemId = li.dataset ? li.dataset.itemId : li.data("item-id");
|
||||
let msgTxt = "<p>Etes vous certain de supprimer cet item ?";
|
||||
let buttons = {
|
||||
delete: {
|
||||
@@ -691,7 +911,12 @@ export class TeDeumUtility {
|
||||
label: "Oui, aucun souci",
|
||||
callback: () => {
|
||||
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
||||
if (li.slideUp) {
|
||||
li.slideUp(200, () => actorSheet.render(false));
|
||||
} else {
|
||||
li.style.display = "none";
|
||||
actorSheet.render(false);
|
||||
}
|
||||
}
|
||||
},
|
||||
cancel: {
|
||||
|
||||
@@ -37,7 +37,7 @@ export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
|
||||
schema.competenceRecharge = new fields.StringField({ required: false, choices: ["aucune", "archerie", "arquebusade"], initial: "aucune", blank: true });
|
||||
schema.valeurEchecCritique = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 });
|
||||
|
||||
schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 });
|
||||
schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0 });
|
||||
|
||||
schema.degats = new fields.StringField({ required: false, blank: true, initial: "0" });
|
||||
schema.degatscrosse = new fields.StringField({ required: false, blank: true, initial: "0" });
|
||||
|
||||
@@ -5,6 +5,7 @@ export class TeDeumBlessureSchema extends foundry.abstract.TypeDataModel {
|
||||
const schema = {};
|
||||
|
||||
schema.typeBlessure = new fields.StringField({ required: true, choices: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet"], initial: "estafilade" });
|
||||
schema.value = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.localisation = new fields.StringField({ required: true, choices: ["piedgauche", "pieddroit", "jambegauche", "jambedroite", "maingauche", "maindroite", "brasgauche", "brasdroit", "tete", "corps"], initial: "corps" });
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, blank: true });
|
||||
|
||||
@@ -51,7 +51,7 @@ export class TeDeumEducationSchema extends foundry.abstract.TypeDataModel {
|
||||
reponse: new fields.StringField({ required: true, blank: true, initial: "" }),
|
||||
compName: new fields.StringField({ required: true, blank: true, initial: "" }),
|
||||
toSelect: new fields.BooleanField({ initial: false }),
|
||||
compList: new fields.SchemaField(Array.fromRange(10, 1).reduce((comps, i) => {
|
||||
compList: new fields.SchemaField(Array.fromRange(16, 1).reduce((comps, i) => {
|
||||
comps[`comp${i}`] = new fields.SchemaField({
|
||||
compName: new fields.StringField({ required: true, blank: true, initial: "" }),
|
||||
});
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
export class TeDeumMaladieSchema extends foundry.abstract.TypeDataModel {
|
||||
export class TeDeumSimpleSchema extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
const requiredInteger = { required: true, nullable: false, integer: true };
|
||||
const requiredDouble = { required: true, nullable: false, integer: false };
|
||||
const schema = {};
|
||||
|
||||
schema.difficulteEndurance = new fields.StringField({required:true, initial:"aucun"});
|
||||
|
||||
@@ -1,87 +1,103 @@
|
||||
import { TeDeumUtility } from "../common/tedeum-utility.js";
|
||||
|
||||
export class TeDeumRollDialog extends Dialog {
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class TeDeumRollDialog extends HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2) {
|
||||
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["fvtt-te-deum", "te-deum-roll-dialog"],
|
||||
window: { title: "Lancer !", resizable: false },
|
||||
position: { width: 540 },
|
||||
actions: {
|
||||
roll: TeDeumRollDialog.#onRoll,
|
||||
cancel: TeDeumRollDialog.#onCancel,
|
||||
}
|
||||
}
|
||||
|
||||
static PARTS = {
|
||||
content: { template: "systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs" }
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
constructor(actor, rollData, options = {}) {
|
||||
super(options)
|
||||
this.actor = actor
|
||||
this.rollData = rollData
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async create(actor, rollData) {
|
||||
|
||||
let options = { classes: ["tedeum-roll-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
|
||||
let html = await renderTemplate('systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs', rollData);
|
||||
return new TeDeumRollDialog(actor, rollData, html, options);
|
||||
const dialog = new TeDeumRollDialog(actor, rollData)
|
||||
dialog.render(true)
|
||||
return dialog
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
constructor(actor, rollData, html, options, close = undefined) {
|
||||
let conf = {
|
||||
title: "Lancer !",
|
||||
content: html,
|
||||
buttons: {
|
||||
roll: {
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Lancer",
|
||||
callback: () => { this.roll() }
|
||||
},
|
||||
cancel: {
|
||||
icon: '<i class="fas fa-times"></i>',
|
||||
label: "Annuler",
|
||||
callback: () => { this.close() }
|
||||
}
|
||||
},
|
||||
close: close
|
||||
}
|
||||
|
||||
super(conf, options);
|
||||
|
||||
this.actor = actor;
|
||||
this.rollData = rollData;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
roll() {
|
||||
TeDeumUtility.rollTeDeum(this.rollData)
|
||||
async _prepareContext() {
|
||||
return { ...this.rollData }
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async refreshDialog() {
|
||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs", this.rollData)
|
||||
this.data.content = content
|
||||
this.render(true)
|
||||
this.render()
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
let dialog = this;
|
||||
function onLoad() {
|
||||
static #onRoll(event, target) {
|
||||
TeDeumUtility.rollTeDeum(this.rollData)
|
||||
this.close()
|
||||
}
|
||||
$(function () { onLoad(); });
|
||||
|
||||
html.find('#bonusMalusPerso').change((event) => {
|
||||
/* -------------------------------------------- */
|
||||
static #onCancel(event, target) {
|
||||
this.close()
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_onRender(context, options) {
|
||||
super._onRender(context, options)
|
||||
|
||||
const html = this.element
|
||||
|
||||
html.querySelector('#bonusMalusPerso')?.addEventListener('change', (event) => {
|
||||
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
|
||||
})
|
||||
html.find('#roll-difficulty').change((event) => {
|
||||
html.querySelector('#roll-allonge')?.addEventListener('change', (event) => {
|
||||
this.rollData.allongeId = event.currentTarget.value
|
||||
})
|
||||
html.querySelector('#roll-main-gauche')?.addEventListener('change', (event) => {
|
||||
this.rollData.isMainGauche = event.currentTarget.checked
|
||||
})
|
||||
html.querySelector('#roll-difficulty')?.addEventListener('change', (event) => {
|
||||
this.rollData.difficulty = String(event.currentTarget.value) || "pardefaut"
|
||||
})
|
||||
html.find('#roll-bonus-malus').change((event) => {
|
||||
html.querySelector('#roll-attaque-ciblee')?.addEventListener('change', (event) => {
|
||||
this.rollData.attaqueCiblee = event.currentTarget.value || "0"
|
||||
})
|
||||
html.querySelector('#roll-bonus-malus')?.addEventListener('change', (event) => {
|
||||
this.rollData.bonusMalus = event.currentTarget.value || "0"
|
||||
})
|
||||
html.find('#roll-enable-providence').change((event) => {
|
||||
html.querySelector('#roll-enable-providence')?.addEventListener('change', (event) => {
|
||||
this.rollData.enableProvidence = event.currentTarget.checked
|
||||
})
|
||||
html.find('#roll-portee-tir').change((event) => {
|
||||
html.querySelector('#roll-portee-tir')?.addEventListener('change', (event) => {
|
||||
this.rollData.porteeTir = event.currentTarget.value
|
||||
this.rollData.difficulty = game.system.tedeum.config.ARME_PORTEES[this.rollData.porteeTir].difficulty
|
||||
this.rollData.porteeLabel = game.system.tedeum.config.ARME_PORTEES[this.rollData.porteeTir].label
|
||||
this.refreshDialog()
|
||||
})
|
||||
html.find('#roll-tir-viser').change((event) => {
|
||||
html.querySelector('#roll-tir-viser')?.addEventListener('change', (event) => {
|
||||
this.rollData.isViser = event.currentTarget.checked
|
||||
})
|
||||
html.find('#roll-tir-mouvement').change((event) => {
|
||||
html.querySelector('#roll-tir-mouvement')?.addEventListener('change', (event) => {
|
||||
this.rollData.isMouvement = event.currentTarget.checked
|
||||
})
|
||||
|
||||
|
||||
|
||||
html.querySelector('#roll-charge-a-pied')?.addEventListener('change', (event) => {
|
||||
this.rollData.isChargeAPied = event.currentTarget.checked
|
||||
})
|
||||
html.querySelector('#roll-charge-a-cheval')?.addEventListener('change', (event) => {
|
||||
this.rollData.isChargeACheval = event.currentTarget.checked
|
||||
})
|
||||
}
|
||||
}
|
||||
+118
-137
@@ -1,173 +1,154 @@
|
||||
import { TeDeumUtility } from "../common/tedeum-utility.js";
|
||||
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||
|
||||
/**
|
||||
* Extend the basic ItemSheet with some very simple modifications
|
||||
* @extends {ItemSheet}
|
||||
* Feuille d'item Te Deum - AppV2
|
||||
*/
|
||||
export class TeDeumItemSheet extends ItemSheet {
|
||||
export class TeDeumItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["fvtt-te-deum", "sheet", "item"],
|
||||
template: "systems/fvtt-te-deum/templates/item-sheet.hbs",
|
||||
dragDrop: [{ dragSelector: null, dropSelector: null }],
|
||||
position: {
|
||||
width: 620,
|
||||
height: 580,
|
||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }]
|
||||
});
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
closeOnSubmit: false,
|
||||
},
|
||||
window: {
|
||||
resizable: true,
|
||||
},
|
||||
actions: {
|
||||
editImage: TeDeumItemSheet.#onEditImage,
|
||||
postItem: TeDeumItemSheet.#onPostItem,
|
||||
deleteSubitem: TeDeumItemSheet.#onDeleteSubitem,
|
||||
viewSubitem: TeDeumItemSheet.#onViewSubitem,
|
||||
},
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_getHeaderButtons() {
|
||||
let buttons = super._getHeaderButtons();
|
||||
// Add "Post to chat" button
|
||||
// We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry!
|
||||
buttons.unshift(
|
||||
{
|
||||
class: "post",
|
||||
icon: "fas fa-comment",
|
||||
onclick: ev => { }
|
||||
})
|
||||
return buttons
|
||||
// Static PARTS pointing to the dynamic wrapper template
|
||||
static PARTS = {
|
||||
sheet: { template: "systems/fvtt-te-deum/templates/items/item-sheet.hbs" },
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
tabGroups = { primary: "description" }
|
||||
|
||||
let formData = {
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const item = this.document
|
||||
const TextEditor = foundry.applications.ux.TextEditor.implementation
|
||||
const enrich = async (val) => val !== undefined ? await TextEditor.enrichHTML(val ?? "", { async: true }) : ""
|
||||
const context = {
|
||||
title: this.title,
|
||||
id: this.id,
|
||||
type: this.object.type,
|
||||
img: this.object.img,
|
||||
name: this.object.name,
|
||||
id: item.id,
|
||||
type: item.type,
|
||||
img: item.img,
|
||||
name: item.name,
|
||||
editable: this.isEditable,
|
||||
cssClass: this.isEditable ? "editable" : "locked",
|
||||
system: foundry.utils.duplicate(this.object.system),
|
||||
system: foundry.utils.duplicate(item.system),
|
||||
systemFields: item.system.schema.fields,
|
||||
config: foundry.utils.duplicate(game.system.tedeum.config),
|
||||
competences: TeDeumUtility.getCompetencesForDropDown(),
|
||||
limited: this.object.limited,
|
||||
options: this.options,
|
||||
owner: this.document.isOwner,
|
||||
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
|
||||
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
|
||||
isGM: game.user.isGM
|
||||
limited: item.limited,
|
||||
owner: item.isOwner,
|
||||
enrichedDescription: await enrich(item.system.description),
|
||||
enrichedTransmission: await enrich(item.system.transmission),
|
||||
enrichedSymptomes: await enrich(item.system.symptomes),
|
||||
enrichedComplications: await enrich(item.system.complications),
|
||||
enrichedVertus: await enrich(item.system.vertus),
|
||||
enrichedToxicite: await enrich(item.system.toxicite),
|
||||
isGM: game.user.isGM,
|
||||
itemPartialName: `systems/fvtt-te-deum/templates/items/item-${item.type}-sheet.hbs`,
|
||||
}
|
||||
|
||||
if (this.object.type == "education") {
|
||||
TeDeumUtility.prepareEducationContent(formData);
|
||||
if (item.type === "education") {
|
||||
TeDeumUtility.prepareEducationContent(context)
|
||||
}
|
||||
|
||||
this.options.editable = !(this.object.origin == "embeddedItem");
|
||||
console.log("ITEM DATA", formData, this);
|
||||
return formData;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_getHeaderButtons() {
|
||||
let buttons = super._getHeaderButtons();
|
||||
buttons.unshift({
|
||||
class: "post",
|
||||
icon: "fas fa-comment",
|
||||
onclick: ev => this.postItem()
|
||||
});
|
||||
return buttons
|
||||
return context
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
postItem() {
|
||||
let chatData = duplicate(this.item)
|
||||
/** @override */
|
||||
_onRender(context, options) {
|
||||
super._onRender(context, options)
|
||||
|
||||
// Tab navigation
|
||||
const nav = this.element.querySelector('nav.tabs[data-group]')
|
||||
if (nav) {
|
||||
const group = nav.dataset.group
|
||||
const activeTab = this.tabGroups[group] || "description"
|
||||
nav.querySelectorAll('[data-tab]').forEach(link => {
|
||||
const tab = link.dataset.tab
|
||||
link.classList.toggle('active', tab === activeTab)
|
||||
link.addEventListener('click', event => {
|
||||
event.preventDefault()
|
||||
this.tabGroups[group] = tab
|
||||
this.render()
|
||||
})
|
||||
})
|
||||
this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach(content => {
|
||||
content.classList.toggle('active', content.dataset.tab === activeTab)
|
||||
})
|
||||
}
|
||||
|
||||
// Ignore Enter key in inputs
|
||||
this.element.addEventListener('keydown', e => {
|
||||
if (e.keyCode === 13 && e.target.tagName !== 'TEXTAREA') e.preventDefault()
|
||||
})
|
||||
}
|
||||
|
||||
// #region Static action handlers
|
||||
|
||||
static async #onEditImage(event, target) {
|
||||
const fp = new FilePicker({
|
||||
type: "image",
|
||||
current: this.document.img,
|
||||
callback: path => this.document.update({ img: path }),
|
||||
})
|
||||
fp.browse()
|
||||
}
|
||||
|
||||
static async #onPostItem(event, target) {
|
||||
const chatData = foundry.utils.duplicate(this.item)
|
||||
if (this.actor) {
|
||||
chatData.actor = { id: this.actor.id };
|
||||
chatData.actor = { id: this.actor.id }
|
||||
}
|
||||
// Don't post any image for the item (which would leave a large gap) if the default image is used
|
||||
if (chatData.img.includes("/blank.png")) {
|
||||
chatData.img = null;
|
||||
if (chatData.img?.includes("/blank.png")) {
|
||||
chatData.img = null
|
||||
}
|
||||
// JSON object for easy creation
|
||||
chatData.jsondata = JSON.stringify(
|
||||
{
|
||||
compendium: "postedItem",
|
||||
payload: chatData,
|
||||
});
|
||||
|
||||
renderTemplate('systems/fvtt-te-deum/templates/post-item.html', chatData).then(html => {
|
||||
let chatOptions = TeDeumUtility.chatDataSetup(html);
|
||||
ChatMessage.create(chatOptions)
|
||||
});
|
||||
chatData.jsondata = JSON.stringify({ compendium: "postedItem", payload: chatData })
|
||||
const html = await foundry.applications.handlebars.renderTemplate(
|
||||
'systems/fvtt-te-deum/templates/post-item.html', chatData
|
||||
)
|
||||
ChatMessage.create(TeDeumUtility.chatDataSetup(html))
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async viewSubitem(ev) {
|
||||
let levelIndex = Number($(ev.currentTarget).parents(".item").data("level-index"))
|
||||
let choiceIndex = Number($(ev.currentTarget).parents(".item").data("choice-index"))
|
||||
let featureId = $(ev.currentTarget).parents(".item").data("feature-id")
|
||||
|
||||
let itemData = this.object.system.levels[levelIndex].choices[choiceIndex].features[featureId]
|
||||
|
||||
if (itemData.name != 'None') {
|
||||
let item = await Item.create(itemData, { temporary: true });
|
||||
item.system.origin = "embeddedItem";
|
||||
new TeDeumItemSheet(item).render(true);
|
||||
static async #onDeleteSubitem(event, target) {
|
||||
const field = target.dataset.type
|
||||
const idx = parseInt(target.dataset.index)
|
||||
const oldArray = this.document.system[field]
|
||||
if (Array.isArray(oldArray) && oldArray[idx]?.name !== 'None') {
|
||||
const newArray = oldArray.filter((_, i) => i !== idx)
|
||||
this.document.update({ [`system.${field}`]: newArray })
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async deleteSubitem(ev) {
|
||||
let field = $(ev.currentTarget).data('type');
|
||||
let idx = Number($(ev.currentTarget).data('index'));
|
||||
let oldArray = this.object.system[field];
|
||||
let itemData = this.object.system[field][idx];
|
||||
if (itemData.name != 'None') {
|
||||
let newArray = [];
|
||||
for (let i = 0; i < oldArray.length; i++) {
|
||||
if (i != idx) {
|
||||
newArray.push(oldArray[i]);
|
||||
}
|
||||
}
|
||||
this.object.update({ [`system.${field}`]: newArray });
|
||||
static async #onViewSubitem(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const levelIndex = parseInt(li?.dataset.levelIndex)
|
||||
const choiceIndex = parseInt(li?.dataset.choiceIndex)
|
||||
const featureId = li?.dataset.featureId
|
||||
const itemData = this.document.system.levels?.[levelIndex]?.choices?.[choiceIndex]?.features?.[featureId]
|
||||
if (itemData?.name !== 'None') {
|
||||
const item = await Item.create(itemData, { temporary: true })
|
||||
item.system.origin = "embeddedItem"
|
||||
new TeDeumItemSheet(item).render(true)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
if (!this.options.editable) return;
|
||||
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
const item = this.object.options.actor.getOwnedItem(li.data("item-id"));
|
||||
item.sheet.render(true);
|
||||
});
|
||||
|
||||
html.find('.delete-subitem').click(ev => {
|
||||
this.deleteSubitem(ev);
|
||||
});
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let itemId = li.data("item-id");
|
||||
let itemType = li.data("item-type");
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
get template() {
|
||||
let type = this.item.type;
|
||||
return `systems/fvtt-te-deum/templates/items/item-${type}-sheet.hbs`
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
_updateObject(event, formData) {
|
||||
return this.object.update(formData)
|
||||
}
|
||||
// #endregion
|
||||
}
|
||||
+10
-6
@@ -21,6 +21,7 @@ import { TeDeumEducationSchema } from "./data/tedeum-schema-education.js";
|
||||
import { TeDeumGraceSchema } from "./data/tedeum-schema-grace.js";
|
||||
import { TeDeumBlessureSchema } from "./data/tedeum-schema-blessure.js";
|
||||
import { TeDeumMaladieSchema } from "./data/tedeum-schema-maladie.js";
|
||||
import { TeDeumSimpleSchema } from "./data/tedeum-schema-simple.js";
|
||||
|
||||
import { TeDeumItem } from "./items/tedeum-item.js";
|
||||
import { TeDeumItemSheet } from "./items/tedeum-item-sheet.js";
|
||||
@@ -78,18 +79,21 @@ Hooks.once("init", async function () {
|
||||
grace: TeDeumGraceSchema,
|
||||
blessure: TeDeumBlessureSchema,
|
||||
maladie: TeDeumMaladieSchema,
|
||||
simple: TeDeumSimpleSchema,
|
||||
};
|
||||
|
||||
console.log("TeDeum RPG | Ready");
|
||||
|
||||
Actors.unregisterSheet("core", ActorSheet);
|
||||
Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pj"], makeDefault: true });
|
||||
Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pnj"], makeDefault: true });
|
||||
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pj"], makeDefault: true });
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pnj"], makeDefault: true });
|
||||
|
||||
Items.unregisterSheet("core", ItemSheet);
|
||||
Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true });
|
||||
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true });
|
||||
|
||||
TeDeumUtility.init()
|
||||
|
||||
TeDeumUtility.installHooks()
|
||||
});
|
||||
|
||||
|
||||
@@ -98,6 +102,7 @@ Hooks.once("init", async function () {
|
||||
/* -------------------------------------------- */
|
||||
Hooks.once("ready", function () {
|
||||
|
||||
|
||||
// User warning
|
||||
if (!game.user.isGM && game.user.character == undefined) {
|
||||
ui.notifications.info("Attention ! Aucun personnage relié au joueur !");
|
||||
@@ -134,4 +139,3 @@ Hooks.on("chatMessage", (html, content, msg) => {
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "fvtt-te-deum",
|
||||
"version": "1.0.0",
|
||||
"description": "Système Te Deum pour FoundryVTT",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build:css": "gulp css",
|
||||
"watch:css": "gulp watch"
|
||||
},
|
||||
"devDependencies": {
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-less": "^5.0.0",
|
||||
"less": "^4.2.0",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"gulp-postcss": "^9.0.1",
|
||||
"postcss": "^8.4.49"
|
||||
},
|
||||
"keywords": ["foundry-vtt", "te-deum"],
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000095
|
||||
MANIFEST-000265
|
||||
|
||||
+11
-7
@@ -1,7 +1,11 @@
|
||||
2025/04/20-09:24:48.041836 7fa413fff6c0 Recovering log #93
|
||||
2025/04/20-09:24:48.069770 7fa413fff6c0 Delete type=3 #91
|
||||
2025/04/20-09:24:48.069934 7fa413fff6c0 Delete type=0 #93
|
||||
2025/04/20-09:25:06.962777 7fa4127fc6c0 Level-0 table #98: started
|
||||
2025/04/20-09:25:06.962842 7fa4127fc6c0 Level-0 table #98: 0 bytes OK
|
||||
2025/04/20-09:25:06.970328 7fa4127fc6c0 Delete type=0 #96
|
||||
2025/04/20-09:25:06.988174 7fa4127fc6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:30.024223 7f29d57ec6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.330144 7f29d4feb6c0 Level-0 table #268: started
|
||||
2026/06/14-22:15:04.330179 7f29d4feb6c0 Level-0 table #268: 0 bytes OK
|
||||
2026/06/14-22:15:04.336647 7f29d4feb6c0 Delete type=0 #266
|
||||
2026/06/14-22:15:04.355855 7f29d4feb6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 25 : 1
|
||||
2026/06/14-22:15:04.355863 7f29d4feb6c0 Compacting 1@0 + 0@1 files
|
||||
2026/06/14-22:15:04.359383 7f29d4feb6c0 Generated table #269@0: 5 keys, 3728 bytes
|
||||
2026/06/14-22:15:04.359390 7f29d4feb6c0 Compacted 1@0 + 0@1 files => 3728 bytes
|
||||
2026/06/14-22:15:04.365637 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.365709 7f29d4feb6c0 Delete type=2 #236
|
||||
2026/06/14-22:15:04.366103 7f29d4feb6c0 Manual compaction at level-0 from '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 25 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)
|
||||
|
||||
+4
-7
@@ -1,7 +1,4 @@
|
||||
2025/04/11-23:06:48.405694 7f6df09f96c0 Recovering log #89
|
||||
2025/04/11-23:06:48.416695 7f6df09f96c0 Delete type=3 #87
|
||||
2025/04/11-23:06:48.416810 7f6df09f96c0 Delete type=0 #89
|
||||
2025/04/12-00:18:27.794309 7f6deabff6c0 Level-0 table #94: started
|
||||
2025/04/12-00:18:27.794331 7f6deabff6c0 Level-0 table #94: 0 bytes OK
|
||||
2025/04/12-00:18:27.828514 7f6deabff6c0 Delete type=0 #92
|
||||
2025/04/12-00:18:27.828757 7f6deabff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.945743 7f29d57ec6c0 Log #263: 0 ops saved to Table #264 OK
|
||||
2026/06/14-22:10:29.945859 7f29d57ec6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/aides/000263.log: OK
|
||||
2026/06/14-22:10:29.946391 7f29d57ec6c0 Table #236: 5 entries OK
|
||||
2026/06/14-22:10:29.957432 7f29d57ec6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/aides; recovered 1 files; 3728 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000198
|
||||
MANIFEST-000343
|
||||
|
||||
+12
-7
@@ -1,7 +1,12 @@
|
||||
2025/04/20-09:24:47.881295 7fa412ffd6c0 Recovering log #195
|
||||
2025/04/20-09:24:47.897306 7fa412ffd6c0 Delete type=3 #193
|
||||
2025/04/20-09:24:47.897426 7fa412ffd6c0 Delete type=0 #195
|
||||
2025/04/20-09:25:06.915266 7fa4127fc6c0 Level-0 table #201: started
|
||||
2025/04/20-09:25:06.915317 7fa4127fc6c0 Level-0 table #201: 0 bytes OK
|
||||
2025/04/20-09:25:06.922256 7fa4127fc6c0 Delete type=0 #199
|
||||
2025/04/20-09:25:06.929081 7fa4127fc6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.401624 7f29d67ee6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.191842 7f29d4feb6c0 Level-0 table #346: started
|
||||
2026/06/14-22:15:04.196321 7f29d4feb6c0 Level-0 table #346: 10049 bytes OK
|
||||
2026/06/14-22:15:04.202907 7f29d4feb6c0 Delete type=0 #344
|
||||
2026/06/14-22:15:04.231108 7f29d4feb6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at '!items!mClyfwAAlxIE8p8I' @ 79 : 1
|
||||
2026/06/14-22:15:04.231117 7f29d4feb6c0 Compacting 2@0 + 0@1 files
|
||||
2026/06/14-22:15:04.234993 7f29d4feb6c0 Generated table #347@0: 38 keys, 31577 bytes
|
||||
2026/06/14-22:15:04.235022 7f29d4feb6c0 Compacted 2@0 + 0@1 files => 31577 bytes
|
||||
2026/06/14-22:15:04.242154 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.242265 7f29d4feb6c0 Delete type=2 #280
|
||||
2026/06/14-22:15:04.242389 7f29d4feb6c0 Delete type=2 #346
|
||||
2026/06/14-22:15:04.252717 7f29d4feb6c0 Manual compaction at level-0 from '!items!mClyfwAAlxIE8p8I' @ 79 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)
|
||||
|
||||
+4
-14
@@ -1,14 +1,4 @@
|
||||
2025/04/11-23:06:48.304335 7f6df11fa6c0 Recovering log #191
|
||||
2025/04/11-23:06:48.314473 7f6df11fa6c0 Delete type=3 #189
|
||||
2025/04/11-23:06:48.314529 7f6df11fa6c0 Delete type=0 #191
|
||||
2025/04/12-00:18:27.071344 7f6deabff6c0 Level-0 table #196: started
|
||||
2025/04/12-00:18:27.085927 7f6deabff6c0 Level-0 table #196: 1371 bytes OK
|
||||
2025/04/12-00:18:27.118250 7f6deabff6c0 Delete type=0 #194
|
||||
2025/04/12-00:18:27.311443 7f6deabff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at '!items!GZ3Q17VzRvdlrtdF' @ 40 : 1
|
||||
2025/04/12-00:18:27.311451 7f6deabff6c0 Compacting 1@0 + 1@1 files
|
||||
2025/04/12-00:18:27.331173 7f6deabff6c0 Generated table #197@0: 38 keys, 31023 bytes
|
||||
2025/04/12-00:18:27.331200 7f6deabff6c0 Compacted 1@0 + 1@1 files => 31023 bytes
|
||||
2025/04/12-00:18:27.373984 7f6deabff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/04/12-00:18:27.374177 7f6deabff6c0 Delete type=2 #174
|
||||
2025/04/12-00:18:27.374459 7f6deabff6c0 Delete type=2 #196
|
||||
2025/04/12-00:18:27.426656 7f6deabff6c0 Manual compaction at level-0 from '!items!GZ3Q17VzRvdlrtdF' @ 40 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.316470 7f29d67ee6c0 Log #341: 0 ops saved to Table #342 OK
|
||||
2026/06/14-22:10:29.316570 7f29d67ee6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/armes/000341.log: OK
|
||||
2026/06/14-22:10:29.317477 7f29d67ee6c0 Table #280: 38 entries OK
|
||||
2026/06/14-22:10:29.328533 7f29d67ee6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/armes; recovered 1 files; 31247 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000197
|
||||
MANIFEST-000368
|
||||
|
||||
+12
-7
@@ -1,7 +1,12 @@
|
||||
2025/04/20-09:24:47.903860 7fa413fff6c0 Recovering log #195
|
||||
2025/04/20-09:24:47.919442 7fa413fff6c0 Delete type=3 #193
|
||||
2025/04/20-09:24:47.919592 7fa413fff6c0 Delete type=0 #195
|
||||
2025/04/20-09:25:06.908159 7fa4127fc6c0 Level-0 table #200: started
|
||||
2025/04/20-09:25:06.908228 7fa4127fc6c0 Level-0 table #200: 0 bytes OK
|
||||
2025/04/20-09:25:06.915011 7fa4127fc6c0 Delete type=0 #198
|
||||
2025/04/20-09:25:06.929064 7fa4127fc6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.488552 7f29d5fed6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.181343 7f29d4feb6c0 Level-0 table #371: started
|
||||
2026/06/14-22:15:04.184864 7f29d4feb6c0 Level-0 table #371: 1530 bytes OK
|
||||
2026/06/14-22:15:04.191733 7f29d4feb6c0 Delete type=0 #369
|
||||
2026/06/14-22:15:04.221018 7f29d4feb6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at '!items!TxdelREyg5zZw0Ro' @ 61 : 1
|
||||
2026/06/14-22:15:04.221028 7f29d4feb6c0 Compacting 2@0 + 0@1 files
|
||||
2026/06/14-22:15:04.224643 7f29d4feb6c0 Generated table #372@0: 29 keys, 12429 bytes
|
||||
2026/06/14-22:15:04.224665 7f29d4feb6c0 Compacted 2@0 + 0@1 files => 12429 bytes
|
||||
2026/06/14-22:15:04.230738 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.230826 7f29d4feb6c0 Delete type=2 #339
|
||||
2026/06/14-22:15:04.231043 7f29d4feb6c0 Delete type=2 #371
|
||||
2026/06/14-22:15:04.252710 7f29d4feb6c0 Manual compaction at level-0 from '!items!TxdelREyg5zZw0Ro' @ 61 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
2025/04/11-23:06:48.318150 7f6df09f96c0 Recovering log #191
|
||||
2025/04/11-23:06:48.328364 7f6df09f96c0 Delete type=3 #189
|
||||
2025/04/11-23:06:48.328522 7f6df09f96c0 Delete type=0 #191
|
||||
2025/04/12-00:18:27.192248 7f6deabff6c0 Level-0 table #196: started
|
||||
2025/04/12-00:18:27.192320 7f6deabff6c0 Level-0 table #196: 0 bytes OK
|
||||
2025/04/12-00:18:27.261480 7f6deabff6c0 Delete type=0 #194
|
||||
2025/04/12-00:18:27.426624 7f6deabff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.406858 7f29d5fed6c0 Log #366: 0 ops saved to Table #367 OK
|
||||
2026/06/14-22:10:29.406947 7f29d5fed6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/armures/000366.log: OK
|
||||
2026/06/14-22:10:29.412084 7f29d5fed6c0 Table #339: 29 entries OK
|
||||
2026/06/14-22:10:29.431548 7f29d5fed6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/armures; recovered 1 files; 12276 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000194
|
||||
MANIFEST-000366
|
||||
|
||||
+11
-7
@@ -1,7 +1,11 @@
|
||||
2025/04/20-09:24:47.857871 7fa4137fe6c0 Recovering log #192
|
||||
2025/04/20-09:24:47.873833 7fa4137fe6c0 Delete type=3 #190
|
||||
2025/04/20-09:24:47.873948 7fa4137fe6c0 Delete type=0 #192
|
||||
2025/04/20-09:25:06.901277 7fa4127fc6c0 Level-0 table #197: started
|
||||
2025/04/20-09:25:06.901384 7fa4127fc6c0 Level-0 table #197: 0 bytes OK
|
||||
2025/04/20-09:25:06.907939 7fa4127fc6c0 Delete type=0 #195
|
||||
2025/04/20-09:25:06.929038 7fa4127fc6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.310885 7f29d6fef6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.174554 7f29d4feb6c0 Level-0 table #369: started
|
||||
2026/06/14-22:15:04.174857 7f29d4feb6c0 Level-0 table #369: 0 bytes OK
|
||||
2026/06/14-22:15:04.181253 7f29d4feb6c0 Delete type=0 #367
|
||||
2026/06/14-22:15:04.209527 7f29d4feb6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at '!items!yx4k7lQHGcom99mk' @ 237 : 1
|
||||
2026/06/14-22:15:04.209537 7f29d4feb6c0 Compacting 1@0 + 0@1 files
|
||||
2026/06/14-22:15:04.213691 7f29d4feb6c0 Generated table #370@0: 115 keys, 38139 bytes
|
||||
2026/06/14-22:15:04.213711 7f29d4feb6c0 Compacted 1@0 + 0@1 files => 38139 bytes
|
||||
2026/06/14-22:15:04.220652 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.220864 7f29d4feb6c0 Delete type=2 #337
|
||||
2026/06/14-22:15:04.252699 7f29d4feb6c0 Manual compaction at level-0 from '!items!yx4k7lQHGcom99mk' @ 237 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
2025/04/11-23:06:48.289349 7f6debfff6c0 Recovering log #188
|
||||
2025/04/11-23:06:48.299353 7f6debfff6c0 Delete type=3 #186
|
||||
2025/04/11-23:06:48.299496 7f6debfff6c0 Delete type=0 #188
|
||||
2025/04/12-00:18:27.261661 7f6deabff6c0 Level-0 table #193: started
|
||||
2025/04/12-00:18:27.261699 7f6deabff6c0 Level-0 table #193: 0 bytes OK
|
||||
2025/04/12-00:18:27.311309 7f6deabff6c0 Delete type=0 #191
|
||||
2025/04/12-00:18:27.426641 7f6deabff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:28.958293 7f29d6fef6c0 Log #364: 0 ops saved to Table #365 OK
|
||||
2026/06/14-22:10:28.958391 7f29d6fef6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/competences/000364.log: OK
|
||||
2026/06/14-22:10:28.961207 7f29d6fef6c0 Table #337: 115 entries OK
|
||||
2026/06/14-22:10:28.974149 7f29d6fef6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/competences; recovered 1 files; 38139 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000206
|
||||
MANIFEST-000378
|
||||
|
||||
+11
-7
@@ -1,7 +1,11 @@
|
||||
2025/04/20-09:24:47.923568 7fa418ffa6c0 Recovering log #203
|
||||
2025/04/20-09:24:47.940475 7fa418ffa6c0 Delete type=3 #201
|
||||
2025/04/20-09:24:47.940632 7fa418ffa6c0 Delete type=0 #203
|
||||
2025/04/20-09:25:06.922414 7fa4127fc6c0 Level-0 table #209: started
|
||||
2025/04/20-09:25:06.922447 7fa4127fc6c0 Level-0 table #209: 0 bytes OK
|
||||
2025/04/20-09:25:06.928838 7fa4127fc6c0 Delete type=0 #207
|
||||
2025/04/20-09:25:06.929095 7fa4127fc6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.572918 7f29d57ec6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.252921 7f29d4feb6c0 Level-0 table #381: started
|
||||
2026/06/14-22:15:04.252975 7f29d4feb6c0 Level-0 table #381: 0 bytes OK
|
||||
2026/06/14-22:15:04.259425 7f29d4feb6c0 Delete type=0 #379
|
||||
2026/06/14-22:15:04.282981 7f29d4feb6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at '!items!zGlRtP7zSnkjuuue' @ 510 : 1
|
||||
2026/06/14-22:15:04.282992 7f29d4feb6c0 Compacting 1@0 + 0@1 files
|
||||
2026/06/14-22:15:04.290938 7f29d4feb6c0 Generated table #382@0: 71 keys, 264301 bytes
|
||||
2026/06/14-22:15:04.290959 7f29d4feb6c0 Compacted 1@0 + 0@1 files => 264301 bytes
|
||||
2026/06/14-22:15:04.297753 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.297871 7f29d4feb6c0 Delete type=2 #349
|
||||
2026/06/14-22:15:04.329889 7f29d4feb6c0 Manual compaction at level-0 from '!items!zGlRtP7zSnkjuuue' @ 510 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)
|
||||
|
||||
+4
-14
@@ -1,14 +1,4 @@
|
||||
2025/04/11-23:06:48.331428 7f6deb7fe6c0 Recovering log #199
|
||||
2025/04/11-23:06:48.343033 7f6deb7fe6c0 Delete type=3 #197
|
||||
2025/04/11-23:06:48.343104 7f6deb7fe6c0 Delete type=0 #199
|
||||
2025/04/12-00:18:27.118439 7f6deabff6c0 Level-0 table #204: started
|
||||
2025/04/12-00:18:27.137069 7f6deabff6c0 Level-0 table #204: 6892 bytes OK
|
||||
2025/04/12-00:18:27.191998 7f6deabff6c0 Delete type=0 #202
|
||||
2025/04/12-00:18:27.374641 7f6deabff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at '!items!eILBnECWQOFfkxIL' @ 443 : 1
|
||||
2025/04/12-00:18:27.374657 7f6deabff6c0 Compacting 1@0 + 1@1 files
|
||||
2025/04/12-00:18:27.393149 7f6deabff6c0 Generated table #205@0: 71 keys, 263379 bytes
|
||||
2025/04/12-00:18:27.393180 7f6deabff6c0 Compacted 1@0 + 1@1 files => 263379 bytes
|
||||
2025/04/12-00:18:27.425988 7f6deabff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/04/12-00:18:27.426166 7f6deabff6c0 Delete type=2 #186
|
||||
2025/04/12-00:18:27.426484 7f6deabff6c0 Delete type=2 #204
|
||||
2025/04/12-00:18:27.426669 7f6deabff6c0 Manual compaction at level-0 from '!items!eILBnECWQOFfkxIL' @ 443 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.493618 7f29d57ec6c0 Log #376: 0 ops saved to Table #377 OK
|
||||
2026/06/14-22:10:29.493742 7f29d57ec6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/education/000376.log: OK
|
||||
2026/06/14-22:10:29.496413 7f29d57ec6c0 Table #349: 71 entries OK
|
||||
2026/06/14-22:10:29.511862 7f29d57ec6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/education; recovered 1 files; 264301 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000197
|
||||
MANIFEST-000367
|
||||
|
||||
+11
-7
@@ -1,7 +1,11 @@
|
||||
2025/04/20-09:24:47.948681 7fa4137fe6c0 Recovering log #194
|
||||
2025/04/20-09:24:47.965382 7fa4137fe6c0 Delete type=3 #192
|
||||
2025/04/20-09:24:47.965487 7fa4137fe6c0 Delete type=0 #194
|
||||
2025/04/20-09:25:06.935620 7fa4127fc6c0 Level-0 table #200: started
|
||||
2025/04/20-09:25:06.935652 7fa4127fc6c0 Level-0 table #200: 0 bytes OK
|
||||
2025/04/20-09:25:06.942921 7fa4127fc6c0 Delete type=0 #198
|
||||
2025/04/20-09:25:06.956261 7fa4127fc6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.652898 7f29d6fef6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.266316 7f29d4feb6c0 Level-0 table #370: started
|
||||
2026/06/14-22:15:04.266344 7f29d4feb6c0 Level-0 table #370: 0 bytes OK
|
||||
2026/06/14-22:15:04.273013 7f29d4feb6c0 Delete type=0 #368
|
||||
2026/06/14-22:15:04.309352 7f29d4feb6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at '!items!zUYIVOuFpRur9aAR' @ 109 : 1
|
||||
2026/06/14-22:15:04.309362 7f29d4feb6c0 Compacting 1@0 + 0@1 files
|
||||
2026/06/14-22:15:04.313192 7f29d4feb6c0 Generated table #371@0: 49 keys, 20052 bytes
|
||||
2026/06/14-22:15:04.313211 7f29d4feb6c0 Compacted 1@0 + 0@1 files => 20052 bytes
|
||||
2026/06/14-22:15:04.319393 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.319493 7f29d4feb6c0 Delete type=2 #338
|
||||
2026/06/14-22:15:04.329912 7f29d4feb6c0 Manual compaction at level-0 from '!items!zUYIVOuFpRur9aAR' @ 109 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)
|
||||
|
||||
+4
-14
@@ -1,14 +1,4 @@
|
||||
2025/04/11-23:06:48.348395 7f6debfff6c0 Recovering log #190
|
||||
2025/04/11-23:06:48.358966 7f6debfff6c0 Delete type=3 #188
|
||||
2025/04/11-23:06:48.359028 7f6debfff6c0 Delete type=0 #190
|
||||
2025/04/12-00:18:27.516559 7f6deabff6c0 Level-0 table #195: started
|
||||
2025/04/12-00:18:27.532890 7f6deabff6c0 Level-0 table #195: 2579 bytes OK
|
||||
2025/04/12-00:18:27.581168 7f6deabff6c0 Delete type=0 #193
|
||||
2025/04/12-00:18:27.688801 7f6deabff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at '!items!o71YhfDj6rschyQM' @ 59 : 1
|
||||
2025/04/12-00:18:27.688816 7f6deabff6c0 Compacting 1@0 + 1@1 files
|
||||
2025/04/12-00:18:27.707304 7f6deabff6c0 Generated table #196@0: 49 keys, 19688 bytes
|
||||
2025/04/12-00:18:27.707343 7f6deabff6c0 Compacted 1@0 + 1@1 files => 19688 bytes
|
||||
2025/04/12-00:18:27.739125 7f6deabff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/04/12-00:18:27.739315 7f6deabff6c0 Delete type=2 #173
|
||||
2025/04/12-00:18:27.739599 7f6deabff6c0 Delete type=2 #195
|
||||
2025/04/12-00:18:27.828729 7f6deabff6c0 Manual compaction at level-0 from '!items!o71YhfDj6rschyQM' @ 59 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.580134 7f29d6fef6c0 Log #365: 0 ops saved to Table #366 OK
|
||||
2026/06/14-22:10:29.580261 7f29d6fef6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/graces/000365.log: OK
|
||||
2026/06/14-22:10:29.582004 7f29d6fef6c0 Table #338: 49 entries OK
|
||||
2026/06/14-22:10:29.594386 7f29d6fef6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/graces; recovered 1 files; 20052 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000197
|
||||
MANIFEST-000367
|
||||
|
||||
+11
-7
@@ -1,7 +1,11 @@
|
||||
2025/04/20-09:24:47.972234 7fa412ffd6c0 Recovering log #194
|
||||
2025/04/20-09:24:47.989602 7fa412ffd6c0 Delete type=3 #192
|
||||
2025/04/20-09:24:47.989720 7fa412ffd6c0 Delete type=0 #194
|
||||
2025/04/20-09:25:06.929262 7fa4127fc6c0 Level-0 table #200: started
|
||||
2025/04/20-09:25:06.929306 7fa4127fc6c0 Level-0 table #200: 0 bytes OK
|
||||
2025/04/20-09:25:06.935454 7fa4127fc6c0 Delete type=0 #198
|
||||
2025/04/20-09:25:06.956241 7fa4127fc6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.753879 7f29d57ec6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.203040 7f29d4feb6c0 Level-0 table #370: started
|
||||
2026/06/14-22:15:04.203069 7f29d4feb6c0 Level-0 table #370: 0 bytes OK
|
||||
2026/06/14-22:15:04.209414 7f29d4feb6c0 Delete type=0 #368
|
||||
2026/06/14-22:15:04.242440 7f29d4feb6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at '!items!ysGehYm1VkMWrI22' @ 71 : 1
|
||||
2026/06/14-22:15:04.242446 7f29d4feb6c0 Compacting 1@0 + 0@1 files
|
||||
2026/06/14-22:15:04.246114 7f29d4feb6c0 Generated table #371@0: 17 keys, 11517 bytes
|
||||
2026/06/14-22:15:04.246131 7f29d4feb6c0 Compacted 1@0 + 0@1 files => 11517 bytes
|
||||
2026/06/14-22:15:04.252512 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.252602 7f29d4feb6c0 Delete type=2 #338
|
||||
2026/06/14-22:15:04.252724 7f29d4feb6c0 Manual compaction at level-0 from '!items!ysGehYm1VkMWrI22' @ 71 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)
|
||||
|
||||
+4
-14
@@ -1,14 +1,4 @@
|
||||
2025/04/11-23:06:48.361948 7f6df11fa6c0 Recovering log #190
|
||||
2025/04/11-23:06:48.372204 7f6df11fa6c0 Delete type=3 #188
|
||||
2025/04/11-23:06:48.372273 7f6df11fa6c0 Delete type=0 #190
|
||||
2025/04/12-00:18:27.468730 7f6deabff6c0 Level-0 table #195: started
|
||||
2025/04/12-00:18:27.487486 7f6deabff6c0 Level-0 table #195: 19996 bytes OK
|
||||
2025/04/12-00:18:27.516404 7f6deabff6c0 Delete type=0 #193
|
||||
2025/04/12-00:18:27.626078 7f6deabff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at '!items!ysGehYm1VkMWrI22' @ 47 : 1
|
||||
2025/04/12-00:18:27.626091 7f6deabff6c0 Compacting 1@0 + 1@1 files
|
||||
2025/04/12-00:18:27.644729 7f6deabff6c0 Generated table #196@0: 17 keys, 11448 bytes
|
||||
2025/04/12-00:18:27.644759 7f6deabff6c0 Compacted 1@0 + 1@1 files => 11448 bytes
|
||||
2025/04/12-00:18:27.688168 7f6deabff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/04/12-00:18:27.688361 7f6deabff6c0 Delete type=2 #173
|
||||
2025/04/12-00:18:27.688608 7f6deabff6c0 Delete type=2 #195
|
||||
2025/04/12-00:18:27.828710 7f6deabff6c0 Manual compaction at level-0 from '!items!ysGehYm1VkMWrI22' @ 47 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.658579 7f29d57ec6c0 Log #365: 0 ops saved to Table #366 OK
|
||||
2026/06/14-22:10:29.658709 7f29d57ec6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/maladies/000365.log: OK
|
||||
2026/06/14-22:10:29.664972 7f29d57ec6c0 Table #338: 17 entries OK
|
||||
2026/06/14-22:10:29.687510 7f29d57ec6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/maladies; recovered 1 files; 11517 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000134
|
||||
MANIFEST-000305
|
||||
|
||||
+12
-7
@@ -1,7 +1,12 @@
|
||||
2025/04/20-09:24:48.018535 7fa418ffa6c0 Recovering log #132
|
||||
2025/04/20-09:24:48.034352 7fa418ffa6c0 Delete type=3 #130
|
||||
2025/04/20-09:24:48.034446 7fa418ffa6c0 Delete type=0 #132
|
||||
2025/04/20-09:25:06.943076 7fa4127fc6c0 Level-0 table #137: started
|
||||
2025/04/20-09:25:06.943110 7fa4127fc6c0 Level-0 table #137: 0 bytes OK
|
||||
2025/04/20-09:25:06.949678 7fa4127fc6c0 Delete type=0 #135
|
||||
2025/04/20-09:25:06.956277 7fa4127fc6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.936915 7f29d6fef6c0 Delete type=3 #1
|
||||
2026/06/14-22:15:04.273128 7f29d4feb6c0 Level-0 table #308: started
|
||||
2026/06/14-22:15:04.276527 7f29d4feb6c0 Level-0 table #308: 1499 bytes OK
|
||||
2026/06/14-22:15:04.282847 7f29d4feb6c0 Delete type=0 #306
|
||||
2026/06/14-22:15:04.319636 7f29d4feb6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes.levels!FJXugdbkBpEJEdR6.defaultLevel0000' @ 0 : 0; will stop at '!scenes.levels!FJXugdbkBpEJEdR6.defaultLevel0000' @ 6 : 1
|
||||
2026/06/14-22:15:04.319647 7f29d4feb6c0 Compacting 2@0 + 0@1 files
|
||||
2026/06/14-22:15:04.322943 7f29d4feb6c0 Generated table #309@0: 2 keys, 1499 bytes
|
||||
2026/06/14-22:15:04.322965 7f29d4feb6c0 Compacted 2@0 + 0@1 files => 1499 bytes
|
||||
2026/06/14-22:15:04.329615 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2026/06/14-22:15:04.329697 7f29d4feb6c0 Delete type=2 #300
|
||||
2026/06/14-22:15:04.329824 7f29d4feb6c0 Delete type=2 #308
|
||||
2026/06/14-22:15:04.330120 7f29d4feb6c0 Manual compaction at level-0 from '!scenes.levels!FJXugdbkBpEJEdR6.defaultLevel0000' @ 6 : 1 .. '!scenes.levels!FJXugdbkBpEJEdR6.defaultLevel0000' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
2025/04/11-23:06:48.390538 7f6deb7fe6c0 Recovering log #128
|
||||
2025/04/11-23:06:48.400234 7f6deb7fe6c0 Delete type=3 #126
|
||||
2025/04/11-23:06:48.400355 7f6deb7fe6c0 Delete type=0 #128
|
||||
2025/04/12-00:18:27.426850 7f6deabff6c0 Level-0 table #133: started
|
||||
2025/04/12-00:18:27.426889 7f6deabff6c0 Level-0 table #133: 0 bytes OK
|
||||
2025/04/12-00:18:27.468595 7f6deabff6c0 Delete type=0 #131
|
||||
2025/04/12-00:18:27.626052 7f6deabff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end)
|
||||
2026/06/14-22:10:29.840720 7f29d6fef6c0 Log #303: 0 ops saved to Table #304 OK
|
||||
2026/06/14-22:10:29.840844 7f29d6fef6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/scenes/000303.log: OK
|
||||
2026/06/14-22:10:29.840926 7f29d6fef6c0 Table #300: 2 entries OK
|
||||
2026/06/14-22:10:29.863454 7f29d6fef6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-te-deum/packs/scenes; recovered 1 files; 1499 bytes. Some data may have been lost. ****
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user