Compare commits
4 Commits
fvtt-malef
...
13.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 55d7e401c1 | |||
| 5e2916202e | |||
| c45837ea31 | |||
| 8735b7e4a4 |
62
.gitea/workflows/release.yaml
Normal file
62
.gitea/workflows/release.yaml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
name: Release Creation
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
|
||||||
|
|
||||||
|
- uses: 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
|
||||||
|
|
||||||
|
# Substitute the Manifest and Download URLs in the system.json
|
||||||
|
- name: Substitute Manifest and Download Links For Versioned Ones
|
||||||
|
id: sub_manifest_link_version
|
||||||
|
uses: microsoft/variable-substitution@v1
|
||||||
|
with:
|
||||||
|
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/public/fvtt-malefices/releases/download/latest/system.json
|
||||||
|
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-malefices.zip
|
||||||
|
|
||||||
|
# Create a zip file with all files required by the system to add to the release
|
||||||
|
- run: |
|
||||||
|
apt update -y
|
||||||
|
apt install -y zip
|
||||||
|
|
||||||
|
- run: zip -r ./fvtt-malefices.zip system.json README.md fonts/ images/ lang/ modules/ packs/ styles/ templates/
|
||||||
|
|
||||||
|
- name: setup go
|
||||||
|
uses: https://github.com/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '>=1.20.1'
|
||||||
|
|
||||||
|
- name: Use Go Action
|
||||||
|
id: use-go-action
|
||||||
|
uses: https://gitea.com/actions/release-action@main
|
||||||
|
with:
|
||||||
|
files: |-
|
||||||
|
./fvtt-malefices.zip
|
||||||
|
system.json
|
||||||
|
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-malefices'
|
||||||
|
version: ${{github.event.release.tag_name}}
|
||||||
|
manifest: 'https://www.uberwald.me/gitea/public/fvtt-malefices/releases/download/latest/system.json'
|
||||||
|
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-malefices.zip'
|
||||||
|
compatibility-minimum: '11'
|
||||||
|
compatibility-verified: '13'
|
||||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
||||||
27
gulpfile.js
Normal file
27
gulpfile.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
const gulp = require('gulp');
|
||||||
|
const less = require('gulp-less');
|
||||||
|
const sourcemaps = require('gulp-sourcemaps');
|
||||||
|
const rename = require('gulp-rename');
|
||||||
|
|
||||||
|
// Compile LESS to CSS
|
||||||
|
function styles() {
|
||||||
|
return gulp.src('less/malefices.less')
|
||||||
|
.pipe(sourcemaps.init())
|
||||||
|
.pipe(less())
|
||||||
|
.pipe(rename('simple.css'))
|
||||||
|
.pipe(sourcemaps.write('.', { mapFile: () => 'simple.css.map' }))
|
||||||
|
.pipe(gulp.dest('styles/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch files
|
||||||
|
function watchFiles() {
|
||||||
|
gulp.watch('less/**/*.less', styles);
|
||||||
|
}
|
||||||
|
|
||||||
|
const build = gulp.series(styles);
|
||||||
|
const watch = gulp.series(build, watchFiles);
|
||||||
|
|
||||||
|
exports.styles = styles;
|
||||||
|
exports.build = build;
|
||||||
|
exports.watch = watch;
|
||||||
|
exports.default = build;
|
||||||
BIN
images/ui/malefices-background-01.jpg
Normal file
BIN
images/ui/malefices-background-01.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 354 KiB |
235
less/actor-sheet.less
Normal file
235
less/actor-sheet.less
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
/* ===================================================================
|
||||||
|
AppV2 Actor Sheets
|
||||||
|
=================================================================== */
|
||||||
|
|
||||||
|
/* NOTE: DocumentSheetV2 uses tag:"form" — the APPLICATION ROOT is the <form>.
|
||||||
|
The DOM is: form.application > section.window-content > section.editable > ...
|
||||||
|
There is NO <form> child inside window-content. */
|
||||||
|
|
||||||
|
.fvtt-malefices.actor {
|
||||||
|
|
||||||
|
/* window-content: background and remove Foundry's default padding.
|
||||||
|
Foundry AppV2 already sets: display:flex flex-flow:column overflow:hidden */
|
||||||
|
.window-content {
|
||||||
|
padding: 0;
|
||||||
|
background: @bg-sheet;
|
||||||
|
color: @color-text;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All sections inside actor fill their flex container and form a flex column.
|
||||||
|
This covers: section.editable (template root) and section.sheet-body. */
|
||||||
|
section {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sheet-body: scroll container instead of clipping */
|
||||||
|
section.sheet-body {
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Override legacy fixed 210px height — shrink to fit content */
|
||||||
|
.sheet-header {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Override legacy "height: 100%" on .tab divs so their content
|
||||||
|
can overflow sheet-body and trigger the scrollbar;
|
||||||
|
hide all tabs, show only the active one */
|
||||||
|
.tab[data-tab] {
|
||||||
|
height: auto;
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tab navigation */
|
||||||
|
nav.tabs {
|
||||||
|
display: flex;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: @tab-font-size;
|
||||||
|
font-weight: bold;
|
||||||
|
height: @tab-height;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 0 0 0.25rem;
|
||||||
|
text-align: center;
|
||||||
|
text-transform: uppercase;
|
||||||
|
line-height: @tab-height;
|
||||||
|
border-top: 0 none;
|
||||||
|
border-bottom: 0 none;
|
||||||
|
background-color: @color-tab-bg;
|
||||||
|
color: @color-tab-text;
|
||||||
|
gap: 0.25rem;
|
||||||
|
|
||||||
|
a.item {
|
||||||
|
position: relative;
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
color: @color-tab-text;
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: @tab-font-size;
|
||||||
|
text-decoration: none;
|
||||||
|
line-height: @tab-height;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-shadow: 1px 0px 0px @color-accent;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
text-shadow: 1px 0px 0px @color-accent;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Force dark text on section titles and labels inside actor sheet body
|
||||||
|
(overrides Foundry core heading/label colors from the default dark theme) */
|
||||||
|
section.sheet-body {
|
||||||
|
h1, h2, h3, h4, label, span, a {
|
||||||
|
color: @color-text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Belle Époque aesthetic improvements ─────────────────────────── */
|
||||||
|
@be-bordeaux: #5a0a14;
|
||||||
|
@be-gold: #8b6914;
|
||||||
|
@be-gold-border: rgba(139, 105, 20, 0.45);
|
||||||
|
@be-sepia: #3d2b1f;
|
||||||
|
|
||||||
|
// Sheet header — portrait with gold border, charname input styled
|
||||||
|
.sheet-header {
|
||||||
|
.profile-img {
|
||||||
|
border: 2px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 1px 1px 4px rgba(0,0,0,0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1.charname input {
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 1.3rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
border-bottom: 1px solid @be-gold-border;
|
||||||
|
border-top: none;
|
||||||
|
border-left: none;
|
||||||
|
border-right: none;
|
||||||
|
background: transparent;
|
||||||
|
text-shadow: 0 1px 0 rgba(255,255,255,0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
border-bottom: 1px solid @be-gold-border;
|
||||||
|
border-top: none;
|
||||||
|
border-left: none;
|
||||||
|
border-right: none;
|
||||||
|
background: transparent;
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
border-bottom-color: @be-bordeaux;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Section title rows (Attributs, Armes, Équipements, etc.)
|
||||||
|
.items-title-bg {
|
||||||
|
background: linear-gradient(to right, rgba(90,10,20,0.15), rgba(139,105,20,0.10)) !important;
|
||||||
|
border-bottom: 1px solid @be-gold-border;
|
||||||
|
border-top: 1px solid @be-gold-border;
|
||||||
|
margin-top: 6px;
|
||||||
|
|
||||||
|
.items-title-text {
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: @be-bordeaux !important;
|
||||||
|
letter-spacing: 0.03em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Roll links — attributs and weapons
|
||||||
|
a.roll-attribut, a.roll-arme {
|
||||||
|
color: @be-sepia !important;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: color 0.12s;
|
||||||
|
|
||||||
|
i { color: fade(@be-gold, 80%); margin-left: 0.2rem; font-size: 0.75em; }
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: @be-bordeaux !important;
|
||||||
|
text-decoration: none;
|
||||||
|
i { color: @be-bordeaux; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attribute value inputs
|
||||||
|
input.item-field-label-short, input.item-field-label-medium {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: rgba(255,252,240,0.6);
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: @be-bordeaux;
|
||||||
|
box-shadow: 0 0 3px rgba(90,10,20,0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Item rows — zebra effect with Belle Époque tones
|
||||||
|
.alternate-list {
|
||||||
|
.list-item:nth-child(even) {
|
||||||
|
background: rgba(139,105,20,0.07);
|
||||||
|
}
|
||||||
|
.list-item:nth-child(odd) {
|
||||||
|
background: rgba(61,43,31,0.04);
|
||||||
|
}
|
||||||
|
.list-item:hover {
|
||||||
|
background: rgba(139,105,20,0.15) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Item icon — small gold border
|
||||||
|
.sheet-competence-img {
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Item control icons (edit/delete)
|
||||||
|
.item-controls a.item-control {
|
||||||
|
color: fade(@be-sepia, 60%);
|
||||||
|
&:hover { color: @be-bordeaux; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Biography tab inputs
|
||||||
|
.tab.biodata {
|
||||||
|
input[type="text"] {
|
||||||
|
border-bottom: 1px solid @be-gold-border;
|
||||||
|
border-top: none;
|
||||||
|
border-left: none;
|
||||||
|
border-right: none;
|
||||||
|
background: transparent;
|
||||||
|
color: @be-sepia;
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
border-bottom-color: @be-bordeaux;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label.item-name-label-medium {
|
||||||
|
font-weight: 600;
|
||||||
|
color: @be-sepia !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
202
less/base.less
Normal file
202
less/base.less
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
/* ==================== (A) Fonts ==================== */
|
||||||
|
@font-face {
|
||||||
|
font-family: "Rivanna";
|
||||||
|
src: url('../fonts/rivanna.ttf') format("truetype");
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
/* =================== 1. ACTOR SHEET FONT STYLES =========== */
|
||||||
|
--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: 1.0rem;
|
||||||
|
--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: #464331c4;
|
||||||
|
|
||||||
|
/* =================== 2. DEBUGGING HIGHLIGHTERS ============ */
|
||||||
|
--debug-background-color-red: #ff000054;
|
||||||
|
--debug-background-color-blue: #1d00ff54;
|
||||||
|
--debug-background-color-green: #54ff0054;
|
||||||
|
|
||||||
|
--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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/
|
||||||
|
/* Global styles & Font */
|
||||||
|
.fvtt-malefices .window-app {
|
||||||
|
text-align: justify;
|
||||||
|
font-size: 16px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fonts */
|
||||||
|
.sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item {
|
||||||
|
font-size: 1.0rem;
|
||||||
|
} /* For title, sidebar character and scene */
|
||||||
|
.fvtt-malefices .sheet nav.sheet-tabs {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
} /* For nav and title */
|
||||||
|
.window-app input, .fvtt-malefices .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-header{
|
||||||
|
background: rgba(0,0,0,0.75);
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-app.sheet .window-content {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.strong-text{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs .item.active, .blessures-list li ul li:first-child:hover, a:hover {
|
||||||
|
text-shadow: 1px 0px 0px @color-accent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rollable:hover, .rollable:focus {
|
||||||
|
color: #000;
|
||||||
|
text-shadow: 0 0 10px red;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:hover, select:hover {
|
||||||
|
border-width: 4px;
|
||||||
|
border-color: rgb(85, 65, 130);
|
||||||
|
}
|
||||||
|
|
||||||
|
input:disabled {
|
||||||
|
color:#1c2058;
|
||||||
|
}
|
||||||
|
select:disabled {
|
||||||
|
color:#1c2058;
|
||||||
|
}
|
||||||
|
table {border: 1px solid #7a7971;}
|
||||||
|
|
||||||
|
.grid, .grid-2col {
|
||||||
|
display: grid;
|
||||||
|
grid-column: span 2 / span 2;
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
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 {
|
||||||
|
-webkit-box-pack: center;
|
||||||
|
-ms-flex-pack: center;
|
||||||
|
justify-content: center;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-group-left {
|
||||||
|
-webkit-box-pack: start;
|
||||||
|
-ms-flex-pack: start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-group-right {
|
||||||
|
-webkit-box-pack: end;
|
||||||
|
-ms-flex-pack: end;
|
||||||
|
justify-content: flex-end;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-center {
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
-webkit-box-pack: center;
|
||||||
|
-ms-flex-pack: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-create-actor {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-between {
|
||||||
|
-webkit-box-pack: justify;
|
||||||
|
-ms-flex-pack: justify;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-shrink {
|
||||||
|
flex: 'flex-shrink' ;
|
||||||
|
}
|
||||||
325
less/chat.less
Normal file
325
less/chat.less
Normal file
@@ -0,0 +1,325 @@
|
|||||||
|
// ============================================================
|
||||||
|
// Chat messages – Belle Époque theme
|
||||||
|
// ============================================================
|
||||||
|
|
||||||
|
@be-bordeaux: #5a0a14;
|
||||||
|
@be-gold: #8b6914;
|
||||||
|
@be-gold-light: #c8a84b;
|
||||||
|
@be-gold-border: rgba(139, 105, 20, 0.45);
|
||||||
|
@be-sepia: #3d2b1f;
|
||||||
|
@be-sepia-light: rgba(61, 43, 31, 0.06);
|
||||||
|
|
||||||
|
.malefices-chat-card {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 3px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: rgb(218, 218, 208); // opaque pour masquer le fond parchemin du sidebar
|
||||||
|
|
||||||
|
// ── Header ──────────────────────────────────────────────
|
||||||
|
.chat-card-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.4rem;
|
||||||
|
padding: 0.2rem 0.4rem;
|
||||||
|
background: linear-gradient(135deg, rgba(90,10,20,0.12), rgba(139,105,20,0.12));
|
||||||
|
border-bottom: 1px solid @be-gold-border;
|
||||||
|
|
||||||
|
.chat-actor-img {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
object-fit: cover;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-actor-name {
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: normal;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
line-height: 1.1;
|
||||||
|
text-shadow: 0 1px 0 rgba(255,255,255,0.5);
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-header-roll {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.3rem;
|
||||||
|
padding-left: 0.4rem;
|
||||||
|
border-left: 1px solid @be-gold-border;
|
||||||
|
|
||||||
|
.chat-roll-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
object-fit: cover;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-roll-name {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
color: fade(@be-sepia, 80%);
|
||||||
|
font-style: italic;
|
||||||
|
max-width: 80px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Decorative separator ─────────────────────────────────
|
||||||
|
.chat-card-separator {
|
||||||
|
height: 14px;
|
||||||
|
margin: 0.15rem 0.4rem 0;
|
||||||
|
background: url("../images/ui/separator_01.webp") center/auto 100% no-repeat;
|
||||||
|
opacity: 0.55;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Roll detail rows ─────────────────────────────────────
|
||||||
|
.chat-roll-details {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 0.4rem 0.15rem;
|
||||||
|
|
||||||
|
.chat-detail-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: baseline;
|
||||||
|
padding: 0.05rem 0;
|
||||||
|
border-bottom: 1px dotted rgba(139, 105, 20, 0.2);
|
||||||
|
|
||||||
|
&:last-child { border-bottom: none; }
|
||||||
|
|
||||||
|
dt {
|
||||||
|
color: fade(@be-sepia, 75%);
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
font-weight: 600;
|
||||||
|
color: @be-sepia;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Target and roll value stand out slightly
|
||||||
|
.chat-detail-target dd,
|
||||||
|
.chat-detail-roll dd {
|
||||||
|
font-size: 1rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Result banner ────────────────────────────────────────
|
||||||
|
.chat-card-result {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.1rem;
|
||||||
|
margin: 0.2rem 0.4rem 0.25rem;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
border-radius: 2px;
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 1.15rem;
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
|
||||||
|
&.result-success {
|
||||||
|
background: linear-gradient(135deg, rgba(20, 80, 20, 0.12), rgba(40, 100, 40, 0.08));
|
||||||
|
border-color: rgba(30, 100, 30, 0.35);
|
||||||
|
color: #1a5c1a;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.result-failure {
|
||||||
|
background: linear-gradient(135deg, rgba(90, 10, 20, 0.12), rgba(120, 20, 20, 0.08));
|
||||||
|
border-color: rgba(90, 10, 20, 0.35);
|
||||||
|
color: @be-bordeaux;
|
||||||
|
}
|
||||||
|
|
||||||
|
i { margin-right: 0.3rem; }
|
||||||
|
|
||||||
|
.chat-result-damage {
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
opacity: 0.85;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Action buttons (Relancer, etc.) ──────────────────────
|
||||||
|
.chat-card-actions {
|
||||||
|
padding: 0.15rem 0.4rem 0.25rem;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
.chat-card-button {
|
||||||
|
padding: 0.3rem 1rem;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: linear-gradient(to bottom, rgba(255,252,240,0.9), rgba(240,230,200,0.9));
|
||||||
|
color: @be-sepia;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.15s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(to bottom, rgba(240,220,170,0.95), rgba(220,195,140,0.95));
|
||||||
|
border-color: @be-gold;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Tarot card display ──────────────────────────────────
|
||||||
|
.tarot-card-display {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.6rem;
|
||||||
|
align-items: flex-start;
|
||||||
|
padding: 0.3rem 0.5rem 0.4rem;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
z-index: 100;
|
||||||
|
|
||||||
|
.tarot-card-img {
|
||||||
|
transform: scale(2.5);
|
||||||
|
box-shadow: 3px 3px 12px rgba(0,0,0,0.4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tarot-card-img {
|
||||||
|
width: 126px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 1px 1px 4px rgba(0,0,0,0.2);
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
transform-origin: left center;
|
||||||
|
cursor: zoom-in;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tarot-card-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.25rem;
|
||||||
|
padding-top: 0.2rem;
|
||||||
|
|
||||||
|
.tarot-card-name {
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 1rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
text-shadow: 0 1px 0 rgba(255,255,255,0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tarot-card-side {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
&.tarot-positif { color: #1a5c1a; }
|
||||||
|
&.tarot-negatif { color: @be-bordeaux; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.tarot-card-value {
|
||||||
|
font-size: 0.82rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
strong { color: @be-bordeaux; font-size: 1rem; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Item post message ────────────────────────────────────
|
||||||
|
.malefices-chat-card.malefices-chat-item {
|
||||||
|
|
||||||
|
.item-type-label {
|
||||||
|
font-family: "Cinzel Decorative", "Cinzel", serif;
|
||||||
|
font-size: 0.65rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
opacity: 0.8;
|
||||||
|
margin-left: auto;
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-damage {
|
||||||
|
font-weight: 700;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
font-size: 1rem;
|
||||||
|
&.item-damage-crit {
|
||||||
|
color: #8b0000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-item-description {
|
||||||
|
margin: 0.4rem 0.5rem 0.3rem;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-top: 1px solid fade(@be-gold-border, 50%);
|
||||||
|
padding-top: 0.4rem;
|
||||||
|
|
||||||
|
p { margin: 0 0 0.3rem; &:last-child { margin: 0; } }
|
||||||
|
em { color: @be-bordeaux; font-style: italic; }
|
||||||
|
strong { color: @be-sepia; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Welcome message ─────────────────────────────────────
|
||||||
|
.malefices-chat-card.malefices-welcome {
|
||||||
|
|
||||||
|
.welcome-body {
|
||||||
|
padding: 0.3rem 0.6rem 0.4rem;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
line-height: 1.4;
|
||||||
|
|
||||||
|
p { margin: 0.2rem 0; }
|
||||||
|
|
||||||
|
.welcome-title {
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 0.35rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
a { color: @be-gold; &:hover { color: @be-bordeaux; } }
|
||||||
|
}
|
||||||
|
|
||||||
|
.welcome-commands {
|
||||||
|
margin-top: 0.4rem;
|
||||||
|
border-top: 1px solid @be-gold-border;
|
||||||
|
padding-top: 0.3rem;
|
||||||
|
|
||||||
|
.welcome-commands-title {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
margin-bottom: 0.2rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.welcome-command-row {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
margin: 0.1rem 0;
|
||||||
|
code {
|
||||||
|
background: rgba(139,105,20,0.12);
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0 3px;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
616
less/components.less
Normal file
616
less/components.less
Normal file
@@ -0,0 +1,616 @@
|
|||||||
|
/* ======================================== */
|
||||||
|
/* Global UI elements */
|
||||||
|
|
||||||
|
/* ======================================== */
|
||||||
|
|
||||||
|
h1, h2, h3, h4 {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul, ol {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
ul, li {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sheet li {
|
||||||
|
margin: 0.010rem;
|
||||||
|
padding: 0.25rem;
|
||||||
|
}
|
||||||
|
.header-fields li {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alterne-list > .list-item:hover {
|
||||||
|
background: rgba(100, 100, 50, 0.25);
|
||||||
|
}
|
||||||
|
.alterne-list > .list-item:nth-child(even) {
|
||||||
|
background: rgba(80, 60, 0, 0.10);
|
||||||
|
}
|
||||||
|
.alterne-list > .list-item:nth-child(odd) {
|
||||||
|
background: rgb(160, 130, 100, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.specialisation-label {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carac-label,
|
||||||
|
.attr-label {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-item {
|
||||||
|
margin: 0.125rem;
|
||||||
|
/*box-shadow: inset 0px 0px 1px #00000096;
|
||||||
|
border-radius: 0.25rem;*/
|
||||||
|
padding: 0.125rem;
|
||||||
|
flex: 1 1 5rem;
|
||||||
|
display: flex !important;
|
||||||
|
color: @color-text;
|
||||||
|
}
|
||||||
|
.list-item-shadow {
|
||||||
|
background:rgba(87, 60, 32, 0.35);
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
.list-item-shadow2 {
|
||||||
|
background:rgba(87, 60, 32, 0.25);
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
.padd-right {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
.padd-left {
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
.stack-left {
|
||||||
|
align-items:center;
|
||||||
|
flex-shrink: 1;
|
||||||
|
flex-grow: 0;
|
||||||
|
}
|
||||||
|
.packed-left {
|
||||||
|
white-space: nowrap;
|
||||||
|
flex-grow: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-numeric-short {
|
||||||
|
width: 40px;
|
||||||
|
max-width: 40px;
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
flex-basis: 40px;
|
||||||
|
margin-right: 0.25rem;
|
||||||
|
margin-left: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.abilities-table {
|
||||||
|
align-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ======================================== */
|
||||||
|
.tokenhudext {
|
||||||
|
display: flex;
|
||||||
|
flex: 0 !important;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.tokenhudext.left {
|
||||||
|
justify-content: flex-start;
|
||||||
|
flex-direction: column;
|
||||||
|
position: absolute;
|
||||||
|
top: 2.75rem;
|
||||||
|
right: 4rem;
|
||||||
|
}
|
||||||
|
.tokenhudext.right {
|
||||||
|
justify-content: flex-start;
|
||||||
|
flex-direction: column;
|
||||||
|
position: absolute;
|
||||||
|
top: 2.75rem;
|
||||||
|
left: 4rem;
|
||||||
|
}
|
||||||
|
.control-icon.tokenhudicon {
|
||||||
|
width: fit-content;
|
||||||
|
height: fit-content;
|
||||||
|
min-width: 6rem;
|
||||||
|
flex-basis: auto;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1rem;
|
||||||
|
margin: 0.25rem;
|
||||||
|
}
|
||||||
|
.control-icon.tokenhudicon.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 #736953a6;
|
||||||
|
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 CSS */
|
||||||
|
#sidebar {
|
||||||
|
font-size: 1rem;
|
||||||
|
/*background-position: 100%;*/
|
||||||
|
background-color: @color-sidebar-bg;
|
||||||
|
background-position: 0px 35px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: @bg-sheet;
|
||||||
|
color: @color-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar .scene {
|
||||||
|
color: rgba(237, 240, 199, 0.95);
|
||||||
|
}
|
||||||
|
/* background: rgb(105,85,65) url("../images/ui/texture_feuille_perso_onglets.webp") no-repeat right bottom;*/
|
||||||
|
|
||||||
|
#sidebar.collapsed {
|
||||||
|
height: 470px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar-tabs > .collapsed, #chat-controls .chat-control-icon {
|
||||||
|
color: @color-text;
|
||||||
|
text-shadow: 1px 1px 0 rgba(0,0,0,0.75);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-tab .directory-list .entity {
|
||||||
|
border-top: 1px dashed rgba(0,0,0,0.25);
|
||||||
|
border-bottom: 0 none;
|
||||||
|
padding: 0.25rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-tab .directory-list .entity:hover {
|
||||||
|
background: rgba(0,0,0,0.05);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.chat-message-header {
|
||||||
|
background: rgba(220,220,210,0.5);
|
||||||
|
font-size: 1.1rem;
|
||||||
|
height: 48px;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message .message-header .flavor-text, .chat-message .message-header .whisper-to {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
.chat-result-text,
|
||||||
|
.chat-actor-name {
|
||||||
|
font-weight: bold;
|
||||||
|
font-family: Rivanna;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
.chat-result-success {
|
||||||
|
color:darkgreen;
|
||||||
|
}
|
||||||
|
.chat-result-failure {
|
||||||
|
color:darkred;
|
||||||
|
}
|
||||||
|
.chat-img {
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roll-dialog-header {
|
||||||
|
height: 52px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.actor-icon {
|
||||||
|
float: left;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
padding: 2px 6px 2px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.padding-dice {
|
||||||
|
padding-top: .2rem;
|
||||||
|
padding-bottom: .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: .2rem;
|
||||||
|
padding-bottom: .2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.div-center {
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message {
|
||||||
|
background: rgba(220,220,210,0.5);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message.whisper {
|
||||||
|
background: rgba(220,220,210,0.75);
|
||||||
|
border: 2px solid #545469;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message .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);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar-tabs > .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);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar #sidebar-tabs i{
|
||||||
|
display: inline-block;
|
||||||
|
background-position:center;
|
||||||
|
background-size:cover;
|
||||||
|
text-shadow: 1px 1px 0 rgba(0,0,0,0.75);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
/* Control, Tool, hotbar & navigation */
|
||||||
|
|
||||||
|
#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: url(img/ui/footer-button.png) 10 repeat;
|
||||||
|
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: url(img/ui/footer-button.png) 10 repeat;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#hotbar #action-bar .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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#hotbar .bar-controls {
|
||||||
|
background: rgba(30, 25, 20, 1);
|
||||||
|
border: 1px solid rgba(72, 46, 28, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#players {
|
||||||
|
border-image: url(img/ui/footer-button.png) 10 repeat;
|
||||||
|
border-image-width: 4px;
|
||||||
|
border-image-outset: 0px;
|
||||||
|
background: rgba(30, 25, 20, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#navigation #scene-list .scene.nav-item.active {
|
||||||
|
background: rgba(72, 46, 28, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#navigation #scene-list .scene.nav-item {
|
||||||
|
background: rgba(30, 25, 20, 1);
|
||||||
|
background-origin: padding-box;
|
||||||
|
border-image: url(img/ui/footer-button.png) 10 repeat;
|
||||||
|
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: url(img/ui/footer-button.png) 10 repeat;
|
||||||
|
border-image-width: 4px;
|
||||||
|
border-image-outset: 0px;
|
||||||
|
box-shadow: 0 0 3px #ff6400;
|
||||||
|
}
|
||||||
|
|
||||||
|
#navigation #nav-toggle {
|
||||||
|
background: rgba(30, 25, 20, 1);
|
||||||
|
background-origin: padding-box;
|
||||||
|
border-image: url(img/ui/footer-button.png) 10 repeat;
|
||||||
|
border-image-width: 4px;
|
||||||
|
border-image-outset: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tooltip container */
|
||||||
|
.tooltip {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
/*border-bottom: 1px dotted black; /* If you want dots under the hoverable text */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tooltip text */
|
||||||
|
.tooltip .tooltiptext {
|
||||||
|
text-align: left;
|
||||||
|
background: rgba(231, 229, 226, 0.9);
|
||||||
|
width: 150px;
|
||||||
|
padding: 3px 0;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
|
||||||
|
/* Position the tooltip text */
|
||||||
|
top: 1px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
|
/* Fade in tooltip */
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.tooltip-nobottom {
|
||||||
|
border-bottom: unset; /* If you want dots under the hoverable text */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show the tooltip text when you mouse over the tooltip container */
|
||||||
|
.tooltip:hover .tooltiptext {
|
||||||
|
visibility: visible;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-card-button {
|
||||||
|
box-shadow: inset 0px 1px 0px 0px #a6827e;
|
||||||
|
background: linear-gradient(to bottom, #21374afc 5%, #152833ab 100%);
|
||||||
|
background-color: #7d5d3b00;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-card-button:hover {
|
||||||
|
background: linear-gradient(to bottom, #800000 5%, #3e0101 100%);
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
.chat-card-button:active {
|
||||||
|
position:relative;
|
||||||
|
top:1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plus-minus-button {
|
||||||
|
box-shadow: inset 0px 1px 0px 0px #a6827e;
|
||||||
|
background: linear-gradient(to bottom, #21374afc 5%, #152833ab 100%);
|
||||||
|
background-color: #7d5d3b00;
|
||||||
|
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;
|
||||||
|
}
|
||||||
469
less/dialogs.less
Normal file
469
less/dialogs.less
Normal file
@@ -0,0 +1,469 @@
|
|||||||
|
/* ===================================================================
|
||||||
|
AppV2 Dialogs — Style Belle Époque (France, ~1900)
|
||||||
|
Palette : bordeaux, or antique, sépia, fond parchemin clair
|
||||||
|
=================================================================== */
|
||||||
|
|
||||||
|
// Couleurs Belle Époque
|
||||||
|
@be-bordeaux: #5a0a14;
|
||||||
|
@be-gold: #8b6914;
|
||||||
|
@be-gold-light: rgba(139, 105, 20, 0.25);
|
||||||
|
@be-gold-border: rgba(139, 105, 20, 0.55);
|
||||||
|
@be-sepia: #3d2b1f;
|
||||||
|
@be-sepia-light: rgba(61, 43, 31, 0.08);
|
||||||
|
|
||||||
|
.malefices-roll-dialog {
|
||||||
|
|
||||||
|
.window-content {
|
||||||
|
padding: 0;
|
||||||
|
background: @bg-sheet;
|
||||||
|
color: @be-sepia;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skill-roll-dialog {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
// ── En-tête ──────────────────────────────────────────────
|
||||||
|
header.roll-dialog-header {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
padding: 0.6rem 0.75rem 0.5rem;
|
||||||
|
background: linear-gradient(to bottom, rgba(90, 10, 20, 0.12), rgba(90, 10, 20, 0.04));
|
||||||
|
border-bottom: 2px solid @be-gold-border;
|
||||||
|
}
|
||||||
|
|
||||||
|
.actor-icon {
|
||||||
|
width: 52px;
|
||||||
|
height: 52px;
|
||||||
|
object-fit: cover;
|
||||||
|
border: 2px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 0 1px 4px rgba(0,0,0,0.35);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom title div — no h1 to avoid Foundry theme overrides
|
||||||
|
.dialog-roll-title {
|
||||||
|
color: @be-bordeaux;
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: 2rem;
|
||||||
|
font-weight: bold;
|
||||||
|
flex: 1;
|
||||||
|
line-height: 1.1;
|
||||||
|
text-shadow: 1px 1px 2px rgba(255,255,255,0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Séparateur décoratif ──────────────────────────────────
|
||||||
|
.dialog-separator {
|
||||||
|
width: 100%;
|
||||||
|
height: 18px;
|
||||||
|
background: url("../images/ui/separator_01.webp") center/auto 100% no-repeat;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin: 0.1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Corps du dialog ───────────────────────────────────────
|
||||||
|
.dialog-body {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.4rem;
|
||||||
|
padding: 0.5rem 0.75rem 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ligne attribut principal
|
||||||
|
.dialog-attribute-row {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: baseline;
|
||||||
|
gap: 0.5rem;
|
||||||
|
padding: 0.3rem 0.5rem;
|
||||||
|
background: @be-gold-light;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
|
||||||
|
.dialog-attr-label {
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
font-weight: bold;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-attr-value {
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: 1.3rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: @be-sepia;
|
||||||
|
min-width: 2rem;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Titre de section (éléments biographiques)
|
||||||
|
.dialog-section-title {
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
color: @be-gold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
border-bottom: 1px solid @be-gold-border;
|
||||||
|
padding-bottom: 0.15rem;
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liste des éléments biographiques
|
||||||
|
.dialog-bio-list {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0 0 0.25rem 0;
|
||||||
|
padding: 0 0 0 0.5rem;
|
||||||
|
|
||||||
|
li {
|
||||||
|
color: @be-sepia;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
padding: 0.1rem 0;
|
||||||
|
border-bottom: 1px dashed rgba(139, 105, 20, 0.2);
|
||||||
|
|
||||||
|
&:last-child { border-bottom: none; }
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "✦ ";
|
||||||
|
color: @be-gold;
|
||||||
|
font-size: 0.65rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zone des modificateurs
|
||||||
|
.dialog-modifiers {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.3rem;
|
||||||
|
margin-top: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-modifier-row {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
border-bottom: 1px solid rgba(139, 105, 20, 0.18);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: @be-sepia-light;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-modifier-label {
|
||||||
|
flex: 1;
|
||||||
|
color: @be-sepia;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
flex: 0 0 140px;
|
||||||
|
width: 140px;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
background: rgba(255, 252, 245, 0.85);
|
||||||
|
color: @be-sepia;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
padding: 1px 4px;
|
||||||
|
border-radius: 2px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: @be-gold;
|
||||||
|
border-width: 2px;
|
||||||
|
}
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: @be-bordeaux;
|
||||||
|
box-shadow: 0 0 3px rgba(90, 10, 20, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer.form-footer {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.5rem;
|
||||||
|
padding: 0.5rem 0.75rem;
|
||||||
|
background: linear-gradient(to bottom, rgba(139, 105, 20, 0.08), rgba(139, 105, 20, 0.16));
|
||||||
|
border-top: 1px solid @be-gold-border;
|
||||||
|
|
||||||
|
button {
|
||||||
|
flex: 1;
|
||||||
|
padding: 0.4rem 0.75rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: 600;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: linear-gradient(to bottom, rgba(255, 252, 240, 0.9), rgba(240, 230, 200, 0.9));
|
||||||
|
color: @be-sepia;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.15s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(to bottom, rgba(240, 220, 170, 0.95), rgba(220, 195, 140, 0.95));
|
||||||
|
border-color: @be-gold;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-action="roll"],
|
||||||
|
&[type="submit"] {
|
||||||
|
background: linear-gradient(to bottom, @be-bordeaux, darken(@be-bordeaux, 8%));
|
||||||
|
color: rgba(255, 245, 220, 0.95);
|
||||||
|
border-color: darken(@be-bordeaux, 10%);
|
||||||
|
font-size: 0.95rem;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(to bottom, lighten(@be-bordeaux, 5%), @be-bordeaux);
|
||||||
|
border-color: @be-bordeaux;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===================================================================
|
||||||
|
Dialogs AppV2 partagés (class: MaleficesDialog)
|
||||||
|
— utilisé par Tirage Tarot et Résumé des Personnages
|
||||||
|
=================================================================== */
|
||||||
|
.MaleficesDialog {
|
||||||
|
|
||||||
|
.window-content {
|
||||||
|
background: @bg-sheet;
|
||||||
|
padding: 0;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Résumé des Personnages ─────────────────────────────
|
||||||
|
.character-summary-container {
|
||||||
|
padding: 0.5rem 0.75rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
|
||||||
|
.items-list {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0.2rem 0.4rem;
|
||||||
|
border-bottom: 1px solid fade(@be-gold-border, 40%);
|
||||||
|
|
||||||
|
&:last-child { border-bottom: none; }
|
||||||
|
|
||||||
|
&.item-header {
|
||||||
|
background: linear-gradient(135deg, rgba(90,10,20,0.10), rgba(139,105,20,0.10));
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
font-family: "Cinzel Decorative", "Cinzel", serif;
|
||||||
|
font-size: 0.65rem;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
text-transform: uppercase;
|
||||||
|
|
||||||
|
&:not(:first-child) { margin-top: 0.5rem; }
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover:not(.item-header) {
|
||||||
|
background: rgba(139, 105, 20, 0.08);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-field {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
|
||||||
|
&.item-name { flex: 3; text-align: left; font-weight: 600; }
|
||||||
|
&.item-name-label-long { flex: 3; text-align: left; }
|
||||||
|
&.item-name-label-short { flex: 1; text-align: center; }
|
||||||
|
&.right { text-align: right; }
|
||||||
|
}
|
||||||
|
|
||||||
|
a.summary-roll, a.actor-open {
|
||||||
|
cursor: pointer;
|
||||||
|
color: @be-sepia;
|
||||||
|
&:hover { color: @be-bordeaux; text-decoration: underline; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.actor-delete {
|
||||||
|
color: fade(@be-sepia, 50%);
|
||||||
|
font-size: 0.75rem;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover { color: @be-bordeaux; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-tarot-dialog {
|
||||||
|
display: block;
|
||||||
|
padding: 0.6rem 0.75rem;
|
||||||
|
color: @be-sepia;
|
||||||
|
|
||||||
|
// ── Sélection joueur / attribution ────────────────────
|
||||||
|
.tirage-select-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
padding: 0.4rem 0.6rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
background: linear-gradient(135deg, rgba(90,10,20,0.08), rgba(139,105,20,0.08));
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
|
||||||
|
.tirage-select-label {
|
||||||
|
flex: 1;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: @be-sepia;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-select {
|
||||||
|
flex: 0 0 180px;
|
||||||
|
width: 180px;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
background: rgba(255,252,240,0.85);
|
||||||
|
color: @be-sepia;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
padding: 2px 4px;
|
||||||
|
border-radius: 2px;
|
||||||
|
&:focus { outline: none; border-color: @be-bordeaux; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-attribute-row {
|
||||||
|
background: linear-gradient(135deg, rgba(20,80,20,0.08), rgba(30,100,30,0.05));
|
||||||
|
border-color: rgba(30,100,30,0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Section (main joueur / main secrète) ──────────────
|
||||||
|
.tirage-section {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
|
||||||
|
.tirage-section-title {
|
||||||
|
display: block;
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 1rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
border-bottom: 1px solid @be-gold-border;
|
||||||
|
padding-bottom: 0.2rem;
|
||||||
|
margin-bottom: 0.4rem;
|
||||||
|
text-shadow: 0 1px 0 rgba(255,255,255,0.4);
|
||||||
|
|
||||||
|
i { margin-right: 0.35rem; font-size: 0.85em; opacity: 0.7; }
|
||||||
|
|
||||||
|
.tirage-player-name {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-style: italic;
|
||||||
|
color: @be-sepia;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-secret-title { color: fade(@be-sepia, 70%); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Grille de cartes ──────────────────────────────────
|
||||||
|
.tirage-cards-row {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.6rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-card {
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.2rem;
|
||||||
|
width: 100px;
|
||||||
|
vertical-align: top;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
position: relative;
|
||||||
|
z-index: 100;
|
||||||
|
|
||||||
|
.tirage-card-img {
|
||||||
|
transform: scale(2.2);
|
||||||
|
transform-origin: center top;
|
||||||
|
box-shadow: 3px 3px 12px rgba(0,0,0,0.4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-card-img {
|
||||||
|
width: 100px;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 1px 1px 4px rgba(0,0,0,0.2);
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
transform-origin: center center;
|
||||||
|
cursor: zoom-in;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-card-name {
|
||||||
|
font-family: @font-rivanna, serif;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tirage-card-side {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
font-weight: 600;
|
||||||
|
&.tirage-positif { color: #1a5c1a; }
|
||||||
|
&.tirage-negatif { color: @be-bordeaux; }
|
||||||
|
}
|
||||||
|
|
||||||
|
&.tirage-card-secret {
|
||||||
|
opacity: 0.85;
|
||||||
|
.tirage-card-name { color: fade(@be-sepia, 70%); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Séparateur décoratif ──────────────────────────────
|
||||||
|
.tirage-separator {
|
||||||
|
display: block;
|
||||||
|
height: 18px;
|
||||||
|
background: url("../images/ui/separator_01.webp") center/auto 100% no-repeat;
|
||||||
|
opacity: 0.5;
|
||||||
|
margin: 0.25rem 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Footer avec bouton Fermer ─────────────────────────
|
||||||
|
.tirage-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
padding: 0.4rem 0.75rem;
|
||||||
|
border-top: 1px solid @be-gold-border;
|
||||||
|
background: linear-gradient(to bottom, rgba(139,105,20,0.08), rgba(139,105,20,0.16));
|
||||||
|
|
||||||
|
.tirage-close-btn {
|
||||||
|
padding: 0.3rem 1rem;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
border: 1px solid @be-gold-border;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: linear-gradient(to bottom, rgba(255,252,240,0.9), rgba(240,230,200,0.9));
|
||||||
|
color: @be-sepia;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(to bottom, rgba(240,220,170,0.95), rgba(220,195,140,0.95));
|
||||||
|
border-color: @be-gold;
|
||||||
|
color: @be-bordeaux;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
136
less/item-sheet.less
Normal file
136
less/item-sheet.less
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/* ===================================================================
|
||||||
|
AppV2 Item Sheets
|
||||||
|
Selectors use .fvtt-malefices.item (both classes on the same root
|
||||||
|
element, no space) to target only AppV2 item sheet windows.
|
||||||
|
=================================================================== */
|
||||||
|
|
||||||
|
.fvtt-malefices.item {
|
||||||
|
|
||||||
|
/* window-content: background and remove padding.
|
||||||
|
Foundry AppV2 already sets: display:flex flex-flow:column overflow:hidden */
|
||||||
|
.window-content {
|
||||||
|
padding: 0;
|
||||||
|
background: @bg-sheet;
|
||||||
|
color: @color-text;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All sections inside item fill their flex container */
|
||||||
|
section {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fixed header bar */
|
||||||
|
.header {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
border-bottom: 1px solid #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sheet-body: scroll container */
|
||||||
|
section.sheet-body {
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Override legacy height: 100% on tab divs; hide all tabs, show only the active one */
|
||||||
|
.tab[data-tab] {
|
||||||
|
height: auto;
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header layout override for item sheets (smaller than actor sheet header) */
|
||||||
|
.sheet-header {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
padding: 0.5rem;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-sheet-img {
|
||||||
|
flex: 0 0 64px;
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
object-fit: cover;
|
||||||
|
border: 1px solid #999;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-sheet-title {
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border-bottom: none;
|
||||||
|
|
||||||
|
input {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: 1.8rem;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-actions {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
display: flex;
|
||||||
|
gap: 0.25rem;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tab navigation: AppV2 uses nav.tabs (not nav.sheet-tabs) */
|
||||||
|
nav.tabs {
|
||||||
|
display: flex;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: @tab-font-size;
|
||||||
|
font-weight: bold;
|
||||||
|
height: @tab-height;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 0 0 0.25rem;
|
||||||
|
text-align: center;
|
||||||
|
text-transform: uppercase;
|
||||||
|
line-height: @tab-height;
|
||||||
|
border-top: 0 none;
|
||||||
|
border-bottom: 0 none;
|
||||||
|
background-color: @color-tab-bg;
|
||||||
|
color: @color-tab-text;
|
||||||
|
gap: 0.25rem;
|
||||||
|
|
||||||
|
a.item {
|
||||||
|
position: relative;
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
color: @color-tab-text;
|
||||||
|
font-family: @font-rivanna;
|
||||||
|
font-size: @tab-font-size;
|
||||||
|
text-decoration: none;
|
||||||
|
line-height: @tab-height;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-shadow: 1px 0px 0px @color-accent;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
text-shadow: 1px 0px 0px @color-accent;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
340
less/legacy-sheets.less
Normal file
340
less/legacy-sheets.less
Normal file
@@ -0,0 +1,340 @@
|
|||||||
|
/* Styles limited to sheets */
|
||||||
|
.fvtt-malefices .sheet-header {
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: 0 0 210px;
|
||||||
|
flex: 0 0 210px;
|
||||||
|
overflow: hidden;
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-orient: horizontal;
|
||||||
|
-webkit-box-direction: normal;
|
||||||
|
-ms-flex-direction: row;
|
||||||
|
flex-direction: row;
|
||||||
|
-ms-flex-wrap: wrap;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
-webkit-box-pack: start;
|
||||||
|
-ms-flex-pack: start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .sheet-header .profile-img {
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: 0 0 128px;
|
||||||
|
flex: 0 0 128px;
|
||||||
|
width: 128px;
|
||||||
|
height: auto;
|
||||||
|
max-height:128px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-right: 10px;
|
||||||
|
object-fit: cover;
|
||||||
|
object-position: 50% 0;
|
||||||
|
border-width: 0px;
|
||||||
|
}
|
||||||
|
.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-img: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-malefices .sheet-header .header-fields {
|
||||||
|
-webkit-box-flex: 1;
|
||||||
|
-ms-flex: 1;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .sheet-header h1.charname {
|
||||||
|
height: 50px;
|
||||||
|
padding: 0px;
|
||||||
|
margin: 5px 0;
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .sheet-header h1.charname input {
|
||||||
|
font-family: Rivanna;
|
||||||
|
font-size: 3rem;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .sheet-tabs {
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: 0;
|
||||||
|
flex: 0;
|
||||||
|
font-family: Rivanna;
|
||||||
|
font-size: 2.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .sheet-body,
|
||||||
|
.fvtt-malefices .sheet-body .tab,
|
||||||
|
.fvtt-malefices .sheet-body .tab .editor {
|
||||||
|
height: 100%;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor {
|
||||||
|
border: 2;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.medium-editor {
|
||||||
|
border: 2;
|
||||||
|
height: 240px;
|
||||||
|
padding: 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-editor {
|
||||||
|
border: 2;
|
||||||
|
height: 120px;
|
||||||
|
padding: 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .tox .tox-editor-container {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .tox .tox-edit-area {
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .resource-label {
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .tabs {
|
||||||
|
height: 40px;
|
||||||
|
border-top: 1px solid #AAA;
|
||||||
|
border-bottom: 1px solid #AAA;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .tabs .item {
|
||||||
|
line-height: 40px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .tabs .item.active {
|
||||||
|
text-decoration: underline;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .items-list {
|
||||||
|
list-style: none;
|
||||||
|
margin: 1px 0;
|
||||||
|
padding: 0;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .items-list .item-header {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .items-list .item {
|
||||||
|
height: 30px;
|
||||||
|
line-height: 24px;
|
||||||
|
padding: 1px 0;
|
||||||
|
border-bottom: 1px solid #BBB;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .items-list .item .item-image {
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: 0 0 24px;
|
||||||
|
flex: 0 0 24px;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .items-list .item img {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .items-list .item-name {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .items-list .item-controls {
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: 0 0 86px;
|
||||||
|
flex: 0 0 86px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.folder > .folder-header h3 {
|
||||||
|
color: @color-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ======================================== */
|
||||||
|
/* Sheet */
|
||||||
|
.fvtt-malefices .window-app.sheet .window-content .sheet-header{
|
||||||
|
color: @color-text;
|
||||||
|
background: @bg-sheet;
|
||||||
|
/*background: #494e6b;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"], select[type="text"] {
|
||||||
|
background:white;
|
||||||
|
color: @color-input-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
background:white;
|
||||||
|
color: @color-input-text;
|
||||||
|
}
|
||||||
|
/* background: #011d33 url("../images/ui/fond1.webp") repeat left top;*/
|
||||||
|
/*color: rgba(168, 139, 139, 0.5);*/
|
||||||
|
.window-app.sheet .window-content .sheet-header select[type="text"], .window-app.sheet .window-content .sheet-header input[type="text"], .window-app.sheet .window-content .sheet-header input[type="number"], .window-app.sheet .window-content .sheet-body input[type="text"], .window-app.sheet .window-content .sheet-body input[type="number"], .window-app.sheet .window-content .sheet-body select[type="text"] {
|
||||||
|
color: @color-text;
|
||||||
|
/*color: #494e6b;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-app.sheet .window-content .sheet-header input[type="password"], .window-app.sheet .window-content .sheet-header input[type="date"], .window-app.sheet .window-content .sheet-header input[type="time"] {
|
||||||
|
color: @color-text;
|
||||||
|
background: @bg-sheet;
|
||||||
|
border: 1 none;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-app.sheet .window-content .sheet-body input[type="password"], .window-app.sheet .window-content .sheet-body input[type="date"], .window-app.sheet .window-content .sheet-body input[type="time"] {
|
||||||
|
color: @color-text;
|
||||||
|
background: @bg-sheet;
|
||||||
|
border: 1 none;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-app.sheet .window-content .sheet-body select, .window-app.sheet .window-content .sheet-header select {
|
||||||
|
color: @color-text;
|
||||||
|
background: #fff;
|
||||||
|
border: 1 none;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvtt-malefices .window-app .window-content, .fvtt-malefices .window-app.sheet .window-content .sheet-body{
|
||||||
|
font-size: 0.8rem;
|
||||||
|
/*background: url("../images/ui/pc_sheet_bg.webp") repeat left top;*/
|
||||||
|
background: @bg-sheet;
|
||||||
|
color: @color-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* background: rgba(245,245,240,0.6) url("../images/ui/sheet_background.webp") left top;*/
|
||||||
|
|
||||||
|
section.sheet-body{padding: 0.25rem 0.5rem;}
|
||||||
|
|
||||||
|
.sheet header.sheet-header .profile-img {
|
||||||
|
object-fit: cover;
|
||||||
|
object-position: 50% 0;
|
||||||
|
margin: 0.5rem 0 0.5rem 0.5rem;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav.sheet-tabs {
|
||||||
|
font-size: @tab-font-size;
|
||||||
|
font-weight: bold;
|
||||||
|
height: @tab-height;
|
||||||
|
flex: 0 0 @tab-height;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 0 0 0.25rem;
|
||||||
|
text-align: center;
|
||||||
|
text-transform: uppercase;
|
||||||
|
line-height: 1.5rem;
|
||||||
|
border-top: 0 none;
|
||||||
|
border-bottom: 0 none;
|
||||||
|
background-color: @color-tab-bg;
|
||||||
|
color: @color-tab-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dice tray specific overrides */
|
||||||
|
.dice-tray button svg * {
|
||||||
|
fill: #6d5923 !important;
|
||||||
|
}
|
||||||
|
.dice-tray input[type="text"] {
|
||||||
|
color: #6d5923 !important;
|
||||||
|
}
|
||||||
|
.dice-tray button {
|
||||||
|
color: #6d5923 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav.sheet-tabs .item {
|
||||||
|
position: relative;
|
||||||
|
padding: 0 0.25rem;
|
||||||
|
color: @color-tab-text;
|
||||||
|
margin-top: 4px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav.sheet-tabs .item:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 2rem;
|
||||||
|
width: 1px;
|
||||||
|
/*border-right: 1px dashed rgba(52, 52, 52, 0.25);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.sheet .tab[data-tab] {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
section.sheet-body:after {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sheet header.sheet-header .flex-compteurs {text-align: right;}
|
||||||
|
.sheet header.sheet-header .resource-content {width: 2rem;}
|
||||||
|
|
||||||
|
.select-diff {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: left;
|
||||||
|
width: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-app.sheet .window-content .tooltip:hover .tooltiptext {
|
||||||
|
top: 2rem;
|
||||||
|
left: 2rem;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-app.sheet .window-content .carac-value, .window-app.sheet .window-content .competence-xp {
|
||||||
|
margin: 0.05rem;
|
||||||
|
flex-basis: 3rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
12
less/malefices.less
Normal file
12
less/malefices.less
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// Main LESS file for Maléfices system
|
||||||
|
// Importing base styles and component-specific styles
|
||||||
|
|
||||||
|
@import "variables";
|
||||||
|
@import "base";
|
||||||
|
@import "legacy-sheets";
|
||||||
|
@import "components";
|
||||||
|
@import "ui";
|
||||||
|
@import "dialogs";
|
||||||
|
@import "chat";
|
||||||
|
@import "item-sheet";
|
||||||
|
@import "actor-sheet";
|
||||||
180
less/ui.less
Normal file
180
less/ui.less
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
/*************************************************************/
|
||||||
|
#pause
|
||||||
|
{
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
#pause > h3
|
||||||
|
{
|
||||||
|
color: #CCC
|
||||||
|
}
|
||||||
|
#pause > img {
|
||||||
|
content: url(../images/ui/logo_pause.webp);
|
||||||
|
height: 200px;
|
||||||
|
width: 200px;
|
||||||
|
top: -100px;
|
||||||
|
left: calc(50% - 132px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
content : url(../images/ui/logo_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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: @color-text;
|
||||||
|
|
||||||
|
}
|
||||||
|
.items-title-text {
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
.lock-icon {
|
||||||
|
width:16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
.item-sheet-img {
|
||||||
|
width: 64px;
|
||||||
|
height: auto;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.item-name-img {
|
||||||
|
flex-grow:1;
|
||||||
|
max-width: 2rem;
|
||||||
|
min-width: 2rem;
|
||||||
|
}
|
||||||
|
.item-name-label-header {
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 12rem;
|
||||||
|
min-width: 12rem;
|
||||||
|
}
|
||||||
|
.item-name-label-header-long {
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 14rem;
|
||||||
|
min-width: 14rem;
|
||||||
|
}
|
||||||
|
.item-name-label-header-long2 {
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 24rem;
|
||||||
|
min-width: 24rem;
|
||||||
|
}
|
||||||
|
.item-name-label {
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 10rem;
|
||||||
|
min-width: 10rem;
|
||||||
|
}
|
||||||
|
.item-name-label-long {
|
||||||
|
margin-top: 4px;
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 10rem;
|
||||||
|
min-width: 10rem;
|
||||||
|
}
|
||||||
|
.item-name-label-short {
|
||||||
|
flex-grow:1;
|
||||||
|
max-width: 4rem;
|
||||||
|
min-width: 4rem;
|
||||||
|
}
|
||||||
|
.item-name-label-medium {
|
||||||
|
margin-top: 4px;
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 6rem;
|
||||||
|
min-width: 6rem;
|
||||||
|
}
|
||||||
|
.item-name-label-long2 {
|
||||||
|
margin-top: 4px;
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 22rem;
|
||||||
|
min-width: 22rem;
|
||||||
|
}
|
||||||
|
.item-name-label-level2 {
|
||||||
|
flex-grow:2;
|
||||||
|
max-width: 9rem;
|
||||||
|
min-width: 9rem;
|
||||||
|
}
|
||||||
|
.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-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-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;
|
||||||
|
}
|
||||||
|
.attribute-label {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.flexrow-no-expand {
|
||||||
|
flex-grow: 0;
|
||||||
|
}
|
||||||
|
.item-input-small {
|
||||||
|
max-width: 16px;
|
||||||
|
max-height: 12px;
|
||||||
|
}
|
||||||
|
.flip-tarot {
|
||||||
|
transform: scaleY(-1);
|
||||||
|
}
|
||||||
|
.tarot-fixed-width {
|
||||||
|
width: 140px;
|
||||||
|
max-width: 140px;
|
||||||
|
}
|
||||||
|
.tarot-title {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.character-summary-rollable {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
19
less/variables.less
Normal file
19
less/variables.less
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// ==================== Variables ====================
|
||||||
|
|
||||||
|
// Fonts
|
||||||
|
@font-rivanna: Rivanna, serif;
|
||||||
|
|
||||||
|
// Colors
|
||||||
|
@color-text: rgba(19, 18, 18, 0.95);
|
||||||
|
@color-accent: #ff6600;
|
||||||
|
@color-tab-bg: #252525;
|
||||||
|
@color-tab-text: beige;
|
||||||
|
@color-input-text: #494e6b;
|
||||||
|
@color-sidebar-bg: #f5f5f5;
|
||||||
|
|
||||||
|
// Backgrounds
|
||||||
|
@bg-sheet: url("../images/ui/background_01_clear.webp");
|
||||||
|
|
||||||
|
// Tabs
|
||||||
|
@tab-height: 3rem;
|
||||||
|
@tab-font-size: 1.2rem;
|
||||||
13
modules/applications/sheets/_module.mjs
Normal file
13
modules/applications/sheets/_module.mjs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Index des fiches AppV2 pour Maléfices
|
||||||
|
*/
|
||||||
|
// Actor sheets
|
||||||
|
export { default as MaleficesPersonnageSheet } from './malefices-personnage-sheet.mjs';
|
||||||
|
export { default as MaleficesNPCActorSheet } from './malefices-npc-actor-sheet.mjs';
|
||||||
|
// Item sheets
|
||||||
|
export { default as MaleficesArmeSheet } from './malefices-arme-sheet.mjs';
|
||||||
|
export { default as MaleficesEquipementSheet } from './malefices-equipement-sheet.mjs';
|
||||||
|
export { default as MaleficesArchetypeSheet } from './malefices-archetype-sheet.mjs';
|
||||||
|
export { default as MaleficesTarotSheet } from './malefices-tarot-sheet.mjs';
|
||||||
|
export { default as MaleficesSortilegeSheet } from './malefices-sortilege-sheet.mjs';
|
||||||
|
export { default as MaleficesElementbioSheet } from './malefices-elementbio-sheet.mjs';
|
||||||
132
modules/applications/sheets/base-item-sheet.mjs
Normal file
132
modules/applications/sheets/base-item-sheet.mjs
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||||
|
|
||||||
|
export default class MaleficesItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
|
||||||
|
constructor(options = {}) {
|
||||||
|
super(options)
|
||||||
|
this.#dragDrop = this.#createDragDropHandlers()
|
||||||
|
}
|
||||||
|
|
||||||
|
#dragDrop
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["fvtt-malefices", "item"],
|
||||||
|
position: {
|
||||||
|
width: 620,
|
||||||
|
height: 600,
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
submitOnChange: true,
|
||||||
|
},
|
||||||
|
window: {
|
||||||
|
resizable: true,
|
||||||
|
},
|
||||||
|
dragDrop: [{ dragSelector: "[data-drag]", dropSelector: null }],
|
||||||
|
actions: {
|
||||||
|
editImage: MaleficesItemSheet.#onEditImage,
|
||||||
|
postItem: MaleficesItemSheet.#onPostItem,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @type {object} */
|
||||||
|
tabGroups = { primary: "description" }
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = {
|
||||||
|
fields: this.document.schema.fields,
|
||||||
|
systemFields: this.document.system.schema.fields,
|
||||||
|
item: this.document,
|
||||||
|
system: this.document.system,
|
||||||
|
source: this.document.toObject(),
|
||||||
|
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
|
this.document.system.description ?? "", { async: true }
|
||||||
|
),
|
||||||
|
isEditable: this.isEditable,
|
||||||
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
|
isGM: game.user.isGM,
|
||||||
|
config: game.system.malefices.config,
|
||||||
|
}
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
_onRender(context, options) {
|
||||||
|
super._onRender(context, options)
|
||||||
|
this.#dragDrop.forEach((d) => d.bind(this.element))
|
||||||
|
|
||||||
|
// Manual 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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// #region Drag-and-Drop
|
||||||
|
#createDragDropHandlers() {
|
||||||
|
return this.options.dragDrop.map((d) => {
|
||||||
|
d.permissions = {
|
||||||
|
dragstart: this._canDragStart.bind(this),
|
||||||
|
drop: this._canDragDrop.bind(this),
|
||||||
|
}
|
||||||
|
d.callbacks = {
|
||||||
|
dragstart: this._onDragStart.bind(this),
|
||||||
|
dragover: this._onDragOver.bind(this),
|
||||||
|
drop: this._onDrop.bind(this),
|
||||||
|
}
|
||||||
|
return new foundry.applications.ux.DragDrop.implementation(d)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_canDragStart(selector) { return this.isEditable }
|
||||||
|
_canDragDrop(selector) { return this.isEditable }
|
||||||
|
|
||||||
|
_onDragStart(event) {
|
||||||
|
const dragData = { type: "Item", uuid: this.document.uuid }
|
||||||
|
event.dataTransfer.setData("text/plain", JSON.stringify(dragData))
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDragOver(event) {}
|
||||||
|
|
||||||
|
async _onDrop(event) {}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region Actions
|
||||||
|
static async #onEditImage(event, target) {
|
||||||
|
const fp = new FilePicker({
|
||||||
|
type: "image",
|
||||||
|
current: this.document.img,
|
||||||
|
callback: (path) => { this.document.update({ img: path }) },
|
||||||
|
})
|
||||||
|
return fp.browse()
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onPostItem(event, target) {
|
||||||
|
let chatData = foundry.utils.duplicate(this.document)
|
||||||
|
if (this.document.actor) {
|
||||||
|
chatData.actor = { id: this.document.actor.id }
|
||||||
|
}
|
||||||
|
if (chatData.img?.includes("/blank.png")) {
|
||||||
|
chatData.img = null
|
||||||
|
}
|
||||||
|
chatData.jsondata = JSON.stringify({ compendium: "postedItem", payload: chatData })
|
||||||
|
const html = await foundry.applications.handlebars.renderTemplate(
|
||||||
|
'systems/fvtt-malefices/templates/post-item.hbs', chatData
|
||||||
|
)
|
||||||
|
ChatMessage.create({ user: game.user.id, content: html })
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
}
|
||||||
35
modules/applications/sheets/malefices-archetype-sheet.mjs
Normal file
35
modules/applications/sheets/malefices-archetype-sheet.mjs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import MaleficesItemSheet from "./base-item-sheet.mjs"
|
||||||
|
import { MaleficesUtility } from "../../malefices-utility.js"
|
||||||
|
|
||||||
|
export default class MaleficesArchetypeSheet extends MaleficesItemSheet {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["archetype"],
|
||||||
|
position: { width: 620 },
|
||||||
|
window: { contentClasses: ["archetype-content"] },
|
||||||
|
}
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/items/item-archetype-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
tabGroups = { primary: "details" }
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
details: { id: "details", group: "primary", label: "Détails" },
|
||||||
|
description: { id: "description", group: "primary", label: "Description" },
|
||||||
|
}
|
||||||
|
for (const v of Object.values(tabs)) {
|
||||||
|
v.active = this.tabGroups[v.group] === v.id
|
||||||
|
v.cssClass = v.active ? "active" : ""
|
||||||
|
}
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
|
context.tarots = MaleficesUtility.getTarots()
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
33
modules/applications/sheets/malefices-arme-sheet.mjs
Normal file
33
modules/applications/sheets/malefices-arme-sheet.mjs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import MaleficesItemSheet from "./base-item-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MaleficesArmeSheet extends MaleficesItemSheet {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["arme"],
|
||||||
|
position: { width: 640 },
|
||||||
|
window: { contentClasses: ["arme-content"] },
|
||||||
|
}
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/items/item-arme-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
tabGroups = { primary: "details" }
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
details: { id: "details", group: "primary", label: "Détails" },
|
||||||
|
description: { id: "description", group: "primary", label: "Description" },
|
||||||
|
}
|
||||||
|
for (const v of Object.values(tabs)) {
|
||||||
|
v.active = this.tabGroups[v.group] === v.id
|
||||||
|
v.cssClass = v.active ? "active" : ""
|
||||||
|
}
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
225
modules/applications/sheets/malefices-base-actor-sheet.mjs
Normal file
225
modules/applications/sheets/malefices-base-actor-sheet.mjs
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||||
|
|
||||||
|
import { MaleficesUtility } from "../../malefices-utility.js"
|
||||||
|
|
||||||
|
export default class MaleficesActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {
|
||||||
|
|
||||||
|
constructor(options = {}) {
|
||||||
|
super(options)
|
||||||
|
this.#dragDrop = this.#createDragDropHandlers()
|
||||||
|
this._editScore = true
|
||||||
|
}
|
||||||
|
|
||||||
|
#dragDrop
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["fvtt-malefices", "actor"],
|
||||||
|
position: {
|
||||||
|
width: 640,
|
||||||
|
height: 680,
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
submitOnChange: true,
|
||||||
|
},
|
||||||
|
window: {
|
||||||
|
resizable: true,
|
||||||
|
},
|
||||||
|
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
||||||
|
actions: {
|
||||||
|
editImage: MaleficesActorSheet.#onEditImage,
|
||||||
|
toggleSheet: MaleficesActorSheet.#onToggleSheet,
|
||||||
|
editItem: MaleficesActorSheet.#onEditItem,
|
||||||
|
deleteItem: MaleficesActorSheet.#onDeleteItem,
|
||||||
|
createItem: MaleficesActorSheet.#onCreateItem,
|
||||||
|
equipItem: MaleficesActorSheet.#onEquipItem,
|
||||||
|
modifyQuantity: MaleficesActorSheet.#onModifyQuantity,
|
||||||
|
modifyAmmo: MaleficesActorSheet.#onModifyAmmo,
|
||||||
|
rollAttribut: MaleficesActorSheet.#onRollAttribut,
|
||||||
|
rollArme: MaleficesActorSheet.#onRollArme,
|
||||||
|
editSubActor: MaleficesActorSheet.#onEditSubActor,
|
||||||
|
deleteSubActor: MaleficesActorSheet.#onDeleteSubActor,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @type {object} */
|
||||||
|
tabGroups = { primary: "main" }
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
async _prepareContext() {
|
||||||
|
const actor = this.document
|
||||||
|
return {
|
||||||
|
actor,
|
||||||
|
system: actor.system,
|
||||||
|
source: actor.toObject(),
|
||||||
|
fields: actor.schema.fields,
|
||||||
|
systemFields: actor.system.schema.fields,
|
||||||
|
isEditable: this.isEditable,
|
||||||
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
|
isGM: game.user.isGM,
|
||||||
|
config: game.system.malefices.config,
|
||||||
|
editScore: this._editScore,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
_onRender(context, options) {
|
||||||
|
super._onRender(context, options)
|
||||||
|
this.#dragDrop.forEach((d) => d.bind(this.element))
|
||||||
|
|
||||||
|
// Ignore Enter key in text inputs (not textarea)
|
||||||
|
this.element.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key === 'Enter' && e.target.tagName !== 'TEXTAREA') e.preventDefault()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Manual tab navigation
|
||||||
|
const nav = this.element.querySelector('nav.tabs[data-group]')
|
||||||
|
if (nav) {
|
||||||
|
const group = nav.dataset.group
|
||||||
|
const activeTab = this.tabGroups[group] || "main"
|
||||||
|
nav.querySelectorAll('[data-tab]').forEach(link => {
|
||||||
|
link.classList.toggle('active', link.dataset.tab === activeTab)
|
||||||
|
link.addEventListener('click', (event) => {
|
||||||
|
event.preventDefault()
|
||||||
|
this.tabGroups[group] = link.dataset.tab
|
||||||
|
this.render()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach(content => {
|
||||||
|
content.classList.toggle('active', content.dataset.tab === activeTab)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle .update-field change events (legacy support)
|
||||||
|
this.element.querySelectorAll('.update-field').forEach(el => {
|
||||||
|
el.addEventListener('change', (ev) => {
|
||||||
|
const fieldName = ev.currentTarget.dataset.fieldName
|
||||||
|
const value = Number(ev.currentTarget.value)
|
||||||
|
this.actor.update({ [fieldName]: value })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #region Drag-and-Drop
|
||||||
|
#createDragDropHandlers() {
|
||||||
|
return this.options.dragDrop.map((d) => {
|
||||||
|
d.permissions = {
|
||||||
|
dragstart: this._canDragStart.bind(this),
|
||||||
|
drop: this._canDragDrop.bind(this),
|
||||||
|
}
|
||||||
|
d.callbacks = {
|
||||||
|
dragstart: this._onDragStart.bind(this),
|
||||||
|
dragover: this._onDragOver.bind(this),
|
||||||
|
drop: this._onDrop.bind(this),
|
||||||
|
}
|
||||||
|
return new foundry.applications.ux.DragDrop.implementation(d)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_canDragStart(selector) { return this.isEditable }
|
||||||
|
_canDragDrop(selector) { return this.isEditable }
|
||||||
|
|
||||||
|
_onDragStart(event) {
|
||||||
|
const li = event.currentTarget.closest('.item')
|
||||||
|
if (!li) return
|
||||||
|
const itemId = li.dataset.itemId
|
||||||
|
const item = this.actor.items.get(itemId)
|
||||||
|
if (item) {
|
||||||
|
event.dataTransfer.setData("text/plain", JSON.stringify({ type: "Item", uuid: item.uuid }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDragOver(event) {}
|
||||||
|
|
||||||
|
async _onDrop(event) {
|
||||||
|
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
|
||||||
|
if (data?.type === "Actor") {
|
||||||
|
const actor = await fromUuid(data.uuid)
|
||||||
|
if (actor) this.actor.addSubActor(actor.id)
|
||||||
|
} else {
|
||||||
|
super._onDrop(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region Actions
|
||||||
|
static async #onEditImage(event, target) {
|
||||||
|
const fp = new FilePicker({
|
||||||
|
type: "image",
|
||||||
|
current: this.document.img,
|
||||||
|
callback: (path) => { this.document.update({ img: path }) },
|
||||||
|
})
|
||||||
|
return fp.browse()
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onToggleSheet(event, target) {
|
||||||
|
this._editScore = !this._editScore
|
||||||
|
this.render()
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onEditItem(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
const itemId = li?.dataset.itemId
|
||||||
|
if (!itemId) return
|
||||||
|
this.actor.items.get(itemId)?.sheet.render(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onDeleteItem(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
MaleficesUtility.confirmDelete(this, li)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onCreateItem(event, target) {
|
||||||
|
const dataType = target.dataset.type
|
||||||
|
this.actor.createEmbeddedDocuments('Item', [{ name: "NewItem", type: dataType }], { renderSheet: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onEquipItem(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
const itemId = li?.dataset.itemId
|
||||||
|
if (!itemId) return
|
||||||
|
await this.actor.equipItem(itemId)
|
||||||
|
this.render()
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onModifyQuantity(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
const itemId = li?.dataset.itemId
|
||||||
|
if (!itemId) return
|
||||||
|
const delta = parseInt(target.dataset.delta) || 0
|
||||||
|
this.actor.incDecQuantity(itemId, delta)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onModifyAmmo(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
const itemId = li?.dataset.itemId
|
||||||
|
if (!itemId) return
|
||||||
|
const delta = parseInt(target.dataset.delta) || 0
|
||||||
|
this.actor.incDecAmmo(itemId, delta)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onRollAttribut(event, target) {
|
||||||
|
const attrKey = target.dataset.attrKey
|
||||||
|
this.actor.rollAttribut(attrKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onRollArme(event, target) {
|
||||||
|
const armeId = target.dataset.armeId
|
||||||
|
this.actor.rollArme(armeId)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onEditSubActor(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
const actorId = li?.dataset.actorId
|
||||||
|
if (!actorId) return
|
||||||
|
game.actors.get(actorId)?.sheet.render(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onDeleteSubActor(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
const actorId = li?.dataset.actorId
|
||||||
|
if (!actorId) return
|
||||||
|
this.actor.delSubActor(actorId)
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
}
|
||||||
32
modules/applications/sheets/malefices-elementbio-sheet.mjs
Normal file
32
modules/applications/sheets/malefices-elementbio-sheet.mjs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import MaleficesItemSheet from "./base-item-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MaleficesElementbioSheet extends MaleficesItemSheet {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["elementbio"],
|
||||||
|
position: { width: 620 },
|
||||||
|
window: { contentClasses: ["elementbio-content"] },
|
||||||
|
}
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/items/item-elementbio-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
tabGroups = { primary: "description" }
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
description: { id: "description", group: "primary", label: "Description" },
|
||||||
|
}
|
||||||
|
for (const v of Object.values(tabs)) {
|
||||||
|
v.active = this.tabGroups[v.group] === v.id
|
||||||
|
v.cssClass = v.active ? "active" : ""
|
||||||
|
}
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
32
modules/applications/sheets/malefices-equipement-sheet.mjs
Normal file
32
modules/applications/sheets/malefices-equipement-sheet.mjs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import MaleficesItemSheet from "./base-item-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MaleficesEquipementSheet extends MaleficesItemSheet {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["equipement"],
|
||||||
|
position: { width: 620 },
|
||||||
|
window: { contentClasses: ["equipement-content"] },
|
||||||
|
}
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/items/item-equipement-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
tabGroups = { primary: "description" }
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
description: { id: "description", group: "primary", label: "Description" },
|
||||||
|
}
|
||||||
|
for (const v of Object.values(tabs)) {
|
||||||
|
v.active = this.tabGroups[v.group] === v.id
|
||||||
|
v.cssClass = v.active ? "active" : ""
|
||||||
|
}
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
27
modules/applications/sheets/malefices-npc-actor-sheet.mjs
Normal file
27
modules/applications/sheets/malefices-npc-actor-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import MaleficesActorSheet from "./malefices-base-actor-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MaleficesNPCActorSheet extends MaleficesActorSheet {
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["pnj"],
|
||||||
|
position: { width: 560, height: 460 },
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/actors/npc-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
tabGroups = { primary: "main" }
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
|
this.document.system.description ?? "", { async: true }
|
||||||
|
)
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
48
modules/applications/sheets/malefices-personnage-sheet.mjs
Normal file
48
modules/applications/sheets/malefices-personnage-sheet.mjs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import MaleficesActorSheet from "./malefices-base-actor-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MaleficesPersonnageSheet extends MaleficesActorSheet {
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["personnage"],
|
||||||
|
position: { width: 640, height: 680 },
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/actors/actor-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
tabGroups = { primary: "main" }
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
const actor = this.document
|
||||||
|
|
||||||
|
context.armes = foundry.utils.duplicate(actor.getArmes())
|
||||||
|
context.tarots = foundry.utils.duplicate(actor.getTarots())
|
||||||
|
context.tarotsCache = foundry.utils.duplicate(actor.getHiddenTarots())
|
||||||
|
context.archetype = foundry.utils.duplicate(actor.getArchetype())
|
||||||
|
context.equipements = foundry.utils.duplicate(actor.getEquipements())
|
||||||
|
context.elementsbio = actor.getElementsBio()
|
||||||
|
context.sorts = actor.getSorts()
|
||||||
|
context.phyMalus = actor.getPhysiqueMalus()
|
||||||
|
context.subActors = foundry.utils.duplicate(actor.getSubActors())
|
||||||
|
|
||||||
|
// Expose nested biodata schema fields for {{formInput}} helper
|
||||||
|
context.biodataFields = actor.system.schema.fields.biodata.fields
|
||||||
|
|
||||||
|
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
|
actor.system.biodata?.description ?? "", { async: true }
|
||||||
|
)
|
||||||
|
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
|
actor.system.biodata?.notes ?? "", { async: true }
|
||||||
|
)
|
||||||
|
context.enrichedEquipementlibre = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
|
actor.system.equipementlibre ?? "", { async: true }
|
||||||
|
)
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
33
modules/applications/sheets/malefices-sortilege-sheet.mjs
Normal file
33
modules/applications/sheets/malefices-sortilege-sheet.mjs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import MaleficesItemSheet from "./base-item-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MaleficesSortilegeSheet extends MaleficesItemSheet {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["sortilege"],
|
||||||
|
position: { width: 620 },
|
||||||
|
window: { contentClasses: ["sortilege-content"] },
|
||||||
|
}
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/items/item-sortilege-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
tabGroups = { primary: "details" }
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
details: { id: "details", group: "primary", label: "Détails" },
|
||||||
|
description: { id: "description", group: "primary", label: "Description" },
|
||||||
|
}
|
||||||
|
for (const v of Object.values(tabs)) {
|
||||||
|
v.active = this.tabGroups[v.group] === v.id
|
||||||
|
v.cssClass = v.active ? "active" : ""
|
||||||
|
}
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
33
modules/applications/sheets/malefices-tarot-sheet.mjs
Normal file
33
modules/applications/sheets/malefices-tarot-sheet.mjs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import MaleficesItemSheet from "./base-item-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MaleficesTarotSheet extends MaleficesItemSheet {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["tarot"],
|
||||||
|
position: { width: 660, height: 640 },
|
||||||
|
window: { contentClasses: ["tarot-content"] },
|
||||||
|
}
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: { template: "systems/fvtt-malefices/templates/items/item-tarot-sheet.hbs" },
|
||||||
|
}
|
||||||
|
|
||||||
|
tabGroups = { primary: "details" }
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
details: { id: "details", group: "primary", label: "Détails" },
|
||||||
|
description: { id: "description", group: "primary", label: "Description" },
|
||||||
|
}
|
||||||
|
for (const v of Object.values(tabs)) {
|
||||||
|
v.active = this.tabGroups[v.group] === v.id
|
||||||
|
v.cssClass = v.active ? "active" : ""
|
||||||
|
}
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -389,8 +389,7 @@ export class MaleficesActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async startRoll(rollData) {
|
async startRoll(rollData) {
|
||||||
let rollDialog = await MaleficesRollDialog.create(this, rollData)
|
await MaleficesRollDialog.create(this, rollData)
|
||||||
rollDialog.render(true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,6 @@ export class MaleficesCommands {
|
|||||||
tirageData.secretCards.push({ name: "???", img: "systems/fvtt-malefices/images/tarots/background.webp" })
|
tirageData.secretCards.push({ name: "???", img: "systems/fvtt-malefices/images/tarots/background.webp" })
|
||||||
|
|
||||||
let tirageDialog = await MaleficesTirageTarotDialog.create(this, tirageData)
|
let tirageDialog = await MaleficesTirageTarotDialog.create(this, tirageData)
|
||||||
tirageDialog.render(true)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* --------------------------------------------- */
|
/* --------------------------------------------- */
|
||||||
|
|||||||
@@ -80,20 +80,14 @@ export class MaleficesItemSheet extends foundry.appv1.sheets.ItemSheet {
|
|||||||
if (this.actor) {
|
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")) {
|
||||||
if (chatData.img.includes("/blank.png")) {
|
|
||||||
chatData.img = null;
|
chatData.img = null;
|
||||||
}
|
}
|
||||||
// JSON object for easy creation
|
chatData.config = game.system.malefices.config
|
||||||
chatData.jsondata = JSON.stringify(
|
chatData.jsondata = JSON.stringify({ compendium: "postedItem", payload: chatData })
|
||||||
{
|
|
||||||
compendium: "postedItem",
|
|
||||||
payload: chatData,
|
|
||||||
});
|
|
||||||
|
|
||||||
renderTemplate('systems/Malefices/templates/post-item.html', chatData).then(html => {
|
foundry.applications.handlebars.renderTemplate('systems/fvtt-malefices/templates/post-item.hbs', chatData).then(html => {
|
||||||
let chatOptions = MaleficesUtility.chatDataSetup(html);
|
ChatMessage.create(MaleficesUtility.chatDataSetup(html))
|
||||||
ChatMessage.create(chatOptions)
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { MaleficesUtility } from "./malefices-utility.js";
|
import { MaleficesUtility } from "./malefices-utility.js";
|
||||||
|
|
||||||
export const defaultItemImg = {
|
export const defaultItemImg = {
|
||||||
arme: "systems/fvtt-malefices/images/icons/arme.webp",
|
arme: "systems/fvtt-malefices/images/icons/epee.webp",
|
||||||
equipement: "systems/fvtt-malefices/images/icons/equipement.webp",
|
equipement: "systems/fvtt-malefices/images/icons/equipement.webp",
|
||||||
elementbio: "systems/fvtt-malefices/images/icons/wisdom.webp",
|
elementbio: "systems/fvtt-malefices/images/icons/wisdom.webp",
|
||||||
archetype: "systems/fvtt-malefices/images/icons/archetype.webp",
|
archetype: "systems/fvtt-malefices/images/icons/archetype.webp",
|
||||||
|
|||||||
@@ -9,9 +9,6 @@
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// Import Modules
|
// Import Modules
|
||||||
import { MaleficesActor } from "./malefices-actor.js";
|
import { MaleficesActor } from "./malefices-actor.js";
|
||||||
import { MaleficesItemSheet } from "./malefices-item-sheet.js";
|
|
||||||
import { MaleficesActorSheet } from "./malefices-actor-sheet.js";
|
|
||||||
import { MaleficesNPCSheet } from "./malefices-npc-sheet.js";
|
|
||||||
import { MaleficesUtility } from "./malefices-utility.js";
|
import { MaleficesUtility } from "./malefices-utility.js";
|
||||||
import { MaleficesCombat } from "./malefices-combat.js";
|
import { MaleficesCombat } from "./malefices-combat.js";
|
||||||
import { MaleficesItem } from "./malefices-item.js";
|
import { MaleficesItem } from "./malefices-item.js";
|
||||||
@@ -20,6 +17,12 @@ import { MaleficesCharacterSummary } from "./malefices-summary-app.js"
|
|||||||
import { MALEFICES_CONFIG } from "./malefices-config.js"
|
import { MALEFICES_CONFIG } from "./malefices-config.js"
|
||||||
import { ClassCounter} from "https://www.uberwald.me/fvtt_appcount/count-class-ready.js"
|
import { ClassCounter} from "https://www.uberwald.me/fvtt_appcount/count-class-ready.js"
|
||||||
|
|
||||||
|
// Import DataModels
|
||||||
|
import * as models from "./models/index.mjs"
|
||||||
|
|
||||||
|
// Import AppV2 Sheets
|
||||||
|
import * as sheets from "./applications/sheets/_module.mjs"
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Foundry VTT Initialization */
|
/* Foundry VTT Initialization */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -54,33 +57,51 @@ Hooks.once("init", async function () {
|
|||||||
// Define custom Entity classes
|
// Define custom Entity classes
|
||||||
CONFIG.Combat.documentClass = MaleficesCombat
|
CONFIG.Combat.documentClass = MaleficesCombat
|
||||||
CONFIG.Actor.documentClass = MaleficesActor
|
CONFIG.Actor.documentClass = MaleficesActor
|
||||||
|
CONFIG.Actor.dataModels = {
|
||||||
|
personnage: models.PersonnageDataModel,
|
||||||
|
pnj: models.PnjDataModel
|
||||||
|
}
|
||||||
|
|
||||||
CONFIG.Item.documentClass = MaleficesItem
|
CONFIG.Item.documentClass = MaleficesItem
|
||||||
|
CONFIG.Item.dataModels = {
|
||||||
|
arme: models.ArmeDataModel,
|
||||||
|
equipement: models.EquipementDataModel,
|
||||||
|
archetype: models.ArchetypeDataModel,
|
||||||
|
tarot: models.TarotDataModel,
|
||||||
|
sortilege: models.SortilegeDataModel,
|
||||||
|
elementbio: models.ElementbioDataModel
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// Register sheet application classes
|
// Register AppV2 Actor Sheets
|
||||||
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
|
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
|
||||||
foundry.documents.collections.Actors.registerSheet("fvtt-malefices", MaleficesActorSheet, { types: ["personnage"], makeDefault: true });
|
foundry.documents.collections.Actors.registerSheet("fvtt-malefices", sheets.MaleficesPersonnageSheet, { types: ["personnage"], makeDefault: true });
|
||||||
foundry.documents.collections.Actors.registerSheet("fvtt-malefices", MaleficesNPCSheet, { types: ["pnj"], makeDefault: false });
|
foundry.documents.collections.Actors.registerSheet("fvtt-malefices", sheets.MaleficesNPCActorSheet, { types: ["pnj"], makeDefault: true });
|
||||||
|
|
||||||
|
// Register AppV2 Item Sheets
|
||||||
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
|
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
|
||||||
foundry.documents.collections.Items.registerSheet("fvtt-malefices", MaleficesItemSheet, { makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-malefices", sheets.MaleficesArmeSheet, { types: ["arme"], makeDefault: true });
|
||||||
|
foundry.documents.collections.Items.registerSheet("fvtt-malefices", sheets.MaleficesEquipementSheet, { types: ["equipement"], makeDefault: true });
|
||||||
|
foundry.documents.collections.Items.registerSheet("fvtt-malefices", sheets.MaleficesArchetypeSheet, { types: ["archetype"], makeDefault: true });
|
||||||
|
foundry.documents.collections.Items.registerSheet("fvtt-malefices", sheets.MaleficesTarotSheet, { types: ["tarot"], makeDefault: true });
|
||||||
|
foundry.documents.collections.Items.registerSheet("fvtt-malefices", sheets.MaleficesSortilegeSheet, { types: ["sortilege"], makeDefault: true });
|
||||||
|
foundry.documents.collections.Items.registerSheet("fvtt-malefices", sheets.MaleficesElementbioSheet, { types: ["elementbio"], makeDefault: true });
|
||||||
|
|
||||||
MaleficesUtility.init()
|
MaleficesUtility.init()
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
function welcomeMessage() {
|
async function welcomeMessage() {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
|
'systems/fvtt-malefices/templates/chat/welcome-message.hbs', {}
|
||||||
|
)
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
whisper: [game.user.id],
|
whisper: [game.user.id],
|
||||||
content: `<div id="welcome-message-malefices"><span class="rdd-roll-part">
|
content
|
||||||
<strong>Bienvenu dans Malefices, le JDR qui sent le souffre !</strong>
|
});
|
||||||
<p>Le Livre de Base de Maléfices v4 est nécessaire pour jouer : https://arkhane-asylum.fr/en/malefices/</p>
|
|
||||||
<p>Maléfices et un jeu de rôle publié par Arkhane Asylum Publishing, tout les droits leur appartiennent.</p>
|
|
||||||
<p>Système développé par LeRatierBretonnien avec l'aide de la Dame du Lac et Malik, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p>
|
|
||||||
<p>Commandes : /tirage pour le tirage des tarots, /carte pour tirer une simple carte et /resume pour le résumé des PJs (MJ seulement)` });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,91 +1,57 @@
|
|||||||
import { MaleficesUtility } from "./malefices-utility.js";
|
import { MaleficesUtility } from "./malefices-utility.js";
|
||||||
|
|
||||||
export class MaleficesRollDialog extends Dialog {
|
export class MaleficesRollDialog {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async create(actor, rollData) {
|
static async create(actor, rollData) {
|
||||||
|
const isCard = rollData?.attr?.iscard
|
||||||
|
const template = isCard
|
||||||
|
? 'systems/fvtt-malefices/templates/dialogs/confrontation-dialog.hbs'
|
||||||
|
: 'systems/fvtt-malefices/templates/dialogs/roll-dialog-generic.hbs'
|
||||||
|
|
||||||
let options = { classes: ["MaleficesDialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
|
const content = await foundry.applications.handlebars.renderTemplate(template, rollData)
|
||||||
let html
|
|
||||||
if (rollData?.attr?.iscard) {
|
|
||||||
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-malefices/templates/dialogs/confrontation-dialog.hbs', rollData);
|
|
||||||
} else {
|
|
||||||
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-malefices/templates/dialogs/roll-dialog-generic.hbs', rollData);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new MaleficesRollDialog(actor, rollData, html, options);
|
return foundry.applications.api.DialogV2.wait({
|
||||||
}
|
window: {
|
||||||
|
title: isCard ? "Tirage" : "Jet de dé",
|
||||||
/* -------------------------------------------- */
|
icon: isCard ? "fa-solid fa-layer-group" : "fa-solid fa-dice-d20",
|
||||||
constructor(actor, rollData, html, options, close = undefined) {
|
|
||||||
let isCard = rollData?.attr?.iscard
|
|
||||||
let conf = {
|
|
||||||
title: (isCard) ? "Jet" : "Tirage",
|
|
||||||
content: html,
|
|
||||||
buttons: {
|
|
||||||
roll: {
|
|
||||||
icon: '<i class="fas fa-check"></i>',
|
|
||||||
label: (isCard) ? "Tirer une carte" : "Lancer le dé",
|
|
||||||
callback: () => { this.roll() }
|
|
||||||
},
|
|
||||||
cancel: {
|
|
||||||
icon: '<i class="fas fa-times"></i>',
|
|
||||||
label: "Annuler",
|
|
||||||
callback: () => { this.close() }
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
close: close
|
classes: ["malefices-roll-dialog"],
|
||||||
}
|
position: { width: 540 },
|
||||||
|
modal: false,
|
||||||
super(conf, options);
|
rejectClose: false,
|
||||||
|
content,
|
||||||
this.actor = actor;
|
buttons: [
|
||||||
this.rollData = rollData;
|
{
|
||||||
|
action: "roll",
|
||||||
|
label: isCard ? "Tirer une carte" : "Lancer le dé",
|
||||||
|
icon: isCard ? "fa-solid fa-layer-group" : "fa-solid fa-check",
|
||||||
|
default: true,
|
||||||
|
callback: (event, button, dialog) => {
|
||||||
|
MaleficesRollDialog._updateRollDataFromForm(rollData, button.form.elements)
|
||||||
|
if (isCard) {
|
||||||
|
MaleficesUtility.tirageConfrontationMalefices(rollData)
|
||||||
|
} else {
|
||||||
|
MaleficesUtility.rollMalefices(rollData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action: "cancel",
|
||||||
|
label: "Annuler",
|
||||||
|
icon: "fa-solid fa-times",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
roll() {
|
static _updateRollDataFromForm(rollData, elements) {
|
||||||
let isCard = this.rollData?.attr?.iscard
|
if (elements.bonusMalusPerso) rollData.bonusMalusPerso = Number(elements.bonusMalusPerso.value)
|
||||||
if (isCard) {
|
if (elements.bonusMalusSituation) rollData.bonusMalusSituation = Number(elements.bonusMalusSituation.value)
|
||||||
MaleficesUtility.tirageConfrontationMalefices(this.rollData)
|
if (elements.bonusMalusDef) rollData.bonusMalusDef = Number(elements.bonusMalusDef.value)
|
||||||
} else {
|
if (elements.bonusMalusPortee) rollData.bonusMalusPortee = Number(elements.bonusMalusPortee.value)
|
||||||
MaleficesUtility.rollMalefices(this.rollData)
|
if (elements.confrontationDegre) rollData.confrontationDegre = Number(elements.confrontationDegre.value)
|
||||||
}
|
if (elements.confrontationModif) rollData.confrontationModif = Number(elements.confrontationModif.value)
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async refreshDialog() {
|
|
||||||
const content = await renderTemplate("systems/fvtt-malefices/templates/dialogs/roll-dialog-generic.hbs", this.rollData)
|
|
||||||
this.data.content = content
|
|
||||||
this.render(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
|
|
||||||
function onLoad() {
|
|
||||||
}
|
|
||||||
$(function () { onLoad(); });
|
|
||||||
|
|
||||||
html.find('#bonusMalusSituation').change((event) => {
|
|
||||||
this.rollData.bonusMalusSituation = Number(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
html.find('#bonusMalusPerso').change((event) => {
|
|
||||||
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
html.find('#bonusMalusDef').change((event) => {
|
|
||||||
this.rollData.bonusMalusDef = Number(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
html.find('#bonusMalusPortee').change((event) => {
|
|
||||||
this.rollData.bonusMalusPortee = Number(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
html.find('#confrontationDegre').change((event) => {
|
|
||||||
this.rollData.confrontationDegre = Number(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
html.find('#confrontationModif').change((event) => {
|
|
||||||
this.rollData.confrontationModif = Number(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,134 +1,133 @@
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
import { MaleficesUtility } from "./malefices-utility.js";
|
import { MaleficesUtility } from "./malefices-utility.js";
|
||||||
|
|
||||||
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class MaleficesCharacterSummary extends Application {
|
export class MaleficesCharacterSummary extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: "malefices-character-summary",
|
||||||
|
classes: ["MaleficesDialog"],
|
||||||
|
window: { title: "Résumé des Personnages", resizable: true },
|
||||||
|
position: { width: 960, height: "auto" },
|
||||||
|
dragDrop: [{ dragSelector: null, dropSelector: ".character-summary-container" }],
|
||||||
|
}
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
form: { template: "systems/fvtt-malefices/templates/dialogs/character-summary.hbs" }
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static displayPCSummary() {
|
static displayPCSummary() {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
game.system.malefices.charSummary.render(true)
|
game.system.malefices.charSummary.render({ force: true })
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.info("Commande /tirage réservée au MJ !")
|
ui.notifications.info("Commande /resume réservée au MJ !")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
updatePCSummary() {
|
updatePCSummary() {
|
||||||
if (this.rendered) {
|
if (this.element?.isConnected) {
|
||||||
this.render(true)
|
this.render({ force: true })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static createSummaryPos() {
|
|
||||||
return { top: 200, left: 200 };
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static ready() {
|
static ready() {
|
||||||
if (!game.user.isGM) { // Uniquement si GM
|
if (!game.user.isGM) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let charSummary = new MaleficesCharacterSummary()
|
game.system.malefices.charSummary = new MaleficesCharacterSummary()
|
||||||
game.system.malefices.charSummary = charSummary
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor() {
|
constructor(options = {}) {
|
||||||
super();
|
super(options)
|
||||||
//game.settings.set("world", "character-summary-data", {npcList: [], x:0, y:0})
|
const saved = game.settings.get("world", "character-summary-data")
|
||||||
this.settings = game.settings.get("world", "character-summary-data")
|
this.extraList = saved.extraList ?? saved.npcList ?? []
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static get defaultOptions() {
|
async _prepareContext(_options) {
|
||||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
const pcs = game.actors.filter(ac => ac.type === "personnage" && ac.hasPlayerOwner)
|
||||||
template: "systems/fvtt-malefices/templates/dialogs/character-summary.hbs",
|
const extras = []
|
||||||
popOut: true,
|
const validList = []
|
||||||
resizable: true,
|
for (const actorId of this.extraList) {
|
||||||
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
|
const actor = game.actors.get(actorId)
|
||||||
classes: ["bol", "dialog"], width: 920, height: 'fit-content'
|
if (actor) { extras.push(actor); validList.push(actorId) }
|
||||||
|
}
|
||||||
|
if (validList.length !== this.extraList.length) {
|
||||||
|
this.extraList = validList
|
||||||
|
this._persist()
|
||||||
|
}
|
||||||
|
return { pcs, extras, config: game.system.malefices.config }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
_onRender(_context, _options) {
|
||||||
|
const el = this.element
|
||||||
|
|
||||||
|
el.querySelectorAll('.actor-open').forEach(a => {
|
||||||
|
a.addEventListener('click', event => {
|
||||||
|
const li = event.currentTarget.closest('.item')
|
||||||
|
const actor = game.actors.get(li.dataset.actorId)
|
||||||
|
actor?.sheet.render(true)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
el.querySelectorAll('.summary-roll').forEach(a => {
|
||||||
|
a.addEventListener('click', event => {
|
||||||
|
const li = event.currentTarget.closest('.item')
|
||||||
|
const actor = game.actors.get(li.dataset.actorId)
|
||||||
|
const key = event.currentTarget.dataset.key
|
||||||
|
actor?.rollAttribut(key)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
el.querySelectorAll('.actor-delete').forEach(a => {
|
||||||
|
a.addEventListener('click', event => {
|
||||||
|
const li = event.currentTarget.closest('.item')
|
||||||
|
this.extraList = this.extraList.filter(id => id !== li.dataset.actorId)
|
||||||
|
this._persist()
|
||||||
|
this.render({ force: true })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const dropZone = el.querySelector('.character-summary-container')
|
||||||
|
if (dropZone) {
|
||||||
|
dropZone.addEventListener('dragover', ev => ev.preventDefault())
|
||||||
|
dropZone.addEventListener('drop', ev => { ev.stopPropagation(); this._onDrop(ev) })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getData() {
|
_canDragDrop(_selector) { return true }
|
||||||
let formData = super.getData();
|
|
||||||
|
|
||||||
formData.pcs = game.actors.filter(ac => ac.type == "personnage" && ac.hasPlayerOwner)
|
/* -------------------------------------------- */
|
||||||
formData.npcs = []
|
_persist() {
|
||||||
let newList = []
|
const saved = game.settings.get("world", "character-summary-data")
|
||||||
let toUpdate = false
|
game.settings.set("world", "character-summary-data", { ...saved, extraList: this.extraList })
|
||||||
for (let actorId of this.settings.npcList) {
|
|
||||||
let actor = game.actors.get(actorId)
|
|
||||||
if (actor) {
|
|
||||||
formData.npcs.push(actor)
|
|
||||||
newList.push(actorId)
|
|
||||||
} else {
|
|
||||||
toUpdate = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
formData.config = game.system.malefices.config
|
|
||||||
|
|
||||||
if (toUpdate) {
|
|
||||||
this.settings.npcList = newList
|
|
||||||
//console.log("Going to update ...", this.settings)
|
|
||||||
game.settings.set("world", "character-summary-data", this.settings)
|
|
||||||
}
|
|
||||||
|
|
||||||
return formData
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
updateNPC() {
|
_saveAndRefresh() {
|
||||||
game.settings.set("world", "character-summary-data", game.system.malefices.charSummary.settings)
|
this.render({ force: true })
|
||||||
game.system.malefices.charSummary.close()
|
|
||||||
setTimeout(function () { game.system.malefices.charSummary.render(true) }, 500)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _onDrop(event) {
|
async _onDrop(event) {
|
||||||
//console.log("Dragged data are : ", dragData)
|
try {
|
||||||
let data = event.dataTransfer.getData('text/plain')
|
const dataItem = JSON.parse(event.dataTransfer.getData('text/plain'))
|
||||||
let dataItem = JSON.parse(data)
|
const actor = fromUuidSync(dataItem.uuid)
|
||||||
let actor = fromUuidSync(dataItem.uuid)
|
if (actor && !this.extraList.includes(actor.id)) {
|
||||||
if (actor) {
|
this.extraList.push(actor.id)
|
||||||
game.system.malefices.charSummary.settings.npcList.push(actor.id)
|
this._persist()
|
||||||
game.system.malefices.charSummary.updateNPC()
|
this.render({ force: true })
|
||||||
|
}
|
||||||
} else {
|
} catch(e) { /* not a valid drag payload */ }
|
||||||
ui.notifications.warn("Pas d'acteur trouvé")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
/** @override */
|
|
||||||
async activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
|
|
||||||
html.find('.actor-open').click((event) => {
|
|
||||||
const li = $(event.currentTarget).parents(".item")
|
|
||||||
const actor = game.actors.get(li.data("actor-id"))
|
|
||||||
actor.sheet.render(true)
|
|
||||||
})
|
|
||||||
|
|
||||||
html.find('.summary-roll').click((event) => {
|
|
||||||
const li = $(event.currentTarget).parents(".item")
|
|
||||||
const actor = game.actors.get(li.data("actor-id"))
|
|
||||||
let type = $(event.currentTarget).data("type")
|
|
||||||
let key = $(event.currentTarget).data("key")
|
|
||||||
actor.rollAttribut(key)
|
|
||||||
})
|
|
||||||
|
|
||||||
html.find('.actor-delete').click(event => {
|
|
||||||
const li = $(event.currentTarget).parents(".item");
|
|
||||||
let actorId = li.data("actor-id")
|
|
||||||
let newList = game.system.malefices.charSummary.settings.npcList.filter(id => id != actorId)
|
|
||||||
game.system.malefices.charSummary.settings.npcList = newList
|
|
||||||
game.system.malefices.charSummary.updateNPC()
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,155 +1,132 @@
|
|||||||
import { MaleficesUtility } from "./malefices-utility.js";
|
import { MaleficesUtility } from "./malefices-utility.js";
|
||||||
|
|
||||||
export class MaleficesTirageTarotDialog extends Dialog {
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api
|
||||||
|
|
||||||
|
export class MaleficesTirageTarotDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async create(actor, tirageData) {
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: "malefices-tirage-tarot",
|
||||||
|
classes: ["MaleficesDialog"],
|
||||||
|
window: { title: "Tirage des Tarots", resizable: true },
|
||||||
|
position: { width: 720, height: 740 },
|
||||||
|
}
|
||||||
|
|
||||||
let options = { classes: ["MaleficesDialog"], width: 720, height: 740, 'z-index': 99999 };
|
static PARTS = {
|
||||||
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-malefices/templates/dialogs/tirage-tarot-dialog.hbs', tirageData);
|
form: { template: 'systems/fvtt-malefices/templates/dialogs/tirage-tarot-dialog.hbs' }
|
||||||
|
|
||||||
return new MaleficesTirageTarotDialog(actor, tirageData, html, options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(actor, tirageData, html, options, close = undefined) {
|
constructor(actor, tirageData, options = {}) {
|
||||||
let conf = {
|
super(options)
|
||||||
title: "Tirage des tarots",
|
this.actor = actor
|
||||||
content: html,
|
this.tirageData = tirageData
|
||||||
buttons: {
|
}
|
||||||
cancel: {
|
|
||||||
icon: '<i class="fas fa-times"></i>',
|
|
||||||
label: "Fermer/Annuler",
|
|
||||||
callback: () => { this.close() }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
close: close
|
|
||||||
}
|
|
||||||
|
|
||||||
super(conf, options);
|
/* -------------------------------------------- */
|
||||||
|
static async create(actor, tirageData) {
|
||||||
|
const app = new MaleficesTirageTarotDialog(actor, tirageData)
|
||||||
|
app.render({ force: true })
|
||||||
|
return app
|
||||||
|
}
|
||||||
|
|
||||||
this.actor = actor;
|
/* -------------------------------------------- */
|
||||||
this.tirageData = tirageData;
|
async _prepareContext(_options) {
|
||||||
|
return { ...this.tirageData }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
_onRender(_context, _options) {
|
||||||
|
const el = this.element
|
||||||
|
|
||||||
|
el.querySelector('#playerId')?.addEventListener('change', (event) => {
|
||||||
|
if (event.currentTarget.value !== "none") {
|
||||||
|
this.tirageData.playerId = event.currentTarget.value
|
||||||
|
this.processSelectedPlayer()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
el.querySelector('#actorId')?.addEventListener('change', (event) => {
|
||||||
|
if (event.currentTarget.value !== "none") {
|
||||||
|
this.attributeToActor(event.currentTarget.value)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
el.querySelector('.tirage-close-btn')?.addEventListener('click', () => this.close())
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async sendCardRequest() {
|
async sendCardRequest() {
|
||||||
this.tirageData.state = 'waiting-user-card'
|
this.tirageData.state = 'waiting-user-card'
|
||||||
let msg = await MaleficesUtility.createChatMessage(this.tirageData.user.name, "useronly", {
|
await MaleficesUtility.createChatMessage(this.tirageData.user.name, "useronly", {
|
||||||
content: await renderTemplate(`systems/fvtt-malefices/templates/chat/request-tarot-card.hbs`, this.tirageData)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/request-tarot-card.hbs`, this.tirageData)
|
||||||
})
|
})
|
||||||
//msg.setFlag("world", "tirage-data", this.tirageData)
|
|
||||||
console.log("MSG IS", msg)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
drawCard() {
|
drawCard() {
|
||||||
let index = Math.round(Math.random() * (this.tirageData.deck.length-1))
|
let index = Math.round(Math.random() * (this.tirageData.deck.length - 1))
|
||||||
let selectedCard = this.tirageData.deck[index]
|
let selectedCard = this.tirageData.deck[index]
|
||||||
selectedCard.system.ispositif = true
|
selectedCard.system.ispositif = true
|
||||||
if ( selectedCard.system.isdualside) { // Cas des cartes pouvant avoir 2 sens
|
if (selectedCard.system.isdualside) {
|
||||||
selectedCard.system.ispositif = (Math.random() > 0.5)
|
selectedCard.system.ispositif = (Math.random() > 0.5)
|
||||||
}
|
}
|
||||||
console.log("CARD SELECTED:", selectedCard)
|
|
||||||
// Cas spécial de la Roue de la Fortune
|
// Cas spécial de la Roue de la Fortune
|
||||||
if ( selectedCard.name.toLowerCase().includes("fortune")) {
|
if (selectedCard.name.toLowerCase().includes("fortune")) {
|
||||||
this.tirageData.maxPlayerCard += 1
|
this.tirageData.maxPlayerCard += 1
|
||||||
this.tirageData.maxSecretCard += 1
|
this.tirageData.maxSecretCard += 1
|
||||||
}
|
}
|
||||||
let newList = []
|
this.tirageData.deck = this.tirageData.deck.filter(c => c.name !== selectedCard.name)
|
||||||
for(let card of this.tirageData.deck) {
|
|
||||||
if (card.name != selectedCard.name) {
|
|
||||||
newList.push(card)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.tirageData.deck = newList
|
|
||||||
|
|
||||||
return selectedCard
|
return selectedCard
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async addCard( msgId ) {
|
async addCard(msgId) {
|
||||||
MaleficesUtility.removeChatMessageId(msgId)
|
MaleficesUtility.removeChatMessageId(msgId)
|
||||||
|
|
||||||
let selectedCard = this.drawCard()
|
let selectedCard = this.drawCard()
|
||||||
selectedCard.system.isgm = false
|
selectedCard.system.isgm = false
|
||||||
await MaleficesUtility.createChatMessage(this.tirageData.user.name, "gmroll", {
|
await MaleficesUtility.createChatMessage(this.tirageData.user.name, "gmroll", {
|
||||||
content: await renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard)
|
||||||
})
|
})
|
||||||
if (this.tirageData.cards[0].name == "???") {
|
if (this.tirageData.cards[0].name == "???") this.tirageData.cards.shift()
|
||||||
this.tirageData.cards.shift()
|
|
||||||
}
|
|
||||||
this.tirageData.cards.push(selectedCard)
|
this.tirageData.cards.push(selectedCard)
|
||||||
this.tirageData.nbCard++
|
this.tirageData.nbCard++
|
||||||
|
|
||||||
if (this.tirageData.nbCard == this.tirageData.maxPlayerCard) {
|
if (this.tirageData.nbCard == this.tirageData.maxPlayerCard) {
|
||||||
for (let i=0; i<this.tirageData.maxSecretCard; i++) {
|
for (let i = 0; i < this.tirageData.maxSecretCard; i++) {
|
||||||
let selectedCard = this.drawCard()
|
let secretCard = this.drawCard()
|
||||||
selectedCard.system.isgm = true
|
secretCard.system.isgm = true
|
||||||
await MaleficesUtility.createChatMessage(this.tirageData.user.name, "blindroll", {
|
await MaleficesUtility.createChatMessage(this.tirageData.user.name, "blindroll", {
|
||||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, secretCard)
|
||||||
})
|
})
|
||||||
if (this.tirageData.secretCards[0].name == "???") {
|
if (this.tirageData.secretCards[0].name == "???") this.tirageData.secretCards.shift()
|
||||||
this.tirageData.secretCards.shift()
|
this.tirageData.secretCards.push(secretCard)
|
||||||
}
|
|
||||||
this.tirageData.secretCards.push(selectedCard)
|
|
||||||
}
|
}
|
||||||
this.tirageData.actors = foundry.utils.duplicate(game.actors)
|
this.tirageData.actors = foundry.utils.duplicate(game.actors)
|
||||||
this.tirageData.state = 'attribute-to-actor'
|
this.tirageData.state = 'attribute-to-actor'
|
||||||
}else {
|
} else {
|
||||||
this.sendCardRequest()
|
this.sendCardRequest()
|
||||||
}
|
}
|
||||||
this.refreshDialog()
|
this.render({ force: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async processSelectedPlayer() {
|
async processSelectedPlayer() {
|
||||||
let user = game.users.get(this.tirageData.playerId)
|
this.tirageData.user = game.users.get(this.tirageData.playerId)
|
||||||
this.tirageData.user = user
|
|
||||||
this.tirageData.players = null
|
this.tirageData.players = null
|
||||||
console.log("Going to work with ", user.name)
|
|
||||||
game.system.malefices.currentTirage = this
|
game.system.malefices.currentTirage = this
|
||||||
this.refreshDialog()
|
this.render({ force: true })
|
||||||
this.sendCardRequest()
|
this.sendCardRequest()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
attributeToActor(actorId) {
|
attributeToActor(actorId) {
|
||||||
let actor = game.actors.get(actorId)
|
const actor = game.actors.get(actorId)
|
||||||
if (actor) {
|
if (actor) {
|
||||||
actor.createEmbeddedDocuments('Item', this.tirageData.cards)
|
actor.createEmbeddedDocuments('Item', this.tirageData.cards)
|
||||||
actor.createEmbeddedDocuments('Item', this.tirageData.secretCards)
|
actor.createEmbeddedDocuments('Item', this.tirageData.secretCards)
|
||||||
ui.notifications.info("Les cartes ont été attribuées à " + actor.name)
|
ui.notifications.info("Les cartes ont été attribuées à " + actor.name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
|
||||||
async refreshDialog() {
|
|
||||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-malefices/templates/dialogs/tirage-tarot-dialog.hbs", this.tirageData)
|
|
||||||
this.data.content = content
|
|
||||||
this.render(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
|
|
||||||
let dialog = this;
|
|
||||||
function onLoad() {
|
|
||||||
}
|
|
||||||
$(function () { onLoad(); });
|
|
||||||
|
|
||||||
html.find('#playerId').change((event) => {
|
|
||||||
if ( event.currentTarget.value != "none") {
|
|
||||||
dialog.tirageData.playerId = event.currentTarget.value
|
|
||||||
dialog.processSelectedPlayer()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
html.find('#actorId').change((event) => {
|
|
||||||
if ( event.currentTarget.value != "none") {
|
|
||||||
let actorId = event.currentTarget.value
|
|
||||||
dialog.attributeToActor(actorId)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ export class MaleficesUtility {
|
|||||||
name: "character-summary-data",
|
name: "character-summary-data",
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: false,
|
config: false,
|
||||||
default: { npcList: [], x: 200, y: 200 },
|
default: { extraList: [], x: 200, y: 200 },
|
||||||
type: Object
|
type: Object
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -135,8 +135,13 @@ export class MaleficesUtility {
|
|||||||
|
|
||||||
const templatePaths = [
|
const templatePaths = [
|
||||||
'systems/fvtt-malefices/templates/actors/editor-notes-gm.hbs',
|
'systems/fvtt-malefices/templates/actors/editor-notes-gm.hbs',
|
||||||
|
'systems/fvtt-malefices/templates/items/partial-item-header.hbs',
|
||||||
'systems/fvtt-malefices/templates/items/partial-item-nav.hbs',
|
'systems/fvtt-malefices/templates/items/partial-item-nav.hbs',
|
||||||
'systems/fvtt-malefices/templates/items/partial-item-description.hbs'
|
'systems/fvtt-malefices/templates/items/partial-item-description.hbs',
|
||||||
|
'systems/fvtt-malefices/templates/post-item.hbs',
|
||||||
|
'systems/fvtt-malefices/templates/actors/npc-sheet.hbs',
|
||||||
|
'systems/fvtt-malefices/templates/chat/welcome-message.hbs',
|
||||||
|
'systems/fvtt-malefices/templates/dialogs/character-summary.hbs'
|
||||||
]
|
]
|
||||||
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
||||||
}
|
}
|
||||||
@@ -385,7 +390,7 @@ export class MaleficesUtility {
|
|||||||
rollData.total = selectedCard.value
|
rollData.total = selectedCard.value
|
||||||
rollData.selectedCard = selectedCard
|
rollData.selectedCard = selectedCard
|
||||||
await MaleficesUtility.createChatMessage(actor.name, "gmroll", {
|
await MaleficesUtility.createChatMessage(actor.name, "gmroll", {
|
||||||
content: await renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard)
|
||||||
})
|
})
|
||||||
|
|
||||||
this.computeResults(rollData)
|
this.computeResults(rollData)
|
||||||
@@ -399,7 +404,7 @@ export class MaleficesUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await MaleficesUtility.createChatMessage(actor.name, "gmroll", {
|
await MaleficesUtility.createChatMessage(actor.name, "gmroll", {
|
||||||
content: await renderTemplate(`systems/fvtt-malefices/templates/chat/chat-confrontation-result.hbs`, rollData)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/chat-confrontation-result.hbs`, rollData)
|
||||||
})
|
})
|
||||||
this.processSpecialCard(actor, rollData)
|
this.processSpecialCard(actor, rollData)
|
||||||
}
|
}
|
||||||
@@ -554,30 +559,16 @@ export class MaleficesUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async confirmDelete(actorSheet, li) {
|
static async confirmDelete(actorSheet, li) {
|
||||||
let itemId = li.data("item-id");
|
const itemId = li.dataset.itemId;
|
||||||
let msgTxt = "<p>Are you sure to remove this Item ?";
|
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
||||||
let buttons = {
|
window: { title: "Confirmer la suppression" },
|
||||||
delete: {
|
content: "<p>Supprimer cet objet ?</p>",
|
||||||
icon: '<i class="fas fa-check"></i>',
|
yes: { label: "Supprimer", icon: "fas fa-trash" },
|
||||||
label: "Yes, remove it",
|
no: { label: "Annuler", icon: "fas fa-times" },
|
||||||
callback: () => {
|
|
||||||
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
|
||||||
li.slideUp(200, () => actorSheet.render(false));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
cancel: {
|
|
||||||
icon: '<i class="fas fa-times"></i>',
|
|
||||||
label: "Cancel"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
msgTxt += "</p>";
|
|
||||||
let d = new Dialog({
|
|
||||||
title: "Confirm removal",
|
|
||||||
content: msgTxt,
|
|
||||||
buttons: buttons,
|
|
||||||
default: "cancel"
|
|
||||||
});
|
});
|
||||||
d.render(true);
|
if (confirmed) {
|
||||||
|
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
12
modules/models/archetype.mjs
Normal file
12
modules/models/archetype.mjs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les archétypes
|
||||||
|
*/
|
||||||
|
export default class ArchetypeDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
lametutelaire: new fields.StringField({ initial: "" }),
|
||||||
|
description: new fields.HTMLField({ initial: "" })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
19
modules/models/arme.mjs
Normal file
19
modules/models/arme.mjs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les armes
|
||||||
|
*/
|
||||||
|
export default class ArmeDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
armetype: new fields.StringField({ initial: "" }),
|
||||||
|
porteecourte: new fields.StringField({ initial: "" }),
|
||||||
|
porteemoyenne: new fields.StringField({ initial: "" }),
|
||||||
|
dommagenormale: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
dommagepart: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
dommagecritique: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
dommagecritiqueKO: new fields.BooleanField({ initial: false }),
|
||||||
|
dommagecritiquemort: new fields.BooleanField({ initial: false }),
|
||||||
|
description: new fields.HTMLField({ initial: "" })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
11
modules/models/elementbio.mjs
Normal file
11
modules/models/elementbio.mjs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les éléments biographiques
|
||||||
|
*/
|
||||||
|
export default class ElementbioDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
description: new fields.HTMLField({ initial: "" })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
11
modules/models/equipement.mjs
Normal file
11
modules/models/equipement.mjs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les équipements
|
||||||
|
*/
|
||||||
|
export default class EquipementDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
description: new fields.HTMLField({ initial: "" })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
15
modules/models/index.mjs
Normal file
15
modules/models/index.mjs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Index des DataModels pour Maléfices
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Modèles d'acteurs
|
||||||
|
export { default as PersonnageDataModel } from './personnage.mjs';
|
||||||
|
export { default as PnjDataModel } from './pnj.mjs';
|
||||||
|
|
||||||
|
// Modèles d'items
|
||||||
|
export { default as ArmeDataModel } from './arme.mjs';
|
||||||
|
export { default as EquipementDataModel } from './equipement.mjs';
|
||||||
|
export { default as ArchetypeDataModel } from './archetype.mjs';
|
||||||
|
export { default as TarotDataModel } from './tarot.mjs';
|
||||||
|
export { default as SortilegeDataModel } from './sortilege.mjs';
|
||||||
|
export { default as ElementbioDataModel } from './elementbio.mjs';
|
||||||
95
modules/models/personnage.mjs
Normal file
95
modules/models/personnage.mjs
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les personnages joueurs (type "personnage")
|
||||||
|
*/
|
||||||
|
export default class PersonnageDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
// Template biodata
|
||||||
|
biodata: new fields.SchemaField({
|
||||||
|
age: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
size: new fields.StringField({ initial: "" }),
|
||||||
|
lieunaissance: new fields.StringField({ initial: "" }),
|
||||||
|
nationalite: new fields.StringField({ initial: "" }),
|
||||||
|
profession: new fields.StringField({ initial: "" }),
|
||||||
|
residence: new fields.StringField({ initial: "" }),
|
||||||
|
milieusocial: new fields.StringField({ initial: "" }),
|
||||||
|
poids: new fields.StringField({ initial: "" }),
|
||||||
|
cheveux: new fields.StringField({ initial: "" }),
|
||||||
|
sexe: new fields.StringField({ initial: "" }),
|
||||||
|
yeux: new fields.StringField({ initial: "" }),
|
||||||
|
enfance: new fields.StringField({ initial: "" }),
|
||||||
|
adulte: new fields.StringField({ initial: "" }),
|
||||||
|
loisirs: new fields.StringField({ initial: "" }),
|
||||||
|
singularite: new fields.StringField({ initial: "" }),
|
||||||
|
politique: new fields.StringField({ initial: "" }),
|
||||||
|
religion: new fields.StringField({ initial: "" }),
|
||||||
|
fantastique: new fields.StringField({ initial: "" }),
|
||||||
|
description: new fields.HTMLField({ initial: "" }),
|
||||||
|
notes: new fields.HTMLField({ initial: "" }),
|
||||||
|
gmnotes: new fields.HTMLField({ initial: "" })
|
||||||
|
}),
|
||||||
|
// Template core
|
||||||
|
subactors: new fields.ArrayField(new fields.StringField(), { initial: [] }),
|
||||||
|
lamesdestin: new fields.ArrayField(new fields.StringField(), { initial: [] }),
|
||||||
|
pointdestin: new fields.NumberField({ initial: 1, integer: true }),
|
||||||
|
fluide: new fields.NumberField({ initial: 5, integer: true }),
|
||||||
|
mpmb: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
mpmn: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
equipementlibre: new fields.HTMLField({ initial: "" }),
|
||||||
|
attributs: new fields.SchemaField({
|
||||||
|
constitution: new fields.SchemaField({
|
||||||
|
label: new fields.StringField({ initial: "Constitution" }),
|
||||||
|
abbrev: new fields.StringField({ initial: "constitution" }),
|
||||||
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
hasmax: new fields.BooleanField({ initial: true }),
|
||||||
|
max: new fields.NumberField({ initial: 0, integer: true })
|
||||||
|
}),
|
||||||
|
physique: new fields.SchemaField({
|
||||||
|
label: new fields.StringField({ initial: "Aptitudes Physiques" }),
|
||||||
|
abbrev: new fields.StringField({ initial: "physique" }),
|
||||||
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
hasmax: new fields.BooleanField({ initial: false }),
|
||||||
|
max: new fields.NumberField({ initial: 0, integer: true })
|
||||||
|
}),
|
||||||
|
culturegenerale: new fields.SchemaField({
|
||||||
|
label: new fields.StringField({ initial: "Culture Générale" }),
|
||||||
|
abbrev: new fields.StringField({ initial: "culturegenerale" }),
|
||||||
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
hasmax: new fields.BooleanField({ initial: false }),
|
||||||
|
max: new fields.NumberField({ initial: 0, integer: true })
|
||||||
|
}),
|
||||||
|
habilite: new fields.SchemaField({
|
||||||
|
label: new fields.StringField({ initial: "Habilité" }),
|
||||||
|
abbrev: new fields.StringField({ initial: "habilite" }),
|
||||||
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
hasmax: new fields.BooleanField({ initial: false }),
|
||||||
|
max: new fields.NumberField({ initial: 0, integer: true })
|
||||||
|
}),
|
||||||
|
perception: new fields.SchemaField({
|
||||||
|
label: new fields.StringField({ initial: "Perception" }),
|
||||||
|
abbrev: new fields.StringField({ initial: "perception" }),
|
||||||
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
hasmax: new fields.BooleanField({ initial: false }),
|
||||||
|
max: new fields.NumberField({ initial: 0, integer: true })
|
||||||
|
}),
|
||||||
|
spiritualite: new fields.SchemaField({
|
||||||
|
label: new fields.StringField({ initial: "Spiritualite" }),
|
||||||
|
abbrev: new fields.StringField({ initial: "spiritualite" }),
|
||||||
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
hasmax: new fields.BooleanField({ initial: false }),
|
||||||
|
iscard: new fields.BooleanField({ initial: true }),
|
||||||
|
max: new fields.NumberField({ initial: 0, integer: true })
|
||||||
|
}),
|
||||||
|
rationnalite: new fields.SchemaField({
|
||||||
|
label: new fields.StringField({ initial: "Rationnalite" }),
|
||||||
|
abbrev: new fields.StringField({ initial: "rationnalite" }),
|
||||||
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
hasmax: new fields.BooleanField({ initial: false }),
|
||||||
|
iscard: new fields.BooleanField({ initial: true }),
|
||||||
|
max: new fields.NumberField({ initial: 0, integer: true })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
12
modules/models/pnj.mjs
Normal file
12
modules/models/pnj.mjs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les PNJ (type "pnj")
|
||||||
|
*/
|
||||||
|
export default class PnjDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
npctype: new fields.StringField({ initial: "" }),
|
||||||
|
description: new fields.HTMLField({ initial: "" })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
12
modules/models/sortilege.mjs
Normal file
12
modules/models/sortilege.mjs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les sortilèges
|
||||||
|
*/
|
||||||
|
export default class SortilegeDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
seuil: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
description: new fields.HTMLField({ initial: "" })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
17
modules/models/tarot.mjs
Normal file
17
modules/models/tarot.mjs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les lames de tarot
|
||||||
|
*/
|
||||||
|
export default class TarotDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
tarottype: new fields.StringField({ initial: "" }),
|
||||||
|
numericvalueup: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
numericvaluedown: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
isdualside: new fields.BooleanField({ initial: false }),
|
||||||
|
ispositif: new fields.BooleanField({ initial: true }),
|
||||||
|
isgm: new fields.BooleanField({ initial: false }),
|
||||||
|
description: new fields.HTMLField({ initial: "" })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
4982
package-lock.json
generated
Normal file
4982
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
17
package.json
Normal file
17
package.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "fvtt-malefices",
|
||||||
|
"version": "13.0.0",
|
||||||
|
"description": "Maléfices RPG for FoundryVTT - French",
|
||||||
|
"scripts": {
|
||||||
|
"build": "gulp build",
|
||||||
|
"watch": "gulp watch"
|
||||||
|
},
|
||||||
|
"author": "Uberwald/LeRatierBretonnien",
|
||||||
|
"license": "SEE LICENSE IN LICENCE.txt",
|
||||||
|
"devDependencies": {
|
||||||
|
"gulp": "^4.0.2",
|
||||||
|
"gulp-less": "^5.0.0",
|
||||||
|
"gulp-rename": "^2.0.0",
|
||||||
|
"gulp-sourcemaps": "^3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000042
|
MANIFEST-000064
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2025/09/29-07:31:55.732840 7f68515fa6c0 Recovering log #39
|
2026/02/27-10:28:01.892467 7f56f8bfd6c0 Recovering log #63
|
||||||
2025/09/29-07:31:55.762660 7f68515fa6c0 Delete type=3 #36
|
2026/02/27-10:28:01.948160 7f56f8bfd6c0 Delete type=0 #63
|
||||||
2025/09/29-07:31:55.762738 7f68515fa6c0 Delete type=0 #39
|
2026/02/27-10:28:01.948272 7f56f8bfd6c0 Delete type=3 #62
|
||||||
2025/09/29-07:33:20.941480 7f684affd6c0 Level-0 table #45: started
|
2026/02/27-14:29:37.861283 7f54e37ef6c0 Level-0 table #67: started
|
||||||
2025/09/29-07:33:20.941516 7f684affd6c0 Level-0 table #45: 0 bytes OK
|
2026/02/27-14:29:37.861314 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
|
||||||
2025/09/29-07:33:20.968021 7f684affd6c0 Delete type=0 #43
|
2026/02/27-14:29:37.867488 7f54e37ef6c0 Delete type=0 #65
|
||||||
2025/09/29-07:33:20.991797 7f684affd6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end)
|
2026/02/27-14:29:37.880370 7f54e37ef6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,16 +1,3 @@
|
|||||||
2025/06/12-20:31:25.313277 7f13a0ff96c0 Recovering log #35
|
2026/02/27-00:10:01.008967 7fbc5bfff6c0 Recovering log #60
|
||||||
2025/06/12-20:31:25.315223 7f13a0ff96c0 Level-0 table #37: started
|
2026/02/27-00:10:01.061613 7fbc5bfff6c0 Delete type=3 #58
|
||||||
2025/06/12-20:31:25.319146 7f13a0ff96c0 Level-0 table #37: 50829 bytes OK
|
2026/02/27-00:10:01.061695 7fbc5bfff6c0 Delete type=0 #60
|
||||||
2025/06/12-20:31:25.329210 7f13a0ff96c0 Delete type=0 #35
|
|
||||||
2025/06/12-20:31:25.329273 7f13a0ff96c0 Delete type=3 #34
|
|
||||||
2025/06/12-20:37:12.699768 7f139fbff6c0 Level-0 table #40: started
|
|
||||||
2025/06/12-20:37:12.699837 7f139fbff6c0 Level-0 table #40: 0 bytes OK
|
|
||||||
2025/06/12-20:37:12.706246 7f139fbff6c0 Delete type=0 #38
|
|
||||||
2025/06/12-20:37:12.737419 7f139fbff6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at '!items!xtYE2kVIfNtrXSoU' @ 92 : 1
|
|
||||||
2025/06/12-20:37:12.737429 7f139fbff6c0 Compacting 1@0 + 1@1 files
|
|
||||||
2025/06/12-20:37:12.742004 7f139fbff6c0 Generated table #41@0: 23 keys, 50829 bytes
|
|
||||||
2025/06/12-20:37:12.742024 7f139fbff6c0 Compacted 1@0 + 1@1 files => 50829 bytes
|
|
||||||
2025/06/12-20:37:12.748178 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2025/06/12-20:37:12.748270 7f139fbff6c0 Delete type=2 #33
|
|
||||||
2025/06/12-20:37:12.748375 7f139fbff6c0 Delete type=2 #37
|
|
||||||
2025/06/12-20:37:12.748448 7f139fbff6c0 Manual compaction at level-0 from '!items!xtYE2kVIfNtrXSoU' @ 92 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000042
|
MANIFEST-000064
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2025/09/29-07:31:55.700298 7f6850df96c0 Recovering log #39
|
2026/02/27-10:28:01.832073 7f56f93fe6c0 Recovering log #63
|
||||||
2025/09/29-07:31:55.730618 7f6850df96c0 Delete type=3 #36
|
2026/02/27-10:28:01.886020 7f56f93fe6c0 Delete type=0 #63
|
||||||
2025/09/29-07:31:55.730700 7f6850df96c0 Delete type=0 #39
|
2026/02/27-10:28:01.886089 7f56f93fe6c0 Delete type=3 #62
|
||||||
2025/09/29-07:33:20.890444 7f684affd6c0 Level-0 table #45: started
|
2026/02/27-14:29:37.854040 7f54e37ef6c0 Level-0 table #67: started
|
||||||
2025/09/29-07:33:20.890504 7f684affd6c0 Level-0 table #45: 0 bytes OK
|
2026/02/27-14:29:37.854089 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
|
||||||
2025/09/29-07:33:20.919482 7f684affd6c0 Delete type=0 #43
|
2026/02/27-14:29:37.861166 7f54e37ef6c0 Delete type=0 #65
|
||||||
2025/09/29-07:33:20.991768 7f684affd6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end)
|
2026/02/27-14:29:37.880355 7f54e37ef6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,16 +1,3 @@
|
|||||||
2025/06/12-20:31:25.295914 7f13a1ffb6c0 Recovering log #35
|
2026/02/27-00:10:00.951941 7fbc5b7fe6c0 Recovering log #60
|
||||||
2025/06/12-20:31:25.296128 7f13a1ffb6c0 Level-0 table #37: started
|
2026/02/27-00:10:01.006960 7fbc5b7fe6c0 Delete type=3 #58
|
||||||
2025/06/12-20:31:25.299700 7f13a1ffb6c0 Level-0 table #37: 2083 bytes OK
|
2026/02/27-00:10:01.007022 7fbc5b7fe6c0 Delete type=0 #60
|
||||||
2025/06/12-20:31:25.309703 7f13a1ffb6c0 Delete type=0 #35
|
|
||||||
2025/06/12-20:31:25.309800 7f13a1ffb6c0 Delete type=3 #34
|
|
||||||
2025/06/12-20:37:12.678958 7f139fbff6c0 Level-0 table #40: started
|
|
||||||
2025/06/12-20:37:12.679060 7f139fbff6c0 Level-0 table #40: 0 bytes OK
|
|
||||||
2025/06/12-20:37:12.686243 7f139fbff6c0 Delete type=0 #38
|
|
||||||
2025/06/12-20:37:12.706447 7f139fbff6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at '!items!nkRQU81L1gWOfaeo' @ 36 : 1
|
|
||||||
2025/06/12-20:37:12.706466 7f139fbff6c0 Compacting 1@0 + 1@1 files
|
|
||||||
2025/06/12-20:37:12.710210 7f139fbff6c0 Generated table #41@0: 9 keys, 2083 bytes
|
|
||||||
2025/06/12-20:37:12.710233 7f139fbff6c0 Compacted 1@0 + 1@1 files => 2083 bytes
|
|
||||||
2025/06/12-20:37:12.716905 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2025/06/12-20:37:12.717210 7f139fbff6c0 Delete type=2 #33
|
|
||||||
2025/06/12-20:37:12.717533 7f139fbff6c0 Delete type=2 #37
|
|
||||||
2025/06/12-20:37:12.748427 7f139fbff6c0 Manual compaction at level-0 from '!items!nkRQU81L1gWOfaeo' @ 36 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000042
|
MANIFEST-000064
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2025/09/29-07:31:55.765046 7f684bfff6c0 Recovering log #39
|
2026/02/27-10:28:01.956384 7f56e3fff6c0 Recovering log #63
|
||||||
2025/09/29-07:31:55.805924 7f684bfff6c0 Delete type=3 #36
|
2026/02/27-10:28:02.013265 7f56e3fff6c0 Delete type=0 #63
|
||||||
2025/09/29-07:31:55.806008 7f684bfff6c0 Delete type=0 #39
|
2026/02/27-10:28:02.013323 7f56e3fff6c0 Delete type=3 #62
|
||||||
2025/09/29-07:33:20.968205 7f684affd6c0 Level-0 table #45: started
|
2026/02/27-14:29:37.873932 7f54e37ef6c0 Level-0 table #67: started
|
||||||
2025/09/29-07:33:20.968257 7f684affd6c0 Level-0 table #45: 0 bytes OK
|
2026/02/27-14:29:37.873976 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
|
||||||
2025/09/29-07:33:20.991626 7f684affd6c0 Delete type=0 #43
|
2026/02/27-14:29:37.880214 7f54e37ef6c0 Delete type=0 #65
|
||||||
2025/09/29-07:33:20.991810 7f684affd6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end)
|
2026/02/27-14:29:37.880389 7f54e37ef6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,16 +1,3 @@
|
|||||||
2025/06/12-20:31:25.333075 7f13a17fa6c0 Recovering log #35
|
2026/02/27-00:10:01.064062 7fbc5affd6c0 Recovering log #60
|
||||||
2025/06/12-20:31:25.333133 7f13a17fa6c0 Level-0 table #37: started
|
2026/02/27-00:10:01.123843 7fbc5affd6c0 Delete type=3 #58
|
||||||
2025/06/12-20:31:25.336454 7f13a17fa6c0 Level-0 table #37: 843 bytes OK
|
2026/02/27-00:10:01.123915 7fbc5affd6c0 Delete type=0 #60
|
||||||
2025/06/12-20:31:25.347582 7f13a17fa6c0 Delete type=0 #35
|
|
||||||
2025/06/12-20:31:25.347664 7f13a17fa6c0 Delete type=3 #34
|
|
||||||
2025/06/12-20:37:12.686350 7f139fbff6c0 Level-0 table #40: started
|
|
||||||
2025/06/12-20:37:12.686369 7f139fbff6c0 Level-0 table #40: 0 bytes OK
|
|
||||||
2025/06/12-20:37:12.693290 7f139fbff6c0 Delete type=0 #38
|
|
||||||
2025/06/12-20:37:12.717660 7f139fbff6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at '!macros!zDPgmHiwNxBWhoYz' @ 12 : 1
|
|
||||||
2025/06/12-20:37:12.717670 7f139fbff6c0 Compacting 1@0 + 1@1 files
|
|
||||||
2025/06/12-20:37:12.720897 7f139fbff6c0 Generated table #41@0: 3 keys, 843 bytes
|
|
||||||
2025/06/12-20:37:12.720919 7f139fbff6c0 Compacted 1@0 + 1@1 files => 843 bytes
|
|
||||||
2025/06/12-20:37:12.727004 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2025/06/12-20:37:12.727078 7f139fbff6c0 Delete type=2 #33
|
|
||||||
2025/06/12-20:37:12.727156 7f139fbff6c0 Delete type=2 #37
|
|
||||||
2025/06/12-20:37:12.748434 7f139fbff6c0 Manual compaction at level-0 from '!macros!zDPgmHiwNxBWhoYz' @ 12 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000042
|
MANIFEST-000064
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2025/09/29-07:31:55.665720 7f684bfff6c0 Recovering log #39
|
2026/02/27-10:28:01.770730 7f56f9bff6c0 Recovering log #63
|
||||||
2025/09/29-07:31:55.697269 7f684bfff6c0 Delete type=3 #36
|
2026/02/27-10:28:01.825327 7f56f9bff6c0 Delete type=0 #63
|
||||||
2025/09/29-07:31:55.697384 7f684bfff6c0 Delete type=0 #39
|
2026/02/27-10:28:01.825401 7f56f9bff6c0 Delete type=3 #62
|
||||||
2025/09/29-07:33:20.919606 7f684affd6c0 Level-0 table #45: started
|
2026/02/27-14:29:37.867627 7f54e37ef6c0 Level-0 table #67: started
|
||||||
2025/09/29-07:33:20.919643 7f684affd6c0 Level-0 table #45: 0 bytes OK
|
2026/02/27-14:29:37.867663 7f54e37ef6c0 Level-0 table #67: 0 bytes OK
|
||||||
2025/09/29-07:33:20.941329 7f684affd6c0 Delete type=0 #43
|
2026/02/27-14:29:37.873757 7f54e37ef6c0 Delete type=0 #65
|
||||||
2025/09/29-07:33:20.991782 7f684affd6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end)
|
2026/02/27-14:29:37.880380 7f54e37ef6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,16 +1,3 @@
|
|||||||
2025/06/12-20:31:25.277690 7f13a17fa6c0 Recovering log #35
|
2026/02/27-00:10:00.890338 7fbca89ff6c0 Recovering log #60
|
||||||
2025/06/12-20:31:25.278265 7f13a17fa6c0 Level-0 table #37: started
|
2026/02/27-00:10:00.949636 7fbca89ff6c0 Delete type=3 #58
|
||||||
2025/06/12-20:31:25.282099 7f13a17fa6c0 Level-0 table #37: 4074 bytes OK
|
2026/02/27-00:10:00.949712 7fbca89ff6c0 Delete type=0 #60
|
||||||
2025/06/12-20:31:25.291692 7f13a17fa6c0 Delete type=0 #35
|
|
||||||
2025/06/12-20:31:25.291746 7f13a17fa6c0 Delete type=3 #34
|
|
||||||
2025/06/12-20:37:12.693368 7f139fbff6c0 Level-0 table #40: started
|
|
||||||
2025/06/12-20:37:12.693391 7f139fbff6c0 Level-0 table #40: 0 bytes OK
|
|
||||||
2025/06/12-20:37:12.699567 7f139fbff6c0 Delete type=0 #38
|
|
||||||
2025/06/12-20:37:12.727201 7f139fbff6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at '!items!zbGGMEQFdwVdlKAf' @ 88 : 1
|
|
||||||
2025/06/12-20:37:12.727206 7f139fbff6c0 Compacting 1@0 + 1@1 files
|
|
||||||
2025/06/12-20:37:12.730258 7f139fbff6c0 Generated table #41@0: 22 keys, 4074 bytes
|
|
||||||
2025/06/12-20:37:12.730268 7f139fbff6c0 Compacted 1@0 + 1@1 files => 4074 bytes
|
|
||||||
2025/06/12-20:37:12.737017 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2025/06/12-20:37:12.737151 7f139fbff6c0 Delete type=2 #33
|
|
||||||
2025/06/12-20:37:12.737310 7f139fbff6c0 Delete type=2 #37
|
|
||||||
2025/06/12-20:37:12.748441 7f139fbff6c0 Manual compaction at level-0 from '!items!zbGGMEQFdwVdlKAf' @ 88 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
1517
styles/simple.css
1517
styles/simple.css
File diff suppressed because it is too large
Load Diff
1
styles/simple.css.map
Normal file
1
styles/simple.css.map
Normal file
File diff suppressed because one or more lines are too long
57
system.json
57
system.json
@@ -3,10 +3,6 @@
|
|||||||
"esmodules": [
|
"esmodules": [
|
||||||
"modules/malefices-main.js"
|
"modules/malefices-main.js"
|
||||||
],
|
],
|
||||||
"grid": {
|
|
||||||
"distance": 2,
|
|
||||||
"units": "m"
|
|
||||||
},
|
|
||||||
"languages": [
|
"languages": [
|
||||||
{
|
{
|
||||||
"lang": "fr",
|
"lang": "fr",
|
||||||
@@ -74,7 +70,7 @@
|
|||||||
"license": "LICENSE.txt",
|
"license": "LICENSE.txt",
|
||||||
"manifest": "https://www.uberwald.me/gitea/public/fvtt-malefices/raw/branch/master/system.json",
|
"manifest": "https://www.uberwald.me/gitea/public/fvtt-malefices/raw/branch/master/system.json",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
"minimum": "13",
|
"minimum": "11",
|
||||||
"verified": "13"
|
"verified": "13"
|
||||||
},
|
},
|
||||||
"id": "fvtt-malefices",
|
"id": "fvtt-malefices",
|
||||||
@@ -88,5 +84,54 @@
|
|||||||
"url": "https://www.uberwald.me/gitea/public/fvtt-malefices",
|
"url": "https://www.uberwald.me/gitea/public/fvtt-malefices",
|
||||||
"version": "13.0.1",
|
"version": "13.0.1",
|
||||||
"download": "https://www.uberwald.me/gitea/public/fvtt-malefices/archive/fvtt-malefices-v13.0.1.zip",
|
"download": "https://www.uberwald.me/gitea/public/fvtt-malefices/archive/fvtt-malefices-v13.0.1.zip",
|
||||||
"background": "systems/fvtt-malefices/images/ui/malefice_welcome_page.webp"
|
"background": "systems/fvtt-malefices/images/ui/malefices-background-01.jpg",
|
||||||
|
"documentTypes": {
|
||||||
|
"Actor": {
|
||||||
|
"personnage": {
|
||||||
|
"htmlFields": [
|
||||||
|
"biodata.description",
|
||||||
|
"biodata.notes",
|
||||||
|
"biodata.gmnotes",
|
||||||
|
"equipementlibre"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pnj": {
|
||||||
|
"htmlFields": [
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Item": {
|
||||||
|
"arme": {
|
||||||
|
"htmlFields": [
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"equipement": {
|
||||||
|
"htmlFields": [
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"archetype": {
|
||||||
|
"htmlFields": [
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"tarot": {
|
||||||
|
"htmlFields": [
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"sortilege": {
|
||||||
|
"htmlFields": [
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"elementbio": {
|
||||||
|
"htmlFields": [
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
147
template.json
147
template.json
@@ -1,147 +0,0 @@
|
|||||||
{
|
|
||||||
"Actor": {
|
|
||||||
"types": [
|
|
||||||
"personnage"
|
|
||||||
],
|
|
||||||
"templates": {
|
|
||||||
"biodata": {
|
|
||||||
"biodata": {
|
|
||||||
"age": 0,
|
|
||||||
"size": "",
|
|
||||||
"lieunaissance": "",
|
|
||||||
"nationalite": "",
|
|
||||||
"profession": "",
|
|
||||||
"residence": "",
|
|
||||||
"milieusocial": "",
|
|
||||||
"poids": "",
|
|
||||||
"cheveux": "",
|
|
||||||
"sexe": "",
|
|
||||||
"yeux": "",
|
|
||||||
"enfance": "",
|
|
||||||
"adulte": "",
|
|
||||||
"loisirs": "",
|
|
||||||
"singularite": "",
|
|
||||||
"politique": "",
|
|
||||||
"religion": "",
|
|
||||||
"fantastique": "",
|
|
||||||
"description": "",
|
|
||||||
"notes": "",
|
|
||||||
"gmnotes": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"core": {
|
|
||||||
"subactors": [],
|
|
||||||
"lamesdestin": [],
|
|
||||||
"pointdestin": 1,
|
|
||||||
"fluide": 5,
|
|
||||||
"mpmb": 0,
|
|
||||||
"mpmn": 0,
|
|
||||||
"attributs": {
|
|
||||||
"constitution": {
|
|
||||||
"label": "Constitution",
|
|
||||||
"abbrev": "constitution",
|
|
||||||
"value": 0,
|
|
||||||
"hasmax": true,
|
|
||||||
"max": 0
|
|
||||||
},
|
|
||||||
"physique": {
|
|
||||||
"label": "Aptitudes Physiques",
|
|
||||||
"abbrev": "physique",
|
|
||||||
"value": 0,
|
|
||||||
"max": 0
|
|
||||||
},
|
|
||||||
"culturegenerale": {
|
|
||||||
"label": "Culture Générale",
|
|
||||||
"abbrev": "culturegenerale",
|
|
||||||
"value": 0,
|
|
||||||
"max": 0
|
|
||||||
},
|
|
||||||
"habilite": {
|
|
||||||
"label": "Habilité",
|
|
||||||
"abbrev": "habilite",
|
|
||||||
"value": 0,
|
|
||||||
"max": 0
|
|
||||||
},
|
|
||||||
"perception": {
|
|
||||||
"label": "Perception",
|
|
||||||
"abbrev": "perception",
|
|
||||||
"value": 0,
|
|
||||||
"max": 0
|
|
||||||
},
|
|
||||||
"spiritualite": {
|
|
||||||
"label": "Spiritualite",
|
|
||||||
"abbrev": "spiritualite",
|
|
||||||
"hasmax": false,
|
|
||||||
"iscard": true,
|
|
||||||
"value": 0,
|
|
||||||
"max": 0
|
|
||||||
},
|
|
||||||
"rationnalite": {
|
|
||||||
"label": "Rationnalite",
|
|
||||||
"abbrev": "rationnalite",
|
|
||||||
"hasmax": false,
|
|
||||||
"iscard": true,
|
|
||||||
"value": 0,
|
|
||||||
"max": 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"equipementlibre": ""
|
|
||||||
},
|
|
||||||
"npccore": {
|
|
||||||
"npctype": "",
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"personnage": {
|
|
||||||
"templates": [
|
|
||||||
"biodata",
|
|
||||||
"core"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Item": {
|
|
||||||
"types": [
|
|
||||||
"arme",
|
|
||||||
"equipement",
|
|
||||||
"archetype",
|
|
||||||
"tarot",
|
|
||||||
"sortilege",
|
|
||||||
"elementbio"
|
|
||||||
],
|
|
||||||
"templates": {},
|
|
||||||
"elementbio": {
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
"equipement": {
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
"tarot": {
|
|
||||||
"tarottype": "",
|
|
||||||
"numericvalueup": 0,
|
|
||||||
"numericvaluedown": 0,
|
|
||||||
"isdualside": false,
|
|
||||||
"ispositif": true,
|
|
||||||
"isgm": false,
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
"archetype": {
|
|
||||||
"lametutelaire": "",
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
"sortilege": {
|
|
||||||
"seuil": 0,
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
"arme": {
|
|
||||||
"armetype": "",
|
|
||||||
"porteecourte": "",
|
|
||||||
"porteemoyenne": "",
|
|
||||||
"dommagenormale": 0,
|
|
||||||
"dommagepart": 0,
|
|
||||||
"dommagecritique": 0,
|
|
||||||
"dommagecritiqueKO": false,
|
|
||||||
"dommagecritiquemort": false,
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
|
|
||||||
{{!-- Sheet Header --}}
|
{{!-- Sheet Header --}}
|
||||||
<header class="sheet-header">
|
<header class="sheet-header">
|
||||||
@@ -6,11 +6,11 @@
|
|||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
|
|
||||||
<div class="profile-img-container">
|
<div class="profile-img-container">
|
||||||
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
|
<img class="profile-img" src="{{actor.img}}" data-action="editImage" title="{{actor.name}}" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexcol">
|
<div class="flexcol">
|
||||||
<h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
|
<h1 class="charname margin-right"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1>
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<ul>
|
<ul>
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
{{!-- Sheet Tab Navigation --}}
|
{{!-- Sheet Tab Navigation --}}
|
||||||
<nav class="sheet-tabs tabs" data-group="primary">
|
<nav class="tabs" data-group="primary">
|
||||||
<a class="item" data-tab="main">Principal</a>
|
<a class="item" data-tab="main">Principal</a>
|
||||||
<a class="item" data-tab="equipements">Equipement</a>
|
<a class="item" data-tab="equipements">Equipement</a>
|
||||||
<a class="item" data-tab="biodata">Biographie</a>
|
<a class="item" data-tab="biodata">Biographie</a>
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
{{#each system.attributs as |attr key|}}
|
{{#each system.attributs as |attr key|}}
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<span class="item-name-label-long">
|
<span class="item-name-label-long">
|
||||||
<a class="roll-attribut" data-attr-key="{{key}}">{{attr.label}}
|
<a class="roll-attribut" data-action="rollAttribut" data-attr-key="{{key}}">{{attr.label}}
|
||||||
{{#if attr.iscard}}
|
{{#if attr.iscard}}
|
||||||
<i class="fa-solid fa-cards-blank"></i>
|
<i class="fa-solid fa-cards-blank"></i>
|
||||||
{{else}}
|
{{else}}
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
|
|
||||||
{{#each armes as |arme key|}}
|
{{#each armes as |arme key|}}
|
||||||
<li class="item flexrow list-item">
|
<li class="item flexrow list-item">
|
||||||
<span class="item-field-label-long"><a class="roll-arme" data-arme-id="{{arme._id}}">{{arme.name}}<i class="fa-solid fa-dice-d20"></i></a></span>
|
<span class="item-field-label-long"><a class="roll-arme" data-action="rollArme" data-arme-id="{{arme._id}}">{{arme.name}}<i class="fa-solid fa-dice-d20"></i></a></span>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -122,19 +122,19 @@
|
|||||||
</span>
|
</span>
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-add" data-type="elementbio" title="Create Item"><i class="fas fa-plus"></i></a>
|
<a class="item-control item-add" data-action="createItem" data-type="elementbio" title="Create Item"><i class="fas fa-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
{{#each elementsbio as |elem key|}}
|
{{#each elementsbio as |elem key|}}
|
||||||
<li class="item list-item flexrow list-item-shadow" data-item-id="{{elem._id}}">
|
<li class="item list-item flexrow list-item-shadow" data-item-id="{{elem._id}}">
|
||||||
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
|
<a class="item-name-img" data-action="editItem" title="Edit Item"><img class="sheet-competence-img"
|
||||||
src="{{elem.img}}" /></a>
|
src="{{elem.img}}" /></a>
|
||||||
<span class="item-name-label">{{elem.name}}</span>
|
<span class="item-name-label">{{elem.name}}</span>
|
||||||
|
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-control" data-action="deleteItem" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
<h3><label class="items-title-text">Equipements (saisie libre)</label></h3>
|
<h3><label class="items-title-text">Equipements (saisie libre)</label></h3>
|
||||||
</span>
|
</span>
|
||||||
<div class="form-group small-editor">
|
<div class="form-group small-editor">
|
||||||
{{editor equipementlibre target="system.equipementlibre" button=true owner=owner editable=editable}}
|
{{formInput systemFields.equipementlibre enriched=enrichedEquipementlibre value=system.equipementlibre name="system.equipementlibre" toggled=true}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="item-list alternate-list">
|
<ul class="item-list alternate-list">
|
||||||
@@ -171,12 +171,12 @@
|
|||||||
<label class="item-field-label-medium">Critique</label>
|
<label class="item-field-label-medium">Critique</label>
|
||||||
</span>
|
</span>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-add" data-type="arme" title="Créer une arme"><i class="fas fa-plus"></i></a>
|
<a class="item-control" data-action="createItem" data-type="arme" title="Créer une arme"><i class="fas fa-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{#each armes as |arme key|}}
|
{{#each armes as |arme key|}}
|
||||||
<li class="item flexrow list-item list-item-shadow" data-item-id="{{arme._id}}">
|
<li class="item flexrow list-item list-item-shadow" data-item-id="{{arme._id}}">
|
||||||
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
|
<a class="item-name-img" data-action="editItem" title="Edit Item"><img class="sheet-competence-img"
|
||||||
src="{{arme.img}}" /></a>
|
src="{{arme.img}}" /></a>
|
||||||
<span class="item-name-label">{{arme.name}}</span>
|
<span class="item-name-label">{{arme.name}}</span>
|
||||||
<span class="item-field-label-medium"><label>{{arme.system.dommagenormale}}</label></span>
|
<span class="item-field-label-medium"><label>{{arme.system.dommagenormale}}</label></span>
|
||||||
@@ -185,7 +185,7 @@
|
|||||||
|
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-control" data-action="deleteItem" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -201,19 +201,19 @@
|
|||||||
</span>
|
</span>
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-add" data-type="equipement" title="Créer un équipement"><i class="fas fa-plus"></i></a>
|
<a class="item-control" data-action="createItem" data-type="equipement" title="Créer un équipement"><i class="fas fa-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
{{#each equipements as |equip key|}}
|
{{#each equipements as |equip key|}}
|
||||||
<li class="item list-item flexrow list-item-shadow" data-item-id="{{equip._id}}">
|
<li class="item list-item flexrow list-item-shadow" data-item-id="{{equip._id}}">
|
||||||
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
|
<a class="item-name-img" data-action="editItem" title="Edit Item"><img class="sheet-competence-img"
|
||||||
src="{{equip.img}}" /></a>
|
src="{{equip.img}}" /></a>
|
||||||
<span class="item-name-label">{{equip.name}}</span>
|
<span class="item-name-label">{{equip.name}}</span>
|
||||||
|
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-control" data-action="deleteItem" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -229,13 +229,13 @@
|
|||||||
</span>
|
</span>
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-add" data-type="sortilege" title="Créer un Sortilège"><i class="fas fa-plus"></i></a>
|
<a class="item-control" data-action="createItem" data-type="sortilege" title="Créer un Sortilège"><i class="fas fa-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
{{#each sorts as |sort key|}}
|
{{#each sorts as |sort key|}}
|
||||||
<li class="item list-item flexrow list-item-shadow" data-item-id="{{sort._id}}">
|
<li class="item list-item flexrow list-item-shadow" data-item-id="{{sort._id}}">
|
||||||
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
|
<a class="item-name-img" data-action="editItem" title="Edit Item"><img class="sheet-competence-img"
|
||||||
src="{{sort.img}}" /></a>
|
src="{{sort.img}}" /></a>
|
||||||
<span class="item-name-label">{{sort.name}}</span>
|
<span class="item-name-label">{{sort.name}}</span>
|
||||||
<span class="item-field-label-medium">
|
<span class="item-field-label-medium">
|
||||||
@@ -243,7 +243,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-control" data-action="deleteItem" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -261,11 +261,11 @@
|
|||||||
<ul class="item-list alternate-list">
|
<ul class="item-list alternate-list">
|
||||||
<li class="item flexrow" data-item-id="{{archetype._id}}">
|
<li class="item flexrow" data-item-id="{{archetype._id}}">
|
||||||
<label class="item-name-label-medium">Archetype</label>
|
<label class="item-name-label-medium">Archetype</label>
|
||||||
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
|
<a class="item-name-img" data-action="editItem" title="Edit Item"><img class="sheet-competence-img"
|
||||||
src="{{archetype.img}}" /></a>
|
src="{{archetype.img}}" /></a>
|
||||||
<span class="item-name-label-medium">{{archetype.name}}</span>
|
<span class="item-name-label-medium">{{archetype.name}}</span>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-control" data-action="deleteItem" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="item flexrow">
|
<li class="item flexrow">
|
||||||
@@ -339,19 +339,19 @@
|
|||||||
<label class="item-field-label-medium">Sens</label>
|
<label class="item-field-label-medium">Sens</label>
|
||||||
</span>
|
</span>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-add" data-type="tarot" title="Créer une lame de tarot"><i class="fas fa-plus"></i></a>
|
<a class="item-control" data-action="createItem" data-type="tarot" title="Créer une lame de tarot"><i class="fas fa-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{#each tarots as |tarot key|}}
|
{{#each tarots as |tarot key|}}
|
||||||
<li class="item flexrow list-item list-item-shadow" data-item-id="{{tarot._id}}">
|
<li class="item flexrow list-item list-item-shadow" data-item-id="{{tarot._id}}">
|
||||||
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
|
<a class="item-name-img" data-action="editItem" title="Edit Item"><img class="sheet-competence-img"
|
||||||
src="{{tarot.img}}" /></a>
|
src="{{tarot.img}}" /></a>
|
||||||
<span class="item-name-label">{{tarot.name}}</span>
|
<span class="item-name-label">{{tarot.name}}</span>
|
||||||
<span class="item-field-label-medium"><label>{{#if tarot.system.ispositif}}Positif{{else}}Négatif{{/if}}</label></span>
|
<span class="item-field-label-medium"><label>{{#if tarot.system.ispositif}}Positif{{else}}Négatif{{/if}}</label></span>
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
{{#if @root.isGM}}
|
{{#if @root.isGM}}
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-control" data-action="deleteItem" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</li>
|
</li>
|
||||||
@@ -368,19 +368,19 @@
|
|||||||
<label class="item-field-label-medium">Sens</label>
|
<label class="item-field-label-medium">Sens</label>
|
||||||
</span>
|
</span>
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-add" data-type="tarot" title="Créer une lame de Tarot (secret)"><i class="fas fa-plus"></i></a>
|
<a class="item-control" data-action="createItem" data-type="tarot" title="Créer une lame de Tarot (secret)"><i class="fas fa-plus"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{{#each tarotsCache as |tarot key|}}
|
{{#each tarotsCache as |tarot key|}}
|
||||||
<li class="item flexrow list-item list-item-shadow" data-item-id="{{tarot._id}}">
|
<li class="item flexrow list-item list-item-shadow" data-item-id="{{tarot._id}}">
|
||||||
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
|
<a class="item-name-img" data-action="editItem" title="Edit Item"><img class="sheet-competence-img"
|
||||||
src="{{tarot.img}}" /></a>
|
src="{{tarot.img}}" /></a>
|
||||||
<span class="item-name-label">{{tarot.name}}</span>
|
<span class="item-name-label">{{tarot.name}}</span>
|
||||||
<span class="item-field-label-medium"><label>{{#if tarot.system.ispositif}}Positif{{else}}Négatif{{/if}}</label></span>
|
<span class="item-field-label-medium"><label>{{#if tarot.system.ispositif}}Positif{{else}}Négatif{{/if}}</label></span>
|
||||||
<div class="item-filler"> </div>
|
<div class="item-filler"> </div>
|
||||||
{{#if @root.isGM}}
|
{{#if @root.isGM}}
|
||||||
<div class="item-controls item-controls-fixed">
|
<div class="item-controls item-controls-fixed">
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
<a class="item-control" data-action="deleteItem" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</li>
|
</li>
|
||||||
@@ -396,19 +396,19 @@
|
|||||||
<h3><label class="items-title-text">Background</label></h3>
|
<h3><label class="items-title-text">Background</label></h3>
|
||||||
</span>
|
</span>
|
||||||
<div class="form-group editor">
|
<div class="form-group editor">
|
||||||
{{editor description target="system.biodata.description" button=true owner=owner editable=editable}}
|
{{formInput biodataFields.description enriched=enrichedDescription value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<span class="item-name-label-header items-title-bg">
|
<span class="item-name-label-header items-title-bg">
|
||||||
<h3><label class="items-title-text">Notes</label></h3>
|
<h3><label class="items-title-text">Notes</label></h3>
|
||||||
</span>
|
</span>
|
||||||
<div class="form-group editor">
|
<div class="form-group editor">
|
||||||
{{editor notes target="system.biodata.notes" button=true owner=owner editable=editable}}
|
{{formInput biodataFields.notes enriched=enrichedNotes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
</article>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
|
||||||
|
</section>
|
||||||
22
templates/actors/npc-sheet.hbs
Normal file
22
templates/actors/npc-sheet.hbs
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
|
|
||||||
|
<header class="sheet-header">
|
||||||
|
<div class="profile-img-container">
|
||||||
|
<img class="profile-img" src="{{actor.img}}" data-action="editImage" title="{{actor.name}}" />
|
||||||
|
</div>
|
||||||
|
<div class="header-fields flexcol">
|
||||||
|
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" /></h1>
|
||||||
|
<div class="flexrow">
|
||||||
|
<label class="item-name-label-medium">Type</label>
|
||||||
|
<input type="text" name="system.npctype" value="{{system.npctype}}" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section class="sheet-body">
|
||||||
|
<div class="form-group editor" style="margin-top:0.5rem;">
|
||||||
|
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</section>
|
||||||
@@ -1,37 +1,55 @@
|
|||||||
<div class="chat-message-header">
|
<div class="malefices-chat-card">
|
||||||
{{#if actorImg}}
|
|
||||||
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
|
<header class="chat-card-header">
|
||||||
{{/if}}
|
{{#if actorImg}}
|
||||||
<h4 class="chat-actor-name">{{alias}}</h4>
|
<img class="chat-actor-img" src="{{actorImg}}" alt="{{alias}}" />
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-actor-name">{{alias}}</div>
|
||||||
|
{{#if img}}
|
||||||
|
<div class="chat-header-roll">
|
||||||
|
<img class="chat-roll-icon" src="{{img}}" alt="Confrontation" />
|
||||||
|
<span class="chat-roll-name">Confrontation</span>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="chat-card-separator"></div>
|
||||||
|
|
||||||
|
<dl class="chat-roll-details">
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>{{attr.label}}</dt>
|
||||||
|
<dd>{{attr.value}}</dd>
|
||||||
|
</div>
|
||||||
|
{{#if confrontationDegre}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Degré de confrontation</dt>
|
||||||
|
<dd>{{confrontationDegre}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if confrontationModif}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Ajustement</dt>
|
||||||
|
<dd>{{confrontationModif}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-detail-row chat-detail-target">
|
||||||
|
<dt>Seuil final</dt>
|
||||||
|
<dd>{{target}}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="chat-detail-row chat-detail-roll">
|
||||||
|
<dt>Valeur de la carte</dt>
|
||||||
|
<dd>{{total}}</dd>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<div class="chat-card-result {{#if isSuccess}}result-success{{else}}result-failure{{/if}}">
|
||||||
|
{{#if isSuccess}}
|
||||||
|
<i class="fa-solid fa-check"></i> Réussite !
|
||||||
|
<div class="chat-result-damage">{{attr.label}} augmente de {{gainAttr}} points</div>
|
||||||
|
{{else}}
|
||||||
|
<i class="fa-solid fa-xmark"></i> Échec !
|
||||||
|
<div class="chat-result-damage">{{attr.label}} diminue de {{gainAttr}} points</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
{{#if img}}
|
|
||||||
<div >
|
|
||||||
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<div class="flexcol">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<ul>
|
|
||||||
<li>Confrontation de {{attr.label}} : {{attr.value}}
|
|
||||||
</li>
|
|
||||||
<li>Degré de la confrontation: {{confrontationDegre}} </li>
|
|
||||||
<li>Ajustement spécial : {{confrontationModif}} </li>
|
|
||||||
<li>Seuil final : {{target}} </li>
|
|
||||||
<li>Valeur de la carte : {{total}} </li>
|
|
||||||
|
|
||||||
{{#if isSuccess}}
|
|
||||||
<li><label class="chat-result-text chat-result-success ">Réussite !</label> Votre {{attr.label}} augmente de {{gainAttr}} points.</li>
|
|
||||||
{{else}}
|
|
||||||
<li><label class="chat-result-text chat-result-failure ">Echec !</label> Votre {{attr.label}} diminue de {{gainAttr}} points.</li>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|||||||
@@ -1,76 +1,91 @@
|
|||||||
<div class="chat-message-header">
|
<div class="malefices-chat-card">
|
||||||
{{#if actorImg}}
|
|
||||||
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
|
<header class="chat-card-header">
|
||||||
{{/if}}
|
{{#if actorImg}}
|
||||||
<h4 class="chat-actor-name">{{alias}}</h4>
|
<img class="chat-actor-img" src="{{actorImg}}" alt="{{alias}}" />
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-actor-name">{{alias}}</div>
|
||||||
|
{{#if img}}
|
||||||
|
<div class="chat-header-roll">
|
||||||
|
<img class="chat-roll-icon" src="{{img}}" alt="{{name}}" />
|
||||||
|
<span class="chat-roll-name">{{name}}</span>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="chat-card-separator"></div>
|
||||||
|
|
||||||
|
<dl class="chat-roll-details">
|
||||||
|
{{#if attr}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>{{attr.label}}</dt>
|
||||||
|
<dd>{{attr.value}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if bonusMalusPerso}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Bonus/Malus biographique</dt>
|
||||||
|
<dd>{{bonusMalusPerso}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if bonusMalusSituation}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Bonus/Malus de situation</dt>
|
||||||
|
<dd>{{bonusMalusSituation}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-detail-row chat-detail-target">
|
||||||
|
<dt>Seuil final</dt>
|
||||||
|
<dd>{{target}}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="chat-detail-row chat-detail-roll">
|
||||||
|
<dt>Résultat du dé</dt>
|
||||||
|
<dd>{{roll.total}}</dd>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<div class="chat-card-result {{#if isSuccess}}result-success{{else}}result-failure{{/if}}">
|
||||||
|
{{#if isSuccess}}
|
||||||
|
{{#if isCritical}}
|
||||||
|
<i class="fa-solid fa-star"></i> Réussite Critique !
|
||||||
|
{{#if arme}}
|
||||||
|
{{#if arme.system.dommagecritiquemort}}
|
||||||
|
<div class="chat-result-damage">La victime est morte !</div>
|
||||||
|
{{else}}
|
||||||
|
{{#if arme.system.dommagecritiqueko}}
|
||||||
|
<div class="chat-result-damage">La victime est KO !</div>
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-result-damage">{{arme.system.dommagecritique}} dommages</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
|
{{else if isPart}}
|
||||||
|
<i class="fa-solid fa-circle-check"></i> Réussite Particulière !
|
||||||
|
{{#if arme}}
|
||||||
|
<div class="chat-result-damage">{{arme.system.dommagepart}} dommages</div>
|
||||||
|
{{/if}}
|
||||||
|
{{else}}
|
||||||
|
<i class="fa-solid fa-check"></i> Succès !
|
||||||
|
{{#if arme}}
|
||||||
|
<div class="chat-result-damage">{{arme.system.dommagenormale}} dommages</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
|
{{else}}
|
||||||
|
{{#if isFumble}}
|
||||||
|
<i class="fa-solid fa-skull"></i> Échec Critique !
|
||||||
|
{{else}}
|
||||||
|
<i class="fa-solid fa-xmark"></i> Échec !
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{#unless isReroll}}
|
||||||
|
{{#if (gt destin 0)}}
|
||||||
|
<div class="chat-card-actions">
|
||||||
|
<button class="chat-card-button roll-destin">
|
||||||
|
<i class="fa-solid fa-rotate-right"></i> Relancer (1 Destin)
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/unless}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
{{#if img}}
|
|
||||||
<div >
|
|
||||||
<img class="chat-icon" src="{{img}}" alt="{{name}}" />
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<div class="flexcol">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<ul>
|
|
||||||
{{#if attr}}
|
|
||||||
<li>{{attr.label}} : {{attr.value}}
|
|
||||||
</li>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<li>Bonus/Malus perso: {{bonusMalusPerso}} </li>
|
|
||||||
<li>Bonus/Malus situation: {{bonusMalusSituation}} </li>
|
|
||||||
<li>Seuil final: {{target}} </li>
|
|
||||||
<li>Resultat {{roll.total}} </li>
|
|
||||||
|
|
||||||
{{#if isSuccess}}
|
|
||||||
{{#if isCritical}}
|
|
||||||
<li><label class="chat-result-text chat-result-success ">Réussite Critique !</label></li>
|
|
||||||
{{#if arme}}
|
|
||||||
{{#if arme.system.dommagecritiquemort}}
|
|
||||||
<li><label class="chat-result-success">La victime est morte !</label></li>
|
|
||||||
{{else}}
|
|
||||||
{{#if arme.system.dommagecritiqueko}}
|
|
||||||
<li><label class="chat-result-text chat-result-success ">La victime est KO !</label></li>
|
|
||||||
{{/if}}
|
|
||||||
<li><label class="chat-result-success ">La victime subit {{arme.system.dommagecritique}} dommages</label></li>
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
{{else}}
|
|
||||||
{{#if isPart}}
|
|
||||||
<li><label class="chat-result-text chat-result-success ">Réussite Particulière !</label></li>
|
|
||||||
{{#if arme}}
|
|
||||||
<li><label class="chat-result-success ">La victime subit {{arme.system.dommagepart}} dommages</label></li>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{else}}
|
|
||||||
<li><label class="chat-result-text chat-result-success ">Succés !</label></li>
|
|
||||||
{{#if arme}}
|
|
||||||
<li><label class="chat-result-success ">La victime subit {{arme.system.dommagenormale}} dommages</label></li>
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
{{else}}
|
|
||||||
{{#if isFumble}}
|
|
||||||
<li><label class="chat-result-text chat-result-failure ">Echec Critique !</label></li>
|
|
||||||
{{else}}
|
|
||||||
<li><label class="chat-result-text chat-result-failure">Echec !</label></li>
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if isReroll}}
|
|
||||||
{{else}}
|
|
||||||
{{#if (gt destin 0)}}
|
|
||||||
<button class="chat-card-button roll-destin">Relancer (1 Destin)</button>
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|||||||
@@ -1,12 +1,24 @@
|
|||||||
</div>
|
<div class="malefices-chat-card">
|
||||||
<div class="flexcol">
|
|
||||||
<img class="{{#if system.ispositif}} {{else}}flip-tarot{{/if}}" src="{{img}}">
|
<div class="chat-card-header">
|
||||||
<span class="tarot-title">{{name}}</span>
|
<div class="chat-actor-name">🃏 Carte Tirée</div>
|
||||||
{{#if system.isdualside}}
|
</div>
|
||||||
<span class="tarot-title">{{#if system.ispositif}}Positif{{else}}Négatif{{/if}}</span>
|
|
||||||
{{/if}}
|
<div class="chat-card-separator"></div>
|
||||||
{{#if value}}
|
|
||||||
<span class="tarot-title">Valeur : {{value}}</span>
|
<div class="tarot-card-display">
|
||||||
{{/if}}
|
<img class="tarot-card-img {{#unless system.ispositif}}flip-tarot{{/unless}}" src="{{img}}" alt="{{name}}" />
|
||||||
|
<div class="tarot-card-info">
|
||||||
|
<div class="tarot-card-name">{{name}}</div>
|
||||||
|
{{#if system.isdualside}}
|
||||||
|
<div class="tarot-card-side {{#if system.ispositif}}tarot-positif{{else}}tarot-negatif{{/if}}">
|
||||||
|
{{#if system.ispositif}}⬆ Positif{{else}}⬇ Négatif{{/if}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if value}}
|
||||||
|
<div class="tarot-card-value">Valeur : <strong>{{value}}</strong></div>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,16 @@
|
|||||||
<div>
|
<div class="malefices-chat-card">
|
||||||
<button class="chat-card-button draw-tarot-card">Tirer une carte de Tarot</button>
|
|
||||||
|
<div class="chat-card-header">
|
||||||
|
<div class="chat-actor-name">Demande de tirage</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="chat-card-separator"></div>
|
||||||
|
|
||||||
|
<div class="chat-card-actions">
|
||||||
|
<button class="chat-card-button draw-tarot-card">
|
||||||
|
<i class="fa-solid fa-cards-blank"></i> Tirer une carte de Tarot
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|||||||
27
templates/chat/welcome-message.hbs
Normal file
27
templates/chat/welcome-message.hbs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<div class="malefices-chat-card malefices-welcome">
|
||||||
|
|
||||||
|
<div class="chat-card-header">
|
||||||
|
<img class="chat-actor-img" src="systems/fvtt-malefices/images/ui/background_01_clear.webp" alt="Maléfices" style="object-fit:cover;" />
|
||||||
|
<div class="chat-actor-name">Maléfices v4</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chat-card-separator"></div>
|
||||||
|
|
||||||
|
<div class="welcome-body">
|
||||||
|
<p class="welcome-title">Bienvenue dans Maléfices, le JDR qui sent le soufre !</p>
|
||||||
|
<p>Le Livre de Base de Maléfices v4 est nécessaire pour jouer :
|
||||||
|
<a href="https://arkhane-asylum.fr/en/malefices/" target="_blank">arkhane-asylum.fr</a>
|
||||||
|
</p>
|
||||||
|
<p>Maléfices est un jeu de rôle publié par <em>Arkhane Asylum Publishing</em>, tous les droits leur appartiennent.</p>
|
||||||
|
<p>Système développé par LeRatierBretonnien avec l'aide de la Dame du Lac et Malik, support sur le
|
||||||
|
<a href="https://discord.gg/pPSDNJk" target="_blank">Discord FR de Foundry</a>.
|
||||||
|
</p>
|
||||||
|
<div class="welcome-commands">
|
||||||
|
<div class="welcome-commands-title">Commandes disponibles</div>
|
||||||
|
<div class="welcome-command-row"><code>/tirage</code> — tirage complet des tarots</div>
|
||||||
|
<div class="welcome-command-row"><code>/carte</code> — tirer une simple carte</div>
|
||||||
|
<div class="welcome-command-row"><code>/resume</code> — résumé des PJs (MJ seulement)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -1,86 +1,73 @@
|
|||||||
<form class="{{cssClass}} flexcol character-summary-container" autocomplete="off">
|
<div class="character-summary-container">
|
||||||
|
|
||||||
<ol class="items-list">
|
<ol class="items-list">
|
||||||
|
|
||||||
<li class="item flexrow item-header">
|
<li class="item flexrow item-header">
|
||||||
<div class="item-field item-name item-name-label-long">Nom</div>
|
<div class="item-field item-name item-name-label-long">Nom</div>
|
||||||
{{#each config.attributs as |attr key|}}
|
{{#each config.attributs as |attr key|}}
|
||||||
<div class="item-field item-name-label-short">{{attr}}</div>
|
<div class="item-field item-name-label-short">{{attr}}</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<div class="item-field item-name-label-short">Destin</div>
|
<div class="item-field item-name-label-short">Destin</div>
|
||||||
<div class="item-field item-name-label-short">Fluide</div>
|
<div class="item-field item-name-label-short">Fluide</div>
|
||||||
<div class="item-field item-name-label-short">MPMB</div>
|
<div class="item-field item-name-label-short">MPMB</div>
|
||||||
<div class="item-field item-name-label-short">MPMN</div>
|
<div class="item-field item-name-label-short">MPMN</div>
|
||||||
</div>
|
<div class="item-field flex1 right"></div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
{{#each pcs as |pc key|}}
|
{{#each pcs as |pc key|}}
|
||||||
<li class="item flexrow" data-actor-id="{{pc.id}}">
|
<li class="item flexrow" data-actor-id="{{pc.id}}">
|
||||||
<div class="item-field item-name item-name-label-long">
|
<div class="item-field item-name item-name-label-long">
|
||||||
<a class="actor-open character-summary-rollable">{{pc.name}}</a>
|
<a class="actor-open character-summary-rollable">{{pc.name}}</a>
|
||||||
</div>
|
</div>
|
||||||
{{#each pc.system.attributs as |attr key|}}
|
{{#each pc.system.attributs as |attr key|}}
|
||||||
<div class="item-field flex2 item-name-label-short">
|
<div class="item-field flex2 item-name-label-short">
|
||||||
<a class="summary-roll character-summary-rollable" data-type="attribut" data-key="{{key}}">{{attr.value}}</a>
|
<a class="summary-roll character-summary-rollable" data-type="attribut" data-key="{{key}}">{{attr.value}}</a>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="destin" data-key="pointdestin">{{pc.system.pointdestin}}</a>
|
<a class="summary-roll" data-type="destin" data-key="pointdestin">{{pc.system.pointdestin}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="fluide" data-key="fluide">{{pc.system.fluide}}</a>
|
<a class="summary-roll" data-type="fluide" data-key="fluide">{{pc.system.fluide}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="mpmb" data-key="mpmb">{{pc.system.mpmb}}</a>
|
<a class="summary-roll" data-type="mpmb" data-key="mpmb">{{pc.system.mpmb}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="mpmn" data-key="mpmn">{{pc.system.mpmn}}</a>
|
<a class="summary-roll" data-type="mpmn" data-key="mpmn">{{pc.system.mpmn}}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="item-field flex1 right"></div>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
||||||
<li class="item flexrow item-header">
|
{{#each extras as |pc key|}}
|
||||||
<div class="item-field item-name item-name-label-long">PNJs</div>
|
|
||||||
{{#each config.attributs as |attr key|}}
|
|
||||||
<div class="item-field flex2 item-name-label-short">attr</div>
|
|
||||||
{{/each}}
|
|
||||||
<div class="item-field flex2 item-name-label-short">Destin</div>
|
|
||||||
<div class="item-field flex2 item-name-label-short">Fluide</div>
|
|
||||||
<div class="item-field flex2 item-name-label-short">MPMB</div>
|
|
||||||
<div class="item-field flex2 item-name-label-short">MPMN</div>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{{#each npcs as |pc key|}}
|
|
||||||
<li class="item flexrow" data-actor-id="{{pc.id}}">
|
<li class="item flexrow" data-actor-id="{{pc.id}}">
|
||||||
<div class="item-field item-name item-name-label-long">
|
<div class="item-field item-name item-name-label-long">
|
||||||
<a class="actor-open character-summary-rollable">{{pc.name}}</a>
|
<a class="actor-open character-summary-rollable">{{pc.name}}</a>
|
||||||
</div>
|
</div>
|
||||||
{{#each pc.system.attributs as |attr key|}}
|
{{#each pc.system.attributs as |attr key|}}
|
||||||
<div class="item-field flex2 item-name-label-short">
|
<div class="item-field flex2 item-name-label-short">
|
||||||
<a class="summary-roll character-summary-rollable" data-type="attribute" data-key="{{key}}">{{attr.value}}</a>
|
<a class="summary-roll character-summary-rollable" data-type="attribut" data-key="{{key}}">{{attr.value}}</a>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="destin" data-key="pointdestin">{{pc.system.pointdestin}}</a>
|
<a class="summary-roll" data-type="destin" data-key="pointdestin">{{pc.system.pointdestin}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="fluide" data-key="fluide">{{pc.system.fluide}}</a>
|
<a class="summary-roll" data-type="fluide" data-key="fluide">{{pc.system.fluide}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="mpmb" data-key="mpmb">{{pc.system.mpmb}}</a>
|
<a class="summary-roll" data-type="mpmb" data-key="mpmb">{{pc.system.mpmb}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-field flex item-name-label-short">
|
<div class="item-field flex item-name-label-short">
|
||||||
<a class="summary-roll" data-type="mpmn" data-key="mpmn">{{pc.system.mpmn}}</a>
|
<a class="summary-roll" data-type="mpmn" data-key="mpmn">{{pc.system.mpmn}}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="item-field flex1 right">
|
||||||
<div class="item-field flex1 right">
|
<a class="item-control actor-delete" title="Retirer"><i class="fas fa-trash"></i></a>
|
||||||
<a class="item-control actor-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a>
|
</div>
|
||||||
</div>
|
</li>
|
||||||
</li>
|
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
</form>
|
</div>
|
||||||
@@ -1,34 +1,37 @@
|
|||||||
<form class="skill-roll-dialog">
|
<div class="skill-roll-dialog">
|
||||||
|
|
||||||
<header class="roll-dialog-header">
|
<header class="roll-dialog-header">
|
||||||
{{#if img}}
|
{{#if img}}
|
||||||
<img class="actor-icon" src="{{img}}" data-edit="img" title="{{name}}" />
|
<img class="actor-icon" src="{{img}}" title="{{name}}" />
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<h1 class="dialog-roll-title roll-dialog-header">{{title}}</h1>
|
<div class="dialog-roll-title">{{title}}</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="flexcol">
|
<div class="dialog-separator"></div>
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="dialog-body">
|
||||||
<span class="roll-dialog-label">{{attr.label}} : </span>
|
|
||||||
<span class="roll-dialog-label">
|
|
||||||
{{attr.value}}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="dialog-attribute-row">
|
||||||
<span class="roll-dialog-label">Degré de la confrontation : </span>
|
<span class="dialog-attr-label">{{attr.label}}</span>
|
||||||
|
<span class="dialog-attr-value">{{attr.value}}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dialog-modifiers">
|
||||||
|
<div class="dialog-modifier-row">
|
||||||
|
<label class="dialog-modifier-label">Degré de la confrontation</label>
|
||||||
<select id="confrontationDegre" name="confrontationDegre">
|
<select id="confrontationDegre" name="confrontationDegre">
|
||||||
{{selectOptions config.confrontationDegreOptions selected=confrontationDegre}}
|
{{selectOptions config.confrontationDegreOptions selected=confrontationDegre}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="dialog-modifier-row">
|
||||||
<span class="roll-dialog-label">Modificateur de confrontation : </span>
|
<label class="dialog-modifier-label">Modificateur de confrontation</label>
|
||||||
<select id="confrontationModif" name="confrontationModif">
|
<select id="confrontationModif" name="confrontationModif">
|
||||||
{{selectOptions config.confrontationModifOptions selected=confrontationModif}}
|
{{selectOptions config.confrontationModifOptions selected=confrontationModif}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</div>
|
||||||
@@ -1,68 +1,67 @@
|
|||||||
<form class="skill-roll-dialog">
|
<div class="skill-roll-dialog">
|
||||||
|
|
||||||
<header class="roll-dialog-header">
|
<header class="roll-dialog-header">
|
||||||
{{#if img}}
|
{{#if img}}
|
||||||
<img class="actor-icon" src="{{img}}" data-edit="img" title="{{name}}" />
|
<img class="actor-icon" src="{{img}}" title="{{name}}" />
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<h1 class="dialog-roll-title roll-dialog-header">{{title}}</h1>
|
<div class="dialog-roll-title">{{title}}</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="flexcol">
|
<div class="dialog-separator"></div>
|
||||||
|
|
||||||
{{#if attr}}
|
<div class="dialog-body">
|
||||||
<div class="flexrow">
|
|
||||||
<span class="roll-dialog-label">{{attr.label}} : </span>
|
{{#if attr}}
|
||||||
<span class="roll-dialog-label">
|
<div class="dialog-attribute-row">
|
||||||
|
<span class="dialog-attr-label">{{attr.label}}</span>
|
||||||
|
<span class="dialog-attr-value">
|
||||||
{{attr.value}}
|
{{attr.value}}
|
||||||
{{#if (eq attr.abbrev "physique")}}
|
{{#if (eq attr.abbrev "physique")}}{{#if phyMalus}} ({{phyMalus}}){{/if}}{{/if}}
|
||||||
{{#if phyMalus}}
|
|
||||||
({{phyMalus}})
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<div class="flexcol">
|
{{#if elementsbio.length}}
|
||||||
<span class="roll-dialog-label">Rappel des élements biographiques : </span>
|
<div class="dialog-section-title">Éléments biographiques</div>
|
||||||
<ul class="ul-level1 item-list alternate-list">
|
<ul class="dialog-bio-list">
|
||||||
{{#each elementsbio as |elem key|}}
|
{{#each elementsbio as |elem|}}
|
||||||
<li class="item flexrow">
|
<li>{{elem.name}}</li>
|
||||||
<span class="roll-dialog-label">{{elem.name}}</span>
|
{{/each}}
|
||||||
</li>
|
</ul>
|
||||||
{{/each}}
|
{{/if}}
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="dialog-modifiers">
|
||||||
<span class="roll-dialog-label">Bonus/Malus biographique : </span>
|
<div class="dialog-modifier-row">
|
||||||
|
<label class="dialog-modifier-label">Bonus/Malus biographique</label>
|
||||||
<select id="bonusMalusPerso" name="bonusMalusPerso">
|
<select id="bonusMalusPerso" name="bonusMalusPerso">
|
||||||
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso valueAttr="value" labelAttr="label"}}
|
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso valueAttr="value" labelAttr="label"}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="dialog-modifier-row">
|
||||||
<span class="roll-dialog-label">Bonus/Malus de situation : </span>
|
<label class="dialog-modifier-label">Bonus/Malus de situation</label>
|
||||||
<select id="bonusMalusSituation" name="bonusMalusSituation">
|
<select id="bonusMalusSituation" name="bonusMalusSituation">
|
||||||
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusSituation valueAttr="value" labelAttr="label"}}
|
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusSituation valueAttr="value" labelAttr="label"}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{#if arme}}
|
{{#if arme}}
|
||||||
<div class="flexrow">
|
<div class="dialog-modifier-row">
|
||||||
<span class="roll-dialog-label">Défense : </span>
|
<label class="dialog-modifier-label">Défense</label>
|
||||||
<select id="bonusMalusDef" name="bonusMalusDef">
|
<select id="bonusMalusDef" name="bonusMalusDef">
|
||||||
{{selectOptions config.bonusMalusDefOptions selected=bonusMalusDef valueAttr="value" labelAttr="label"}}
|
{{selectOptions config.bonusMalusDefOptions selected=bonusMalusDef valueAttr="value" labelAttr="label"}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="dialog-modifier-row">
|
||||||
<span class="roll-dialog-label">Portée : </span>
|
<label class="dialog-modifier-label">Portée</label>
|
||||||
<select id="bonusMalusPortee" name="bonusMalusPortee">
|
<select id="bonusMalusPortee" name="bonusMalusPortee">
|
||||||
{{selectOptions config.bonusMalusPorteeOptions selected=bonusMalusPortee valueAttr="value" labelAttr="label"}}
|
{{selectOptions config.bonusMalusPorteeOptions selected=bonusMalusPortee valueAttr="value" labelAttr="label"}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</div>
|
||||||
@@ -1,72 +1,77 @@
|
|||||||
<form class="skill-roll-dialog">
|
<div class="tirage-tarot-dialog">
|
||||||
<header class="roll-dialog-header">
|
|
||||||
<h1 class="dialog-roll-title roll-dialog-header">Joueur : {{user.name}}</h1>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="flexcol">
|
{{!-- Sélection joueur ou attribution acteur --}}
|
||||||
|
{{#if (eq state "select-player")}}
|
||||||
|
<div class="tirage-select-row">
|
||||||
|
<label class="tirage-select-label">Sélectionnez le joueur pour le tirage</label>
|
||||||
|
<select id="playerId" name="playerId" class="tirage-select">
|
||||||
|
<option value="none">— choisir —</option>
|
||||||
|
{{#each players as |player id|}}
|
||||||
|
<option value="{{player._id}}">{{player.name}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
{{#if (eq state "select-player")}}
|
{{#if (eq state "attribute-to-actor")}}
|
||||||
<div class="flexrow">
|
<div class="tirage-select-row tirage-attribute-row">
|
||||||
<span>Sélectionnez le joueur pour faire le tirage</span>
|
<label class="tirage-select-label">Attribuer les tarots à un personnage</label>
|
||||||
<select id="playerId" name="playerId">
|
<select id="actorId" name="actorId" class="tirage-select">
|
||||||
{{#select playerId}}
|
<option value="none">— choisir —</option>
|
||||||
<option value="none"></option>
|
{{#each actors as |actor id|}}
|
||||||
{{#each players as |player id|}}
|
<option value="{{actor._id}}">{{actor.name}}</option>
|
||||||
<option value="{{player._id}}">{{player.name}}</option>
|
{{/each}}
|
||||||
{{/each}}
|
</select>
|
||||||
{{/select}}
|
</div>
|
||||||
</select>
|
{{/if}}
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if (eq state "attribute-to-actor")}}
|
{{!-- Main du joueur --}}
|
||||||
<div class="flexrow">
|
<div class="tirage-section">
|
||||||
<span>Sélectionnez l'acteur pour lui attribuer les tarots</span>
|
<div class="tirage-section-title">
|
||||||
<select id="actorId" name="actorId">
|
<i class="fa-solid fa-hand"></i> Main du joueur
|
||||||
{{#select actorId}}
|
{{#if user}}<span class="tirage-player-name">— {{user.name}}</span>{{/if}}
|
||||||
<option value="none"></option>
|
</div>
|
||||||
{{#each actors as |actor id|}}
|
<div class="tirage-cards-row">
|
||||||
<option value="{{actor._id}}">{{actor.name}}</option>
|
{{#each cards as |card|}}
|
||||||
{{/each}}
|
<div class="tirage-card {{#unless card.system.ispositif}}tirage-card-negatif{{/unless}}">
|
||||||
{{/select}}
|
<img class="tirage-card-img {{#unless card.system.ispositif}}flip-tarot{{/unless}}" src="{{card.img}}" alt="{{card.name}}" />
|
||||||
</select>
|
<div class="tirage-card-name">{{card.name}}</div>
|
||||||
</div>
|
{{#if card.system.isdualside}}
|
||||||
{{/if}}
|
<div class="tirage-card-side {{#if card.system.ispositif}}tirage-positif{{else}}tirage-negatif{{/if}}">
|
||||||
|
{{#if card.system.ispositif}}⬆ Positif{{else}}⬇ Négatif{{/if}}
|
||||||
<div class="flexcol">
|
|
||||||
<span><h2>Main du joueur : </h2></span>
|
|
||||||
<div class="flexrow">
|
|
||||||
{{#each cards as |card index|}}
|
|
||||||
<div class="flexcol">
|
|
||||||
<div class="tarot-fixed-width flexcol">
|
|
||||||
<img class="tarot-fixed-width {{#if card.system.ispositif}} {{else}}flip-tarot{{/if}}" src="{{card.img}}">
|
|
||||||
<span class="tarot-title">{{card.name}}</span>
|
|
||||||
{{#if card.system.isdualside}}
|
|
||||||
<span class="tarot-title">{{#if card.system.ispositif}}Positif{{else}}Négatif{{/if}}</span>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
{{/each}}
|
||||||
<hr>
|
</div>
|
||||||
<span><h2>Main secrête : </h2></span>
|
|
||||||
<div class="flexrow">
|
|
||||||
{{#each secretCards as |card index|}}
|
|
||||||
<div class="flexcol">
|
|
||||||
<div class="tarot-fixed-width flexcol">
|
|
||||||
<img class="tarot-fixed-width {{#if card.system.ispositif}} {{else}}flip-tarot{{/if}}" src="{{card.img}}">
|
|
||||||
<span class="tarot-title">{{card.name}}</span>
|
|
||||||
{{#if card.system.isdualside}}
|
|
||||||
<span class="tarot-title">{{#if card.system.ispositif}}Positif{{else}}Négatif{{/if}}</span>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
<div class="tirage-separator"></div>
|
||||||
|
|
||||||
|
{{!-- Main secrète --}}
|
||||||
|
<div class="tirage-section">
|
||||||
|
<div class="tirage-section-title tirage-secret-title">
|
||||||
|
<i class="fa-solid fa-eye-slash"></i> Main secrète
|
||||||
|
</div>
|
||||||
|
<div class="tirage-cards-row">
|
||||||
|
{{#each secretCards as |card|}}
|
||||||
|
<div class="tirage-card tirage-card-secret {{#unless card.system.ispositif}}tirage-card-negatif{{/unless}}">
|
||||||
|
<img class="tirage-card-img {{#unless card.system.ispositif}}flip-tarot{{/unless}}" src="{{card.img}}" alt="{{card.name}}" />
|
||||||
|
<div class="tirage-card-name">{{card.name}}</div>
|
||||||
|
{{#if card.system.isdualside}}
|
||||||
|
<div class="tirage-card-side {{#if card.system.ispositif}}tirage-positif{{else}}tirage-negatif{{/if}}">
|
||||||
|
{{#if card.system.ispositif}}⬆ Positif{{else}}⬇ Négatif{{/if}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="tirage-footer">
|
||||||
|
<button type="button" class="tirage-close-btn">
|
||||||
|
<i class="fa-solid fa-times"></i> Fermer
|
||||||
|
</button>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -1,33 +1,26 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
<header class="sheet-header">
|
|
||||||
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
|
||||||
<div class="header-fields">
|
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-header.hbs this}}
|
||||||
|
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs this}}
|
||||||
|
|
||||||
{{!-- Sheet Body --}}
|
|
||||||
<section class="sheet-body">
|
<section class="sheet-body">
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs this}}
|
||||||
|
|
||||||
<div class="tab details" data-group="primary" data-tab="details">
|
<div class="tab details" data-group="primary" data-tab="details">
|
||||||
|
<div class="item-details">
|
||||||
<div class="tab" data-group="primary">
|
|
||||||
<ul>
|
<ul>
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Lame tutélaire</label>
|
<label class="item-field-label-long">Lame tutélaire</label>
|
||||||
<select class="item-field-label-long" type="text" name="system.lametutelaire" data-dtype="String">
|
<select class="item-field-label-long" name="system.lametutelaire" data-dtype="String">
|
||||||
{{selectOptions tarots selected=system.lametutelaire nameAttr="_id" labelAttr="name"}}
|
{{selectOptions tarots selected=system.lametutelaire nameAttr="_id" labelAttr="name"}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
|
||||||
|
</section>
|
||||||
|
|||||||
@@ -1,69 +1,57 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
<header class="sheet-header">
|
|
||||||
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
|
||||||
<div class="header-fields">
|
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-header.hbs this}}
|
||||||
|
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs this}}
|
||||||
|
|
||||||
{{!-- Sheet Body --}}
|
|
||||||
<section class="sheet-body">
|
<section class="sheet-body">
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs this}}
|
||||||
|
|
||||||
<div class="tab details" data-group="primary" data-tab="details">
|
<div class="tab details" data-group="primary" data-tab="details">
|
||||||
|
<div class="item-details">
|
||||||
<div class="tab" data-group="primary">
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Type d'arme</label>
|
<label class="item-field-label-long">Type d'arme</label>
|
||||||
<select class="item-field-label-long" type="text" name="system.armetype" value="{{system.armetype}}" data-dtype="String">
|
<select class="item-field-label-long" name="system.armetype" data-dtype="String">
|
||||||
{{selectOptions config.armeTypes selected=system.armetype}}
|
{{selectOptions config.armeTypes selected=system.armetype}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Portee courte (max)</label>
|
<label class="item-field-label-long">Portée courte (max)</label>
|
||||||
<input type="text" class="item-field-label-short" name="system.porteecourte" value="{{system.porteecourte}}" data-dtype="Number"/>
|
<input type="text" class="item-field-label-short" name="system.porteecourte" value="{{system.porteecourte}}" />
|
||||||
</li>
|
</li>
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Portee moyenne (max)</label>
|
<label class="item-field-label-long">Portée moyenne (max)</label>
|
||||||
<input type="text" class="item-field-label-short" name="system.porteemoyenne" value="{{system.porteemoyenne}}" data-dtype="Number"/>
|
<input type="text" class="item-field-label-short" name="system.porteemoyenne" value="{{system.porteemoyenne}}" />
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Dommages normaux</label>
|
<label class="item-field-label-long">Dommages normaux</label>
|
||||||
<input type="text" class="item-field-label-short" name="system.dommagenormale" value="{{system.dommagenormale}}" data-dtype="Number"/>
|
<input type="number" class="item-field-label-short" name="system.dommagenormale" value="{{system.dommagenormale}}" />
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Dommages particuliers</label>
|
<label class="item-field-label-long">Dommages particuliers</label>
|
||||||
<input type="text" class="item-field-label-short" name="system.dommagepart" value="{{system.dommagepart}}" data-dtype="Number"/>
|
<input type="number" class="item-field-label-short" name="system.dommagepart" value="{{system.dommagepart}}" />
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flexrow">
|
|
||||||
<label class="item-field-label-long">Critiques Mortels ?</label>
|
|
||||||
<input type="checkbox" class="item-field-label-short" name="system.dommagecritiquemort" {{checked system.dommagecritiquemort}} />
|
|
||||||
|
|
||||||
<label class="item-field-label-short"> </label>
|
|
||||||
|
|
||||||
<label class="item-field-label-long">Critiques KO ?</label>
|
|
||||||
<input type="checkbox" class="item-field-label-short" name="system.dommagecritiqueKO" {{checked system.dommagecritiqueKO}} />
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Dommages critiques</label>
|
<label class="item-field-label-long">Dommages critiques</label>
|
||||||
<input type="text" class="item-field-label-short" name="system.dommagecritique" value="{{system.dommagecritique}}" data-dtype="Number"/>
|
<input type="number" class="item-field-label-short" name="system.dommagecritique" value="{{system.dommagecritique}}" />
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<li class="flexrow">
|
||||||
|
<label class="item-field-label-long">Critiques mortels ?</label>
|
||||||
|
<input type="checkbox" name="system.dommagecritiquemort" {{checked system.dommagecritiquemort}} />
|
||||||
|
<label class="item-field-label-long">Critiques KO ?</label>
|
||||||
|
<input type="checkbox" name="system.dommagecritiqueKO" {{checked system.dommagecritiqueKO}} />
|
||||||
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
|
||||||
|
</section>
|
||||||
|
|||||||
@@ -1,27 +1,11 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
<header class="sheet-header">
|
|
||||||
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
|
||||||
<div class="header-fields">
|
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-header.hbs this}}
|
||||||
|
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs this}}
|
||||||
|
|
||||||
{{!-- Sheet Body --}}
|
|
||||||
<section class="sheet-body">
|
<section class="sheet-body">
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs this}}
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs}}
|
|
||||||
|
|
||||||
<div class="tab details" data-group="primary" data-tab="details">
|
|
||||||
|
|
||||||
<div class="tab" data-group="primary">
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
|
||||||
|
</section>
|
||||||
|
|||||||
@@ -1,27 +1,11 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
<header class="sheet-header">
|
|
||||||
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
|
||||||
<div class="header-fields">
|
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-header.hbs this}}
|
||||||
|
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs this}}
|
||||||
|
|
||||||
{{!-- Sheet Body --}}
|
|
||||||
<section class="sheet-body">
|
<section class="sheet-body">
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs this}}
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs}}
|
|
||||||
|
|
||||||
<div class="tab details" data-group="primary" data-tab="details">
|
|
||||||
|
|
||||||
<div class="tab" data-group="primary">
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
|
||||||
|
</section>
|
||||||
|
|||||||
@@ -1,30 +1,24 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
<header class="sheet-header">
|
|
||||||
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
|
||||||
<div class="header-fields">
|
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-header.hbs this}}
|
||||||
|
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs this}}
|
||||||
|
|
||||||
{{!-- Sheet Body --}}
|
|
||||||
<section class="sheet-body">
|
<section class="sheet-body">
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs this}}
|
||||||
|
|
||||||
<div class="tab details" data-group="primary" data-tab="details">
|
<div class="tab details" data-group="primary" data-tab="details">
|
||||||
|
<div class="item-details">
|
||||||
<div class="tab" data-group="primary">
|
|
||||||
<ul>
|
<ul>
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Seuil de Fluide</label>
|
<label class="item-field-label-long">Seuil de Fluide</label>
|
||||||
<input type="input" class="item-field-label-short" name="system.seuil" value="{{system.seuil}}" data-dtype="Number" />
|
<input type="number" class="item-field-label-short" name="system.seuil" value="{{system.seuil}}" />
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
|
||||||
|
</section>
|
||||||
|
|||||||
@@ -1,64 +1,62 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<section class="{{cssClass}}" autocomplete="off">
|
||||||
<header class="sheet-header">
|
|
||||||
<div class="header-fields">
|
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs}}
|
{{> systems/fvtt-malefices/templates/items/partial-item-header.hbs this}}
|
||||||
|
|
||||||
|
{{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs this}}
|
||||||
|
|
||||||
{{!-- Sheet Body --}}
|
|
||||||
<section class="sheet-body">
|
<section class="sheet-body">
|
||||||
<div class="flexrow">
|
|
||||||
<div>
|
<div class="tab description" data-group="primary" data-tab="description">
|
||||||
<img class="item-tarot-img" src="{{img}}" data-edit="img" title="{{name}}"/>
|
<div class="flexrow">
|
||||||
|
<div class="tarot-image-panel">
|
||||||
|
<img class="item-tarot-img" src="{{item.img}}" data-action="editImage" title="{{item.name}}" />
|
||||||
|
</div>
|
||||||
|
<div class="tarot-description-panel">
|
||||||
|
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div class="tab details" data-group="primary" data-tab="details">
|
||||||
{{> systems/fvtt-malefices/templates/items/partial-item-description.hbs}}
|
<div class="item-details">
|
||||||
|
<ul>
|
||||||
<div class="tab details" data-group="primary" data-tab="details">
|
|
||||||
|
|
||||||
<div class="tab" data-group="primary">
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Type </label>
|
<label class="item-field-label-long">Type</label>
|
||||||
<select class="item-field-label-long" type="text" name="system.tarottype" value="{{system.tarottype}}" data-dtype="String">
|
<select class="item-field-label-long" name="system.tarottype" data-dtype="String">
|
||||||
{{selectOptions config.tarotType selected=system.tarottype}}
|
{{selectOptions config.tarotType selected=system.tarottype}}
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
{{#if isGM}}
|
{{#if isGM}}
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Valeur endroit (ie positif) ?</label>
|
<label class="item-field-label-long">Valeur endroit (positif)</label>
|
||||||
<input type="input" class="item-field-label-short" name="system.numericvalueup" value="{{system.numericvalueup}}" data-dtype="Number" />
|
<input type="number" class="item-field-label-short" name="system.numericvalueup" value="{{system.numericvalueup}}" />
|
||||||
</li>
|
</li>
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Valeur envers (ie négatif) ?</label>
|
<label class="item-field-label-long">Valeur envers (négatif)</label>
|
||||||
<input type="input" class="item-field-label-short" name="system.numericvaluedown" value="{{system.numericvaluedown}}" data-dtype="Number" />
|
<input type="number" class="item-field-label-short" name="system.numericvaluedown" value="{{system.numericvaluedown}}" />
|
||||||
</li>
|
</li>
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">A un sens (ie positif/négatif)?</label>
|
<label class="item-field-label-long">A un sens (positif/négatif) ?</label>
|
||||||
<input type="checkbox" class="item-field-label-short" name="system.isdualside" {{checked system.isdualside}} />
|
<input type="checkbox" name="system.isdualside" {{checked system.isdualside}} />
|
||||||
</li>
|
</li>
|
||||||
{{#if system.isdualside}}
|
{{#if system.isdualside}}
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">En positif ?</label>
|
<label class="item-field-label-long">En positif ?</label>
|
||||||
<input type="checkbox" class="item-field-label-short" name="system.ispositif" {{checked system.ispositif}} />
|
<input type="checkbox" name="system.ispositif" {{checked system.ispositif}} />
|
||||||
</li>
|
</li>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<li class="flexrow">
|
<li class="flexrow">
|
||||||
<label class="item-field-label-long">Carte cachée (ie MJ seulement) ?</label>
|
<label class="item-field-label-long">Carte cachée (MJ seulement) ?</label>
|
||||||
<input type="checkbox" class="item-field-label-short" name="system.isgm" {{checked system.isgm}} />
|
<input type="checkbox" name="system.isgm" {{checked system.isgm}} />
|
||||||
</li>
|
</li>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</form>
|
|
||||||
|
</section>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<div class="tab description" data-group="primary" data-tab="description">
|
<div class="tab description" data-group="primary" data-tab="description">
|
||||||
{{editor description target="system.description" button=true owner=owner editable=editable}}
|
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
30
templates/items/partial-item-header.hbs
Normal file
30
templates/items/partial-item-header.hbs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<div class="header">
|
||||||
|
<header class="sheet-header">
|
||||||
|
<img
|
||||||
|
class="item-sheet-img"
|
||||||
|
src="{{item.img}}"
|
||||||
|
data-action="editImage"
|
||||||
|
title="{{item.name}}"
|
||||||
|
/>
|
||||||
|
<div class="item-sheet-title">
|
||||||
|
<h1>
|
||||||
|
<input
|
||||||
|
name="name"
|
||||||
|
type="text"
|
||||||
|
value="{{item.name}}"
|
||||||
|
placeholder="Nom de l'item"
|
||||||
|
/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<div class="header-actions">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
data-action="postItem"
|
||||||
|
class="chat-card-button"
|
||||||
|
data-tooltip="Poster dans le chat"
|
||||||
|
>
|
||||||
|
<i class="fas fa-comment"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
</div>
|
||||||
@@ -1,5 +1,13 @@
|
|||||||
{{!-- Sheet Tab Navigation --}}
|
{{!-- Sheet Tab Navigation --}}
|
||||||
<nav class="sheet-tabs tabs" data-group="primary">
|
<nav class="tabs" data-group="primary">
|
||||||
<a class="item" data-tab="description">Description</a>
|
{{#each tabs}}
|
||||||
<a class="item" data-tab="details">Details</a>
|
<a class="item {{this.cssClass}}" data-tab="{{this.id}}">
|
||||||
|
{{#if (eq this.id "description")}}
|
||||||
|
<i class="fas fa-file-alt"></i>
|
||||||
|
{{else if (eq this.id "details")}}
|
||||||
|
<i class="fas fa-cog"></i>
|
||||||
|
{{/if}}
|
||||||
|
{{this.label}}
|
||||||
|
</a>
|
||||||
|
{{/each}}
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
115
templates/post-item.hbs
Normal file
115
templates/post-item.hbs
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
<div class="malefices-chat-card malefices-chat-item" data-transfer="{{jsondata}}">
|
||||||
|
|
||||||
|
<header class="chat-card-header">
|
||||||
|
{{#if img}}
|
||||||
|
<img class="chat-actor-img" src="{{img}}" alt="{{name}}" />
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-actor-name">{{name}}</div>
|
||||||
|
<div class="item-type-label">
|
||||||
|
{{#if (eq type "arme")}}Arme{{/if}}
|
||||||
|
{{#if (eq type "equipement")}}Équipement{{/if}}
|
||||||
|
{{#if (eq type "sortilege")}}Sortilège{{/if}}
|
||||||
|
{{#if (eq type "archetype")}}Archétype{{/if}}
|
||||||
|
{{#if (eq type "tarot")}}Lame de Tarot{{/if}}
|
||||||
|
{{#if (eq type "elementbio")}}Élément Biographique{{/if}}
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="chat-card-separator"></div>
|
||||||
|
|
||||||
|
{{!-- Arme --}}
|
||||||
|
{{#if (eq type "arme")}}
|
||||||
|
<dl class="chat-roll-details">
|
||||||
|
{{#if system.armetype}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Type</dt>
|
||||||
|
<dd>{{lookup config.armeTypes system.armetype}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if system.porteecourte}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Portée courte</dt>
|
||||||
|
<dd>{{system.porteecourte}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if system.porteemoyenne}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Portée moyenne</dt>
|
||||||
|
<dd>{{system.porteemoyenne}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Dommages (normale)</dt>
|
||||||
|
<dd class="item-damage">{{system.dommagenormale}}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Dommages (part.)</dt>
|
||||||
|
<dd class="item-damage">{{system.dommagepart}}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Dommages (critique)</dt>
|
||||||
|
<dd class="item-damage item-damage-crit">
|
||||||
|
{{#if system.dommagecritiquemort}}
|
||||||
|
Mort instantanée
|
||||||
|
{{else if system.dommagecritiqueKO}}
|
||||||
|
{{system.dommagecritique}} — KO
|
||||||
|
{{else}}
|
||||||
|
{{system.dommagecritique}}
|
||||||
|
{{/if}}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{!-- Sortilège --}}
|
||||||
|
{{#if (eq type "sortilege")}}
|
||||||
|
<dl class="chat-roll-details">
|
||||||
|
<div class="chat-detail-row chat-detail-target">
|
||||||
|
<dt>Seuil d'activation</dt>
|
||||||
|
<dd>{{system.seuil}}</dd>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{!-- Archétype --}}
|
||||||
|
{{#if (eq type "archetype")}}
|
||||||
|
<dl class="chat-roll-details">
|
||||||
|
{{#if system.lametutelaire}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Lame tutélaire</dt>
|
||||||
|
<dd>{{system.lametutelaire}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</dl>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{!-- Tarot --}}
|
||||||
|
{{#if (eq type "tarot")}}
|
||||||
|
<dl class="chat-roll-details">
|
||||||
|
{{#if system.tarottype}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Arcane</dt>
|
||||||
|
<dd>{{lookup config.tarotType system.tarottype}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Valeur (endroit)</dt>
|
||||||
|
<dd>{{system.numericvalueup}}</dd>
|
||||||
|
</div>
|
||||||
|
{{#if system.isdualside}}
|
||||||
|
<div class="chat-detail-row">
|
||||||
|
<dt>Valeur (renversé)</dt>
|
||||||
|
<dd>{{system.numericvaluedown}}</dd>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</dl>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{!-- Description --}}
|
||||||
|
{{#if system.description}}
|
||||||
|
<div class="chat-item-description">
|
||||||
|
{{{system.description}}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user