Compare commits
6 Commits
fvtt-hawkm
...
13.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 391b99b18f | |||
| ff9acaab65 | |||
| 60978a67b2 | |||
| 5894cf043f | |||
| 0fd2130fb1 | |||
| 001f0cffa8 |
63
.gitea/workflows/release.yaml
Normal file
63
.gitea/workflows/release.yaml
Normal file
@@ -0,0 +1,63 @@
|
||||
name: Release Creation
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||
|
||||
#- uses: actions/checkout@v3
|
||||
- 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-hawkmoon-cyd/releases/download/latest/system.json
|
||||
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-hawkmoon-cyd.zip
|
||||
|
||||
# Create a zip file with all files required by the module to add to the release
|
||||
- run: |
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
|
||||
- run: zip -r ./fvtt-hawkmoon-cyd.zip system.json README.md LICENCE.txt assets/ 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-hawkmoon-cyd.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-hawkmoon-cyd'
|
||||
version: ${{github.event.release.tag_name}}
|
||||
manifest: 'https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd/releases/download/latest/system.json'
|
||||
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-hawkmoon-cyd.zip'
|
||||
compatibility-minimum: '13'
|
||||
compatibility-verified: '13'
|
||||
@@ -628,9 +628,6 @@
|
||||
<span>
|
||||
<h3>Description</h3>
|
||||
</span>
|
||||
<div class="medium-editor item-text-long-line">
|
||||
{{editor description target="system.biodata.description" button=true owner=owner editable=editable}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
254
_deprecated/chat-generic-result-v2.html
Normal file
254
_deprecated/chat-generic-result-v2.html
Normal file
@@ -0,0 +1,254 @@
|
||||
<div class="hawkmoon-chat-result">
|
||||
{{!-- Header avec acteur --}}
|
||||
<div class="chat-result-header">
|
||||
{{#if actorImg}}
|
||||
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
|
||||
{{/if}}
|
||||
<div class="header-info">
|
||||
<h4 class="actor-name">{{alias}}</h4>
|
||||
{{#if competence}}
|
||||
<div class="action-title">
|
||||
<i class="fas fa-dice-d20"></i>
|
||||
{{competence.name}}
|
||||
{{#if arme}}• {{arme.name}}{{/if}}
|
||||
</div>
|
||||
{{else if actionImg}}
|
||||
<div class="action-title">
|
||||
<i class="fas fa-dice-d20"></i>
|
||||
{{attr.label}}{{#if attr2}} + {{attr2.label}}{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{!-- Résultat principal --}}
|
||||
<div class="result-main">
|
||||
<div class="result-display">
|
||||
<div class="dice-result">
|
||||
<i class="fas fa-dice"></i>
|
||||
<span class="dice-value">{{diceResult}}</span>
|
||||
</div>
|
||||
<div class="total-result">
|
||||
<span class="total-label">Total</span>
|
||||
<span class="total-value">{{finalResult}}</span>
|
||||
</div>
|
||||
{{#if difficulte}}
|
||||
<div class="difficulty">
|
||||
<span class="difficulty-label">SD</span>
|
||||
<span class="difficulty-value">{{difficulte}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{!-- Badge de résultat --}}
|
||||
{{#if difficulte}}
|
||||
<div class="result-badge-container">
|
||||
{{#if isHeroique}}
|
||||
<div class="result-badge heroique">
|
||||
<i class="fas fa-star"></i> HÉROÏQUE !
|
||||
</div>
|
||||
{{else if isDramatique}}
|
||||
<div class="result-badge dramatique">
|
||||
<i class="fas fa-skull"></i> DRAMATIQUE !
|
||||
</div>
|
||||
{{else if isSuccess}}
|
||||
<div class="result-badge success">
|
||||
<i class="fas fa-check"></i> Succès
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="result-badge failure">
|
||||
<i class="fas fa-times"></i> Échec
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{!-- Détails du jet --}}
|
||||
<div class="result-details">
|
||||
<div class="details-section">
|
||||
<div class="detail-row">
|
||||
<span class="detail-label">Formule:</span>
|
||||
<span class="detail-value">{{diceFormula}}</span>
|
||||
</div>
|
||||
|
||||
<div class="detail-row">
|
||||
<span class="detail-label">{{attr.label}}:</span>
|
||||
<span class="detail-value">{{attr.value}}</span>
|
||||
</div>
|
||||
|
||||
{{#if attr2}}
|
||||
<div class="detail-row">
|
||||
<span class="detail-label">{{attr2.label}}:</span>
|
||||
<span class="detail-value">{{attr2.value}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if competence}}
|
||||
<div class="detail-row">
|
||||
<span class="detail-label">{{competence.name}}:</span>
|
||||
<span class="detail-value">{{competence.system.niveau}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if selectedMaitrise}}
|
||||
<div class="detail-row">
|
||||
<span class="detail-label">Maîtrise:</span>
|
||||
<span class="detail-value">{{selectedMaitrise.name}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if arme}}
|
||||
<div class="detail-row">
|
||||
<span class="detail-label">Arme:</span>
|
||||
<span class="detail-value">{{arme.name}} (+{{arme.system.bonusmaniementoff}})</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if bonusRoll}}
|
||||
<div class="detail-row bonus">
|
||||
<span class="detail-label">{{textBonus}}:</span>
|
||||
<span class="detail-value">+{{bonusRoll.total}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{!-- Effets et conséquences --}}
|
||||
{{#if isSuccess}}
|
||||
<div class="result-effects">
|
||||
{{#if attaqueDesarme}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-hand-sparkles"></i>
|
||||
{{#if isHeroique}}
|
||||
Vous récupérez l'arme de votre adversaire dans votre main !
|
||||
{{else}}
|
||||
Vous désarmez votre adversaire ! Son arme tombe hors de sa portée.
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if immobiliser}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-lock"></i>
|
||||
{{#if isHeroique}}
|
||||
Votre cible est immobilisée, et vous pouvez faire une action complexe.
|
||||
{{else}}
|
||||
Votre cible est immobilisée.
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if desengager}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-running"></i>
|
||||
Vous vous désengagez de votre adversaire.
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if repousser}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-hand-rock"></i>
|
||||
{{#if isHeroique}}
|
||||
Votre cible est repoussée de 3 mètres et tombe au sol.
|
||||
{{else}}
|
||||
Votre cible tombe au sol.
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if assomer}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-dizzy"></i>
|
||||
{{#if isHeroique}}
|
||||
Votre cible est assomée pour [[/r 1d10+10]] minutes.
|
||||
{{else}}
|
||||
Votre cible est assomée pour [[/r 1d10]] minutes.
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if coupBas}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-shoe-prints"></i>
|
||||
La cible a reçu 2 adversités bleues et a perdu 1 niveau de combativité.
|
||||
{{#if isHeroique}}
|
||||
<br><strong>Et votre cible perd sa prochaine action complexe.</strong>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if arme}}
|
||||
{{#if contenir}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-shield-alt"></i>
|
||||
{{#if isHeroique}}
|
||||
Aucun dégât, mais tous les adversaires dont le SD + 10 est atteint ne peuvent déclarer d'attaque contre vous lors de leur prochaine action complexe.
|
||||
{{else}}
|
||||
Aucun dégât, mais la cible ne peut pas déclarer d'attaque contre vous lors de sa prochaine action complexe.
|
||||
{{/if}}
|
||||
</div>
|
||||
{{else}}
|
||||
{{#if (eq nbCombativitePerdu "vaincu")}}
|
||||
<div class="effect-item victory">
|
||||
<i class="fas fa-trophy"></i>
|
||||
<strong>Votre adversaire est vaincu !</strong>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="effect-item">
|
||||
<i class="fas fa-heart-broken"></i>
|
||||
Votre adversaire a perdu {{nbCombativitePerdu}} État de Combativité.
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if (not arme.system.onlevelonly)}}
|
||||
<div class="damage-buttons">
|
||||
<button class="chat-card-button roll-chat-degat">
|
||||
<i class="fas fa-burst"></i> Dégâts de l'arme
|
||||
</button>
|
||||
{{#if coupDevastateur}}
|
||||
<button class="chat-card-button roll-chat-degat-devastateur">
|
||||
<i class="fas fa-explosion"></i> Dégâts avec Coup Dévastateur
|
||||
</button>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{!-- Avertissements --}}
|
||||
{{#if attaqueCharge}}
|
||||
<div class="result-warning">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
Vous avez chargé : vos adversaires bénéficient de +3 pour vous attaquer.
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if desengager}}
|
||||
{{#if (not isSuccess)}}
|
||||
<div class="result-warning">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
Vous ne parvenez pas à vous désengager, votre adversaire a un bonus de +3 pour vous attaquer.
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if isInit}}
|
||||
<div class="result-info">
|
||||
<i class="fas fa-flag"></i> Initiative stockée !
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{!-- Prédilections --}}
|
||||
{{#each predilections as |pred key|}}
|
||||
{{#if (and (and pred.acquise (not pred.maitrise)) (not pred.used))}}
|
||||
<div class="predilection-section">
|
||||
<button class="chat-card-button predilection-reroll" data-predilection-index="{{key}}">
|
||||
<i class="fas fa-redo"></i> Prédilection : {{pred.name}}
|
||||
</button>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</div>
|
||||
@@ -3,8 +3,8 @@
|
||||
* @extends {ActorSheet}
|
||||
*/
|
||||
|
||||
import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "./hawkmoon-automation.js";
|
||||
import { HawkmoonUtility } from "../modules/hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "../modules/hawkmoon-automation.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class HawkmoonActorSheet extends foundry.appv1.sheets.ActorSheet {
|
||||
@@ -36,6 +36,7 @@ export class HawkmoonActorSheet extends foundry.appv1.sheets.ActorSheet {
|
||||
editable: this.isEditable,
|
||||
cssClass: this.isEditable ? "editable" : "locked",
|
||||
system: objectData.system,
|
||||
systemFields: this.document.system.schema.fields,
|
||||
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
||||
limited: this.object.limited,
|
||||
skills: this.actor.getSkills(),
|
||||
@@ -56,7 +57,7 @@ export class HawkmoonActorSheet extends foundry.appv1.sheets.ActorSheet {
|
||||
nbCombativite: this.actor.system.sante.nbcombativite,
|
||||
combativiteList: HawkmoonUtility.getCombativiteList(this.actor.system.sante.nbcombativite),
|
||||
initiative: this.actor.getFlag("world", "last-initiative") || -1,
|
||||
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, {async: true}),
|
||||
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, {async: true}),
|
||||
habitat: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.habitat, {async: true}),
|
||||
options: this.options,
|
||||
owner: this.document.isOwner,
|
||||
@@ -66,7 +67,6 @@ export class HawkmoonActorSheet extends foundry.appv1.sheets.ActorSheet {
|
||||
}
|
||||
this.formData = formData;
|
||||
|
||||
console.log("PC : ", formData, this.object);
|
||||
return formData;
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
* @extends {ActorSheet}
|
||||
*/
|
||||
|
||||
import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "./hawkmoon-automation.js";
|
||||
import { HawkmoonUtility } from "../modules/hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "../modules/hawkmoon-automation.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
const __ALLOWED_ITEM_CELLULE = { "talent": 1, "ressource": 1, "contact": 1, "equipement": 1, "protection": 1, "artefact": 1, "arme": 1, "monnaie": 1 }
|
||||
@@ -4,8 +4,8 @@
|
||||
*/
|
||||
|
||||
import { HawkmoonActorSheet } from "./hawkmoon-actor-sheet.js";
|
||||
import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "./hawkmoon-automation.js";
|
||||
import { HawkmoonUtility } from "../modules/hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "../modules/hawkmoon-automation.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class HawkmoonCreatureSheet extends HawkmoonActorSheet {
|
||||
@@ -1,4 +1,4 @@
|
||||
import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonUtility } from "../modules/hawkmoon-utility.js";
|
||||
|
||||
export class HawkmoonRollDialog extends Dialog {
|
||||
|
||||
35
gulpfile.js
Normal file
35
gulpfile.js
Normal file
@@ -0,0 +1,35 @@
|
||||
const gulp = require('gulp');
|
||||
const less = require('gulp-less');
|
||||
const sourcemaps = require('gulp-sourcemaps');
|
||||
|
||||
// Paths
|
||||
const paths = {
|
||||
styles: {
|
||||
src: 'less/**/*.less',
|
||||
dest: 'styles/'
|
||||
}
|
||||
};
|
||||
|
||||
// Compile LESS to CSS
|
||||
function styles() {
|
||||
return gulp.src('less/hawkmoon.less')
|
||||
.pipe(sourcemaps.init())
|
||||
.pipe(less())
|
||||
.pipe(sourcemaps.write('.'))
|
||||
.pipe(gulp.dest(paths.styles.dest));
|
||||
}
|
||||
|
||||
// Watch files
|
||||
function watchFiles() {
|
||||
gulp.watch(paths.styles.src, styles);
|
||||
}
|
||||
|
||||
// Define complex tasks
|
||||
const build = gulp.series(styles);
|
||||
const watch = gulp.series(build, watchFiles);
|
||||
|
||||
// Export tasks
|
||||
exports.styles = styles;
|
||||
exports.build = build;
|
||||
exports.watch = watch;
|
||||
exports.default = build;
|
||||
4
less/hawkmoon.less
Normal file
4
less/hawkmoon.less
Normal file
@@ -0,0 +1,4 @@
|
||||
// Main LESS file for Hawkmoon system
|
||||
// Temporarily importing the full converted simple.css while we refactor
|
||||
|
||||
@import "simple-converted";
|
||||
2713
less/simple-converted.less
Normal file
2713
less/simple-converted.less
Normal file
File diff suppressed because it is too large
Load Diff
177
modules/applications/hawkmoon-roll-dialog.mjs
Normal file
177
modules/applications/hawkmoon-roll-dialog.mjs
Normal file
@@ -0,0 +1,177 @@
|
||||
import { HawkmoonUtility } from "../hawkmoon-utility.js"
|
||||
import { HAWKMOON_CONFIG } from "../hawkmoon-config.js"
|
||||
|
||||
/**
|
||||
* Dialogue de jet de dé pour Hawkmoon - Version DialogV2
|
||||
*/
|
||||
export class HawkmoonRollDialog {
|
||||
|
||||
/**
|
||||
* Create and display the roll dialog
|
||||
* @param {HawkmoonActor} actor - The actor making the roll
|
||||
* @param {Object} rollData - Data for the roll
|
||||
* @returns {Promise<HawkmoonRollDialog>}
|
||||
*/
|
||||
static async create(actor, rollData) {
|
||||
// Préparer le contexte pour le template
|
||||
const context = {
|
||||
...rollData,
|
||||
difficulte: String(rollData.difficulte || 0), // Convertir en string pour matcher les options du select
|
||||
img: actor.img,
|
||||
name: actor.name,
|
||||
config: HAWKMOON_CONFIG,
|
||||
}
|
||||
|
||||
// Si attrKey est "tochoose", préparer la liste des attributs sélectionnables
|
||||
if (rollData.attrKey === "tochoose") {
|
||||
context.selectableAttributes = actor.system.attributs
|
||||
// Ne pas changer attrKey ni attr - l'utilisateur doit choisir
|
||||
}
|
||||
|
||||
// Rendre le template en HTML
|
||||
const content = await foundry.applications.handlebars.renderTemplate(
|
||||
"systems/fvtt-hawkmoon-cyd/templates/roll-dialog-generic.hbs",
|
||||
context
|
||||
)
|
||||
|
||||
// Utiliser DialogV2.wait avec le HTML rendu
|
||||
return foundry.applications.api.DialogV2.wait({
|
||||
window: { title: "Test de Capacité", icon: "fa-solid fa-dice-d20" },
|
||||
classes: ["hawkmoon-roll-dialog"],
|
||||
position: { width: 480 },
|
||||
modal: false, // Permettre l'interaction avec le canvas pour garder la cible sélectionnée
|
||||
content,
|
||||
buttons: [
|
||||
{
|
||||
action: "rolld10",
|
||||
label: "Lancer 1d10",
|
||||
icon: "fa-solid fa-dice-d10",
|
||||
default: true,
|
||||
callback: (event, button, dialog) => {
|
||||
this._updateRollDataFromForm(rollData, button.form.elements, actor)
|
||||
rollData.mainDice = "d10"
|
||||
HawkmoonUtility.rollHawkmoon(rollData)
|
||||
}
|
||||
},
|
||||
{
|
||||
action: "rolld20",
|
||||
label: "Lancer 1d20",
|
||||
icon: "fa-solid fa-dice-d20",
|
||||
callback: (event, button, dialog) => {
|
||||
this._updateRollDataFromForm(rollData, button.form.elements, actor)
|
||||
rollData.mainDice = "d20"
|
||||
HawkmoonUtility.rollHawkmoon(rollData)
|
||||
}
|
||||
},
|
||||
],
|
||||
rejectClose: false,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Mettre à jour rollData avec les valeurs du formulaire
|
||||
* @param {Object} rollData - L'objet rollData à mettre à jour
|
||||
* @param {HTMLFormControlsCollection} formElements - Les éléments du formulaire
|
||||
* @param {HawkmoonActor} actor - L'acteur pour récupérer les attributs
|
||||
* @private
|
||||
*/
|
||||
static _updateRollDataFromForm(rollData, formElements, actor) {
|
||||
// Attributs
|
||||
if (formElements.attrKey) {
|
||||
rollData.attrKey = formElements.attrKey.value
|
||||
// Si l'attribut a changé, mettre à jour rollData.attr
|
||||
if (rollData.attrKey !== "tochoose" && rollData.attrKey !== "none" && actor) {
|
||||
rollData.attr = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey])
|
||||
rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
|
||||
}
|
||||
}
|
||||
if (formElements.attrKey2) {
|
||||
rollData.attrKey2 = formElements.attrKey2.value
|
||||
}
|
||||
|
||||
// Modificateurs de base
|
||||
if (formElements.difficulte) {
|
||||
rollData.difficulte = Number(formElements.difficulte.value)
|
||||
}
|
||||
if (formElements.modificateur) {
|
||||
rollData.modificateur = Number(formElements.modificateur.value)
|
||||
}
|
||||
if (formElements.soutiens) {
|
||||
rollData.soutiens = Number(formElements.soutiens.value)
|
||||
}
|
||||
|
||||
// Compétence
|
||||
if (formElements.maitrise) {
|
||||
rollData.maitriseId = formElements.maitrise.value
|
||||
}
|
||||
if (formElements.talents) {
|
||||
// Récupérer toutes les options sélectionnées (select multiple)
|
||||
const selectedOptions = Array.from(formElements.talents.selectedOptions)
|
||||
rollData.selectedTalents = selectedOptions.map(opt => opt.value)
|
||||
}
|
||||
|
||||
// Modificateurs de tir
|
||||
if (formElements.tailleCible) {
|
||||
rollData.tailleCible = formElements.tailleCible.value
|
||||
}
|
||||
if (formElements.tireurDeplacement) {
|
||||
rollData.tireurDeplacement = formElements.tireurDeplacement.value
|
||||
}
|
||||
if (formElements.cibleCouvert) {
|
||||
rollData.cibleCouvert = formElements.cibleCouvert.value
|
||||
}
|
||||
if (formElements.distanceTir) {
|
||||
rollData.distanceTir = formElements.distanceTir.value
|
||||
}
|
||||
if (formElements.cibleDeplace) {
|
||||
rollData.cibleDeplace = formElements.cibleDeplace.checked
|
||||
}
|
||||
if (formElements.cibleCaC) {
|
||||
rollData.cibleCaC = formElements.cibleCaC.checked
|
||||
}
|
||||
|
||||
// Modificateurs de combat (checkboxes)
|
||||
if (formElements.defenseurAuSol) {
|
||||
rollData.defenseurAuSol = formElements.defenseurAuSol.checked
|
||||
}
|
||||
if (formElements.ambidextre1) {
|
||||
rollData.ambidextre1 = formElements.ambidextre1.checked
|
||||
}
|
||||
if (formElements.ambidextre2) {
|
||||
rollData.ambidextre2 = formElements.ambidextre2.checked
|
||||
}
|
||||
if (formElements.attaqueMonte) {
|
||||
rollData.attaqueMonte = formElements.attaqueMonte.checked
|
||||
}
|
||||
if (formElements.defenseurAveugle) {
|
||||
rollData.defenseurAveugle = formElements.defenseurAveugle.checked
|
||||
}
|
||||
if (formElements.defenseurDeDos) {
|
||||
rollData.defenseurDeDos = formElements.defenseurDeDos.checked
|
||||
}
|
||||
if (formElements.defenseurRestreint) {
|
||||
rollData.defenseurRestreint = formElements.defenseurRestreint.checked
|
||||
}
|
||||
if (formElements.defenseurImmobilise) {
|
||||
rollData.defenseurImmobilise = formElements.defenseurImmobilise.checked
|
||||
}
|
||||
if (formElements.attaqueCharge) {
|
||||
rollData.attaqueCharge = formElements.attaqueCharge.checked
|
||||
}
|
||||
if (formElements.chargeCavalerie) {
|
||||
rollData.chargeCavalerie = formElements.chargeCavalerie.checked
|
||||
}
|
||||
if (formElements.attaquantsMultiple) {
|
||||
rollData.attaquantsMultiple = formElements.attaquantsMultiple.checked
|
||||
}
|
||||
if (formElements.feinte) {
|
||||
rollData.feinte = formElements.feinte.checked
|
||||
}
|
||||
if (formElements.contenir) {
|
||||
rollData.contenir = formElements.contenir.checked
|
||||
}
|
||||
if (formElements.attaqueDesarme) {
|
||||
rollData.attaqueDesarme = formElements.attaqueDesarme.checked
|
||||
}
|
||||
}
|
||||
}
|
||||
17
modules/applications/sheets/_module.mjs
Normal file
17
modules/applications/sheets/_module.mjs
Normal file
@@ -0,0 +1,17 @@
|
||||
export { default as HawkmoonTalentSheet } from "./talent-sheet.mjs"
|
||||
export { default as HawkmoonCompetenceSheet } from "./competence-sheet.mjs"
|
||||
export { default as HawkmoonArmeSheet } from "./arme-sheet.mjs"
|
||||
export { default as HawkmoonProtectionSheet } from "./protection-sheet.mjs"
|
||||
export { default as HawkmoonHistoriqueSheet } from "./historique-sheet.mjs"
|
||||
export { default as HawkmoonProfilSheet } from "./profil-sheet.mjs"
|
||||
export { default as HawkmoonEquipementSheet } from "./equipement-sheet.mjs"
|
||||
export { default as HawkmoonMonnaieSheet } from "./monnaie-sheet.mjs"
|
||||
export { default as HawkmoonArtefactSheet } from "./artefact-sheet.mjs"
|
||||
export { default as HawkmoonRessourceSheet } from "./ressource-sheet.mjs"
|
||||
export { default as HawkmoonContactSheet } from "./contact-sheet.mjs"
|
||||
export { default as HawkmoonMutationSheet } from "./mutation-sheet.mjs"
|
||||
|
||||
// Actor sheets
|
||||
export { default as HawkmoonPersonnageSheet } from "./personnage-sheet.mjs"
|
||||
export { default as HawkmoonCreatureSheet } from "./creature-sheet.mjs"
|
||||
export { default as HawkmoonCelluleSheet } from "./cellule-sheet.mjs"
|
||||
21
modules/applications/sheets/arme-sheet.mjs
Normal file
21
modules/applications/sheets/arme-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonArmeSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["arme"],
|
||||
position: {
|
||||
width: 640,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["arme-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-arme-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/artefact-sheet.mjs
Normal file
21
modules/applications/sheets/artefact-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonArtefactSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["artefact"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["artefact-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-artefact-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
547
modules/applications/sheets/base-actor-sheet.mjs
Normal file
547
modules/applications/sheets/base-actor-sheet.mjs
Normal file
@@ -0,0 +1,547 @@
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||
|
||||
import { HawkmoonUtility } from "../../hawkmoon-utility.js"
|
||||
import { HawkmoonAutomation } from "../../hawkmoon-automation.js"
|
||||
|
||||
export default class HawkmoonActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {
|
||||
/**
|
||||
* Different sheet modes.
|
||||
* @enum {number}
|
||||
*/
|
||||
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
||||
|
||||
constructor(options = {}) {
|
||||
super(options)
|
||||
this.#dragDrop = this.#createDragDropHandlers()
|
||||
this._sheetMode = this.constructor.SHEET_MODES.PLAY // Commencer en mode visualisation
|
||||
}
|
||||
|
||||
#dragDrop
|
||||
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"],
|
||||
position: {
|
||||
width: 640,
|
||||
height: 720,
|
||||
},
|
||||
window: {
|
||||
resizable: true,
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
closeOnSubmit: false,
|
||||
},
|
||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: "form" }],
|
||||
actions: {
|
||||
editImage: HawkmoonActorSheet.#onEditImage,
|
||||
toggleSheet: HawkmoonActorSheet.#onToggleSheet,
|
||||
editItem: HawkmoonActorSheet.#onEditItem,
|
||||
deleteItem: HawkmoonActorSheet.#onDeleteItem,
|
||||
createItem: HawkmoonActorSheet.#onCreateItem,
|
||||
equipItem: HawkmoonActorSheet.#onEquipItem,
|
||||
modifyQuantity: HawkmoonActorSheet.#onModifyQuantity,
|
||||
modifyAdversite: HawkmoonActorSheet.#onModifyAdversite,
|
||||
rollInitiative: HawkmoonActorSheet.#onRollInitiative,
|
||||
rollAttribut: HawkmoonActorSheet.#onRollAttribut,
|
||||
rollCompetence: HawkmoonActorSheet.#onRollCompetence,
|
||||
rollArmeOffensif: HawkmoonActorSheet.#onRollArmeOffensif,
|
||||
rollArmeDegats: HawkmoonActorSheet.#onRollArmeDegats,
|
||||
rollAssommer: HawkmoonActorSheet.#onRollAssommer,
|
||||
rollCoupBas: HawkmoonActorSheet.#onRollCoupBas,
|
||||
rollImmobiliser: HawkmoonActorSheet.#onRollImmobiliser,
|
||||
rollRepousser: HawkmoonActorSheet.#onRollRepousser,
|
||||
rollDesengager: HawkmoonActorSheet.#onRollDesengager,
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the sheet currently in 'Play' mode?
|
||||
* @type {boolean}
|
||||
*/
|
||||
get isPlayMode() {
|
||||
// Initialize if not set
|
||||
if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.PLAY
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the sheet currently in 'Edit' mode?
|
||||
* @type {boolean}
|
||||
*/
|
||||
get isEditMode() {
|
||||
// Initialize if not set
|
||||
if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.EDIT
|
||||
}
|
||||
|
||||
/**
|
||||
* Tab groups state
|
||||
* @type {object}
|
||||
*/
|
||||
tabGroups = { primary: "principal" }
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const actor = this.document
|
||||
|
||||
const context = {
|
||||
actor: actor,
|
||||
system: actor.system,
|
||||
source: actor.toObject(),
|
||||
fields: actor.schema.fields,
|
||||
systemFields: actor.system.schema.fields,
|
||||
isEditable: this.isEditable,
|
||||
isEditMode: this.isEditMode,
|
||||
isPlayMode: this.isPlayMode,
|
||||
isGM: game.user.isGM,
|
||||
config: CONFIG.HAWKMOON,
|
||||
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.biodata?.description || "", { async: true }),
|
||||
enrichedHabitat: await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.biodata?.habitat || "", { async: true }),
|
||||
}
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
_onRender(context, options) {
|
||||
super._onRender(context, options)
|
||||
|
||||
// Activate drag & drop handlers
|
||||
this.#dragDrop.forEach(d => d.bind(this.element))
|
||||
|
||||
// Manual tab navigation
|
||||
const html = this.element
|
||||
const tabLinks = html.querySelectorAll('a.item[data-tab]')
|
||||
const tabContents = html.querySelectorAll('.tab[data-tab]')
|
||||
|
||||
// Hide all tabs initially
|
||||
tabContents.forEach(tab => {
|
||||
tab.classList.remove('active')
|
||||
tab.style.display = 'none'
|
||||
})
|
||||
|
||||
// Show active tab
|
||||
const activeTab = this.tabGroups.primary
|
||||
const activeTabContent = html.querySelector(`.tab[data-tab="${activeTab}"]`)
|
||||
if (activeTabContent) {
|
||||
activeTabContent.classList.add('active')
|
||||
activeTabContent.style.display = 'block'
|
||||
}
|
||||
|
||||
// Activate the corresponding nav link
|
||||
tabLinks.forEach(link => {
|
||||
if (link.dataset.tab === activeTab) {
|
||||
link.classList.add('active')
|
||||
} else {
|
||||
link.classList.remove('active')
|
||||
}
|
||||
})
|
||||
|
||||
// Tab click handler
|
||||
tabLinks.forEach(link => {
|
||||
link.addEventListener('click', (event) => {
|
||||
event.preventDefault()
|
||||
const tab = link.dataset.tab
|
||||
|
||||
// Update state
|
||||
this.tabGroups.primary = tab
|
||||
|
||||
// Hide all tabs
|
||||
tabContents.forEach(t => {
|
||||
t.classList.remove('active')
|
||||
t.style.display = 'none'
|
||||
})
|
||||
|
||||
// Show selected tab
|
||||
const selectedTab = html.querySelector(`.tab[data-tab="${tab}"]`)
|
||||
if (selectedTab) {
|
||||
selectedTab.classList.add('active')
|
||||
selectedTab.style.display = 'block'
|
||||
}
|
||||
|
||||
// Update nav links
|
||||
tabLinks.forEach(l => {
|
||||
if (l.dataset.tab === tab) {
|
||||
l.classList.add('active')
|
||||
} else {
|
||||
l.classList.remove('active')
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
// Inline item editing
|
||||
html.querySelectorAll('.edit-item-data').forEach(input => {
|
||||
input.addEventListener('change', (event) => {
|
||||
const li = event.target.closest('.item')
|
||||
const itemId = li.dataset.itemId
|
||||
const itemType = li.dataset.itemType
|
||||
const itemField = event.target.dataset.itemField
|
||||
const dataType = event.target.dataset.dtype
|
||||
const value = event.target.value
|
||||
this.actor.editItemField(itemId, itemType, itemField, dataType, value)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// #region Drag & Drop
|
||||
|
||||
/**
|
||||
* Create drag-and-drop workflow handlers for this Application
|
||||
* @returns {DragDrop[]} An array of DragDrop handlers
|
||||
* @private
|
||||
*/
|
||||
#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),
|
||||
drop: this._onDrop.bind(this),
|
||||
}
|
||||
return new foundry.applications.ux.DragDrop(d)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Define whether a user is able to begin a dragstart workflow for a given drag selector
|
||||
* @param {string} selector The candidate HTML selector for dragging
|
||||
* @returns {boolean} Can the current user drag this selector?
|
||||
* @protected
|
||||
*/
|
||||
_canDragStart(selector) {
|
||||
return this.isEditable
|
||||
}
|
||||
|
||||
/**
|
||||
* Define whether a user is able to conclude a drag-and-drop workflow for a given drop selector
|
||||
* @param {string} selector The candidate HTML selector for the drop target
|
||||
* @returns {boolean} Can the current user drop on this selector?
|
||||
* @protected
|
||||
*/
|
||||
_canDragDrop(selector) {
|
||||
return this.isEditable
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback actions which occur at the beginning of a drag start workflow.
|
||||
* @param {DragEvent} event The originating DragEvent
|
||||
* @protected
|
||||
*/
|
||||
_onDragStart(event) {
|
||||
const li = event.currentTarget.closest(".item")
|
||||
if (!li?.dataset.itemId) return
|
||||
const item = this.actor.items.get(li.dataset.itemId)
|
||||
if (!item) return
|
||||
|
||||
const dragData = item.toDragData()
|
||||
event.dataTransfer.setData("text/plain", JSON.stringify(dragData))
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback actions which occur when a dragged element is dropped on a target.
|
||||
* @param {DragEvent} event The originating DragEvent
|
||||
* @protected
|
||||
*/
|
||||
async _onDrop(event) {
|
||||
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
|
||||
const actor = this.actor
|
||||
|
||||
// Handle different data types
|
||||
switch (data.type) {
|
||||
case "Item":
|
||||
return this._onDropItem(event, data)
|
||||
case "Actor":
|
||||
return this._onDropActor(event, data)
|
||||
case "ActiveEffect":
|
||||
return this._onDropActiveEffect(event, data)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle dropping an Item on the actor sheet
|
||||
* @param {DragEvent} event
|
||||
* @param {object} data
|
||||
* @private
|
||||
*/
|
||||
async _onDropItem(event, data) {
|
||||
if (!this.actor.isOwner) return false
|
||||
|
||||
let item = await fromUuid(data.uuid)
|
||||
if (item.pack) {
|
||||
item = await HawkmoonUtility.searchItem(item)
|
||||
}
|
||||
|
||||
const autoresult = HawkmoonAutomation.processAutomations("on-drop", item, this.actor)
|
||||
if (autoresult.isValid) {
|
||||
// In AppV2, we need to get the item data differently
|
||||
const itemData = item.toObject ? item.toObject() : item
|
||||
return this.actor.createEmbeddedDocuments("Item", [itemData])
|
||||
} else {
|
||||
ui.notifications.warn(autoresult.warningMessage)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle dropping an Actor on the sheet
|
||||
* @param {DragEvent} event
|
||||
* @param {object} data
|
||||
* @private
|
||||
*/
|
||||
async _onDropActor(event, data) {
|
||||
// To be implemented by subclasses if needed
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle dropping an ActiveEffect on the sheet
|
||||
* @param {DragEvent} event
|
||||
* @param {object} data
|
||||
* @private
|
||||
*/
|
||||
async _onDropActiveEffect(event, data) {
|
||||
// To be implemented by subclasses if needed
|
||||
return false
|
||||
}
|
||||
|
||||
// #endregion
|
||||
|
||||
// #region Action Handlers
|
||||
|
||||
/**
|
||||
* Toggle between edit and play mode
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static #onToggleSheet(event, target) {
|
||||
console.log("Toggle sheet clicked", this)
|
||||
const wasEditMode = this.isEditMode
|
||||
console.log("Current mode:", this._sheetMode, "isEditMode:", wasEditMode, "isPlayMode:", this.isPlayMode)
|
||||
this._sheetMode = wasEditMode ? this.constructor.SHEET_MODES.PLAY : this.constructor.SHEET_MODES.EDIT
|
||||
console.log("New mode set to:", this._sheetMode, "(", wasEditMode ? "PLAY" : "EDIT", ")")
|
||||
console.log("After change - isEditMode:", this.isEditMode, "isPlayMode:", this.isPlayMode)
|
||||
this.render({ force: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit the actor image
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onEditImage(event, target) {
|
||||
const fp = new FilePicker({
|
||||
type: "image",
|
||||
current: this.actor.img,
|
||||
callback: (path) => {
|
||||
this.actor.update({ img: path })
|
||||
},
|
||||
})
|
||||
return fp.browse()
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit an item
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onEditItem(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const itemId = li?.dataset.itemId
|
||||
if (!itemId) return
|
||||
const item = this.actor.items.get(itemId)
|
||||
if (item) item.sheet.render(true)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onDeleteItem(event, target) {
|
||||
const li = target.closest(".item")
|
||||
await HawkmoonUtility.confirmDelete(this, li)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new item
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onCreateItem(event, target) {
|
||||
const itemType = target.dataset.type
|
||||
await this.actor.createEmbeddedDocuments("Item", [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* Equip/unequip an item
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onEquipItem(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const itemId = li?.dataset.itemId
|
||||
if (itemId) {
|
||||
await this.actor.equipItem(itemId)
|
||||
this.render()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify item quantity
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onModifyQuantity(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const itemId = li?.dataset.itemId
|
||||
const value = Number(target.dataset.quantiteValue)
|
||||
if (itemId) {
|
||||
await this.actor.incDecQuantity(itemId, value)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify adversité
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onModifyAdversite(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const adv = li?.dataset.adversite
|
||||
const value = Number(target.dataset.adversiteValue)
|
||||
if (adv) {
|
||||
await this.actor.incDecAdversite(adv, value)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll initiative
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollInitiative(event, target) {
|
||||
await this.actor.rollAttribut("adr", true)
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll attribut
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollAttribut(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const attrKey = li?.dataset.attrKey
|
||||
if (attrKey) {
|
||||
await this.actor.rollAttribut(attrKey, false)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll competence
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollCompetence(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const attrKey = target.dataset.attrKey
|
||||
const compId = li?.dataset.itemId
|
||||
if (attrKey && compId) {
|
||||
await this.actor.rollCompetence(attrKey, compId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll arme offensif
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollArmeOffensif(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const armeId = li?.dataset.itemId
|
||||
if (armeId) {
|
||||
await this.actor.rollArmeOffensif(armeId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll arme degats
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollArmeDegats(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const armeId = li?.dataset.itemId
|
||||
if (armeId) {
|
||||
await this.actor.rollArmeDegats(armeId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll assommer
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollAssommer(event, target) {
|
||||
await this.actor.rollAssommer()
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll coup bas
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollCoupBas(event, target) {
|
||||
await this.actor.rollCoupBas()
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll immobiliser
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollImmobiliser(event, target) {
|
||||
await this.actor.rollImmobiliser()
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll repousser
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollRepousser(event, target) {
|
||||
await this.actor.rollRepousser()
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll désengager
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onRollDesengager(event, target) {
|
||||
await this.actor.rollDesengager()
|
||||
}
|
||||
|
||||
// #endregion
|
||||
}
|
||||
342
modules/applications/sheets/base-item-sheet.mjs
Normal file
342
modules/applications/sheets/base-item-sheet.mjs
Normal file
@@ -0,0 +1,342 @@
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||
|
||||
export default class HawkmoonItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
|
||||
constructor(options = {}) {
|
||||
super(options)
|
||||
this.#dragDrop = this.#createDragDropHandlers()
|
||||
}
|
||||
|
||||
#dragDrop
|
||||
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["fvtt-hawkmoon-cyd", "item"],
|
||||
position: {
|
||||
width: 620,
|
||||
height: 600,
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
},
|
||||
window: {
|
||||
resizable: true,
|
||||
},
|
||||
tabs: [
|
||||
{
|
||||
navSelector: 'nav[data-group="primary"]',
|
||||
contentSelector: "section.sheet-body",
|
||||
initial: "description",
|
||||
},
|
||||
],
|
||||
dragDrop: [{ dragSelector: "[data-drag]", dropSelector: null }],
|
||||
actions: {
|
||||
editImage: HawkmoonItemSheet.#onEditImage,
|
||||
postItem: HawkmoonItemSheet.#onPostItem,
|
||||
addPredilection: HawkmoonItemSheet.#onAddPredilection,
|
||||
deletePredilection: HawkmoonItemSheet.#onDeletePredilection,
|
||||
addAutomation: HawkmoonItemSheet.#onAddAutomation,
|
||||
deleteAutomation: HawkmoonItemSheet.#onDeleteAutomation,
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Tab groups state
|
||||
* @type {object}
|
||||
*/
|
||||
tabGroups = { primary: "description" }
|
||||
|
||||
/**
|
||||
* Is the sheet currently in 'Play' mode?
|
||||
* @type {boolean}
|
||||
*/
|
||||
/** @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 }),
|
||||
isEditMode: true,
|
||||
isEditable: this.isEditable,
|
||||
isGM: game.user.isGM,
|
||||
config: CONFIG.HAWKMOON,
|
||||
attributs: this.#getAttributs(),
|
||||
}
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
_onRender(context, options) {
|
||||
super._onRender(context, options)
|
||||
this.#dragDrop.forEach((d) => d.bind(this.element))
|
||||
|
||||
// Activate tab navigation manually
|
||||
const nav = this.element.querySelector('nav.tabs[data-group]')
|
||||
if (nav) {
|
||||
const group = nav.dataset.group
|
||||
// Activate the current tab
|
||||
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()
|
||||
})
|
||||
})
|
||||
|
||||
// Show/hide tab content
|
||||
this.element.querySelectorAll('[data-group="' + group + '"][data-tab]').forEach(content => {
|
||||
content.classList.toggle('active', content.dataset.tab === activeTab)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// #region Drag-and-Drop Workflow
|
||||
/**
|
||||
* Create drag-and-drop workflow handlers for this Application
|
||||
* @returns {DragDrop[]} An array of DragDrop handlers
|
||||
* @private
|
||||
*/
|
||||
#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)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Can the User start a drag workflow for a given drag selector?
|
||||
* @param {string} selector The candidate HTML selector for the drag event
|
||||
* @returns {boolean} Can the current user drag this selector?
|
||||
* @protected
|
||||
*/
|
||||
_canDragStart(selector) {
|
||||
return this.isEditable
|
||||
}
|
||||
|
||||
/**
|
||||
* Can the User drop an entry at a given drop selector?
|
||||
* @param {string} selector The candidate HTML selector for the drop event
|
||||
* @returns {boolean} Can the current user drop on this selector?
|
||||
* @protected
|
||||
*/
|
||||
_canDragDrop(selector) {
|
||||
return this.isEditable
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for dragstart events.
|
||||
* @param {DragEvent} event The drag start event
|
||||
* @protected
|
||||
*/
|
||||
_onDragStart(event) {
|
||||
const target = event.currentTarget
|
||||
const dragData = { type: "Item", uuid: this.document.uuid }
|
||||
event.dataTransfer.setData("text/plain", JSON.stringify(dragData))
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for dragover events.
|
||||
* @param {DragEvent} event The drag over event
|
||||
* @protected
|
||||
*/
|
||||
_onDragOver(event) {
|
||||
// Default behavior is fine
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for drop events.
|
||||
* @param {DragEvent} event The drop event
|
||||
* @protected
|
||||
*/
|
||||
async _onDrop(event) {
|
||||
const data = TextEditor.getDragEventData(event)
|
||||
const item = await fromUuid(data.uuid)
|
||||
if (!item) return
|
||||
|
||||
// Handle drop logic here if needed
|
||||
console.log("Item dropped:", item)
|
||||
}
|
||||
// #endregion
|
||||
|
||||
// #region Action Handlers
|
||||
/**
|
||||
* Edit the item image
|
||||
* @param {Event} event The triggering event
|
||||
* @param {HTMLElement} target The target element
|
||||
* @private
|
||||
*/
|
||||
static async #onEditImage(event, target) {
|
||||
const fp = new foundry.applications.ui.FilePicker({
|
||||
type: "image",
|
||||
current: this.document.img,
|
||||
callback: (path) => {
|
||||
this.document.update({ img: path })
|
||||
},
|
||||
})
|
||||
return fp.browse()
|
||||
}
|
||||
|
||||
/**
|
||||
* Post item to chat
|
||||
* @param {Event} event The triggering event
|
||||
* @param {HTMLElement} target The target element
|
||||
* @private
|
||||
*/
|
||||
static async #onPostItem(event, target) {
|
||||
let chatData = foundry.utils.duplicate(this.document)
|
||||
if (this.document.actor) {
|
||||
chatData.actor = { id: this.document.actor.id }
|
||||
}
|
||||
// Don't post any image for the item if the default image is used
|
||||
if (chatData.img.includes("/blank.png")) {
|
||||
chatData.img = null
|
||||
}
|
||||
// JSON object for easy creation
|
||||
chatData.jsondata = JSON.stringify({
|
||||
compendium: "postedItem",
|
||||
payload: chatData,
|
||||
})
|
||||
|
||||
const html = await renderTemplate('systems/fvtt-hawkmoon-cyd/templates/post-item.hbs', chatData)
|
||||
const chatOptions = {
|
||||
user: game.user.id,
|
||||
content: html,
|
||||
}
|
||||
ChatMessage.create(chatOptions)
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a predilection
|
||||
* @param {Event} event The triggering event
|
||||
* @param {HTMLElement} target The target element
|
||||
* @private
|
||||
*/
|
||||
static async #onAddPredilection(event, target) {
|
||||
let pred = foundry.utils.duplicate(this.document.system.predilections || [])
|
||||
pred.push({ name: "Nouvelle prédilection", id: foundry.utils.randomID(16), used: false, acquise: false, maitrise: false, description: "" })
|
||||
await this.document.update({ 'system.predilections': pred })
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a predilection
|
||||
* @param {Event} event The triggering event
|
||||
* @param {HTMLElement} target The target element
|
||||
* @private
|
||||
*/
|
||||
static async #onDeletePredilection(event, target) {
|
||||
const index = parseInt(target.closest("[data-predilection-index]").dataset.predilectionIndex)
|
||||
let pred = foundry.utils.duplicate(this.document.system.predilections)
|
||||
pred.splice(index, 1)
|
||||
await this.document.update({ 'system.predilections': pred })
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an automation
|
||||
* @param {Event} event The triggering event
|
||||
* @param {HTMLElement} target The target element
|
||||
* @private
|
||||
*/
|
||||
static async #onAddAutomation(event, target) {
|
||||
let autom = foundry.utils.duplicate(this.document.system.automations || [])
|
||||
autom.push({
|
||||
eventtype: "on-drop",
|
||||
name: "Automatisation 1",
|
||||
bonusname: "vigueur",
|
||||
bonus: 0,
|
||||
competence: "",
|
||||
minLevel: 0,
|
||||
baCost: 0,
|
||||
id: foundry.utils.randomID(16)
|
||||
})
|
||||
await this.document.update({ 'system.automations': autom })
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an automation
|
||||
* @param {Event} event The triggering event
|
||||
* @param {HTMLElement} target The target element
|
||||
* @private
|
||||
*/
|
||||
static async #onDeleteAutomation(event, target) {
|
||||
const index = parseInt(target.closest("[data-automation-index]").dataset.automationIndex)
|
||||
let autom = foundry.utils.duplicate(this.document.system.automations)
|
||||
autom.splice(index, 1)
|
||||
await this.document.update({ 'system.automations': autom })
|
||||
}
|
||||
// #endregion
|
||||
|
||||
// #region Helper Methods
|
||||
/**
|
||||
* Get list of attributs
|
||||
* @returns {Object}
|
||||
* @private
|
||||
*/
|
||||
#getAttributs() {
|
||||
return {
|
||||
"adr": "Adresse",
|
||||
"pui": "Puissance",
|
||||
"cla": "Clairvoyance",
|
||||
"pre": "Présence",
|
||||
"tre": "Trempe"
|
||||
}
|
||||
}
|
||||
// #endregion
|
||||
|
||||
/** @override */
|
||||
_onChangeForm(formConfig, event) {
|
||||
// Handle special form changes
|
||||
const target = event.target
|
||||
|
||||
// Handle predilection field changes
|
||||
if (target.classList.contains('edit-predilection') ||
|
||||
target.classList.contains('edit-predilection-description') ||
|
||||
target.classList.contains('predilection-acquise') ||
|
||||
target.classList.contains('predilection-maitrise') ||
|
||||
target.classList.contains('predilection-used')) {
|
||||
const li = target.closest('.prediction-item')
|
||||
if (li) {
|
||||
const index = parseInt(li.dataset.predictionIndex)
|
||||
const field = target.classList.contains('edit-predilection') ? 'name' :
|
||||
target.classList.contains('edit-predilection-description') ? 'description' :
|
||||
target.classList.contains('predilection-acquise') ? 'acquise' :
|
||||
target.classList.contains('predilection-maitrise') ? 'maitrise' : 'used'
|
||||
|
||||
let pred = foundry.utils.duplicate(this.document.system.predilections)
|
||||
if (target.type === 'checkbox') {
|
||||
pred[index][field] = target.checked
|
||||
} else {
|
||||
pred[index][field] = target.value
|
||||
}
|
||||
pred[index].id = pred[index].id || foundry.utils.randomID(16)
|
||||
this.document.update({ 'system.predilections': pred })
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Handle automation field changes
|
||||
if (target.classList.contains('automation-edit-field')) {
|
||||
const index = parseInt(target.dataset.automationIndex)
|
||||
const field = target.dataset.automationField
|
||||
let auto = foundry.utils.duplicate(this.document.system.automations)
|
||||
auto[index][field] = target.value
|
||||
auto[index].id = auto[index].id || foundry.utils.randomID(16)
|
||||
this.document.update({ 'system.automations': auto })
|
||||
return
|
||||
}
|
||||
|
||||
super._onChangeForm(formConfig, event)
|
||||
}
|
||||
}
|
||||
142
modules/applications/sheets/cellule-sheet.mjs
Normal file
142
modules/applications/sheets/cellule-sheet.mjs
Normal file
@@ -0,0 +1,142 @@
|
||||
import HawkmoonActorSheet from "./base-actor-sheet.mjs"
|
||||
|
||||
const __ALLOWED_ITEM_CELLULE = { talent: 1, ressource: 1, contact: 1, equipement: 1, protection: 1, artefact: 1, arme: 1, monnaie: 1 }
|
||||
|
||||
export default class HawkmoonCelluleSheet extends HawkmoonActorSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
...super.DEFAULT_OPTIONS,
|
||||
classes: [...super.DEFAULT_OPTIONS.classes],
|
||||
window: {
|
||||
...super.DEFAULT_OPTIONS.window,
|
||||
title: "SHEETS.Actor.cellule",
|
||||
},
|
||||
actions: {
|
||||
...super.DEFAULT_OPTIONS.actions,
|
||||
editActor: HawkmoonCelluleSheet.#onEditActor,
|
||||
deleteActor: HawkmoonCelluleSheet.#onDeleteActor,
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
sheet: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/cellule-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = { primary: "talents" }
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
const actor = this.document
|
||||
|
||||
// Add cellule-specific data
|
||||
context.talents = foundry.utils.duplicate(actor.getTalents() || {})
|
||||
context.ressources = foundry.utils.duplicate(actor.getRessources ? actor.getRessources() : [])
|
||||
context.contacts = foundry.utils.duplicate(actor.getContacts ? actor.getContacts() : [])
|
||||
context.members = this.#getMembers()
|
||||
context.equipements = foundry.utils.duplicate(actor.getEquipments ? actor.getEquipments() : [])
|
||||
context.artefacts = foundry.utils.duplicate(actor.getArtefacts ? actor.getArtefacts() : [])
|
||||
context.armes = foundry.utils.duplicate(actor.getWeapons ? actor.getWeapons() : [])
|
||||
context.monnaies = foundry.utils.duplicate(actor.getMonnaies ? actor.getMonnaies() : [])
|
||||
context.protections = foundry.utils.duplicate(actor.getArmors ? actor.getArmors() : [])
|
||||
context.richesse = actor.computeRichesse ? actor.computeRichesse() : 0
|
||||
context.valeurEquipement = actor.computeValeurEquipement ? actor.computeValeurEquipement() : 0
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.description || "", { async: true })
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* Get members of the cellule with full actor data
|
||||
* @returns {Array}
|
||||
* @private
|
||||
*/
|
||||
#getMembers() {
|
||||
let membersFull = []
|
||||
for (let memberId of this.actor.system.members) {
|
||||
let actor = game.actors.get(memberId)
|
||||
if (actor) {
|
||||
membersFull.push({ name: actor.name, id: actor.id, img: actor.img })
|
||||
}
|
||||
}
|
||||
return membersFull
|
||||
}
|
||||
|
||||
/**
|
||||
* Override _onDropItem to filter allowed item types for cellule
|
||||
* @override
|
||||
*/
|
||||
async _onDropItem(event, data) {
|
||||
const item = await fromUuid(data.uuid)
|
||||
|
||||
// Check if item type is allowed for cellule
|
||||
if (!__ALLOWED_ITEM_CELLULE[item.type]) {
|
||||
ui.notifications.warn(`Le type d'item ${item.type} n'est pas autorisé pour une cellule`)
|
||||
return false
|
||||
}
|
||||
|
||||
return super._onDropItem(event, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* Override _onDropActor to handle adding members
|
||||
* @override
|
||||
*/
|
||||
async _onDropActor(event, data) {
|
||||
const droppedActor = await fromUuid(data.uuid)
|
||||
|
||||
if (droppedActor.type !== "personnage") {
|
||||
ui.notifications.warn("Seuls les personnages peuvent être ajoutés à une cellule")
|
||||
return false
|
||||
}
|
||||
|
||||
// Check if already a member
|
||||
const isMember = this.actor.system.members.includes(droppedActor.id)
|
||||
if (isMember) {
|
||||
ui.notifications.warn("Ce personnage est déjà membre de cette cellule")
|
||||
return false
|
||||
}
|
||||
|
||||
// Add member ID
|
||||
const members = [...this.actor.system.members, droppedActor.id]
|
||||
await this.actor.update({ "system.members": members })
|
||||
return true
|
||||
}
|
||||
|
||||
// #region Cellule-specific Actions
|
||||
|
||||
/**
|
||||
* Edit an actor (member)
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onEditActor(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const actorId = li?.dataset.actorId
|
||||
if (!actorId) return
|
||||
const actor = game.actors.get(actorId)
|
||||
if (actor) actor.sheet.render(true)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an actor (remove member)
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onDeleteActor(event, target) {
|
||||
const li = target.closest(".item")
|
||||
const actorId = li?.dataset.actorId
|
||||
if (actorId) {
|
||||
const members = this.actor.system.members.filter(id => id !== actorId)
|
||||
await this.actor.update({ "system.members": members })
|
||||
}
|
||||
}
|
||||
|
||||
// #endregion
|
||||
}
|
||||
21
modules/applications/sheets/competence-sheet.mjs
Normal file
21
modules/applications/sheets/competence-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonCompetenceSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["competence"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["competence-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-competence-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/contact-sheet.mjs
Normal file
21
modules/applications/sheets/contact-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonContactSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["contact"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["contact-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-contact-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
60
modules/applications/sheets/creature-sheet.mjs
Normal file
60
modules/applications/sheets/creature-sheet.mjs
Normal file
@@ -0,0 +1,60 @@
|
||||
import HawkmoonActorSheet from "./base-actor-sheet.mjs"
|
||||
import { HawkmoonUtility } from "../../hawkmoon-utility.js"
|
||||
|
||||
export default class HawkmoonCreatureSheet extends HawkmoonActorSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
...super.DEFAULT_OPTIONS,
|
||||
classes: [...super.DEFAULT_OPTIONS.classes],
|
||||
window: {
|
||||
...super.DEFAULT_OPTIONS.window,
|
||||
title: "SHEETS.Actor.creature",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
sheet: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/creature-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = { primary: "principal" }
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
const actor = this.document
|
||||
|
||||
// Add creature-specific data
|
||||
context.skills = actor.getSkills ? actor.getSkills() : []
|
||||
context.armes = foundry.utils.duplicate(actor.getWeapons ? actor.getWeapons() : [])
|
||||
context.protections = foundry.utils.duplicate(actor.getArmors ? actor.getArmors() : [])
|
||||
context.combat = actor.getCombatValues ? actor.getCombatValues() : {}
|
||||
context.equipements = foundry.utils.duplicate(actor.getEquipments ? actor.getEquipments() : [])
|
||||
context.talents = foundry.utils.duplicate(actor.getTalents ? actor.getTalents() : [])
|
||||
context.talentsCell = this.#getCelluleTalents()
|
||||
context.nbCombativite = actor.system.sante?.nbcombativite || 0
|
||||
context.combativiteList = HawkmoonUtility.getCombativiteList(actor.system.sante?.nbcombativite || 0)
|
||||
context.initiative = actor.getFlag("world", "last-initiative") || -1
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.biodata?.description || "", { async: true })
|
||||
context.enrichedHabitat = await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.biodata?.habitat || "", { async: true })
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* Get talents from attached cellule
|
||||
* @private
|
||||
*/
|
||||
#getCelluleTalents() {
|
||||
const celluleId = this.actor.system?.details?.celluleid
|
||||
if (!celluleId) return []
|
||||
|
||||
const cellule = game.actors.get(celluleId)
|
||||
if (!cellule) return []
|
||||
|
||||
return foundry.utils.duplicate(cellule.getTalents?.() || [])
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/equipement-sheet.mjs
Normal file
21
modules/applications/sheets/equipement-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonEquipementSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["equipement"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["equipement-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-equipement-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/historique-sheet.mjs
Normal file
21
modules/applications/sheets/historique-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonHistoriqueSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["historique"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["historique-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-historique-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/monnaie-sheet.mjs
Normal file
21
modules/applications/sheets/monnaie-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonMonnaieSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["monnaie"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["monnaie-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-monnaie-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/mutation-sheet.mjs
Normal file
21
modules/applications/sheets/mutation-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonMutationSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["mutation"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["mutation-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-mutation-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
104
modules/applications/sheets/personnage-sheet.mjs
Normal file
104
modules/applications/sheets/personnage-sheet.mjs
Normal file
@@ -0,0 +1,104 @@
|
||||
import HawkmoonActorSheet from "./base-actor-sheet.mjs"
|
||||
import { HawkmoonUtility } from "../../hawkmoon-utility.js"
|
||||
|
||||
export default class HawkmoonPersonnageSheet extends HawkmoonActorSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
...super.DEFAULT_OPTIONS,
|
||||
classes: [...super.DEFAULT_OPTIONS.classes],
|
||||
window: {
|
||||
...super.DEFAULT_OPTIONS.window,
|
||||
title: "SHEETS.Actor.personnage",
|
||||
},
|
||||
actions: {
|
||||
...super.DEFAULT_OPTIONS.actions,
|
||||
openCellule: HawkmoonPersonnageSheet.#onOpenCellule,
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
sheet: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/actor-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = { primary: "principal" }
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
const actor = this.document
|
||||
|
||||
// Add personnage-specific data
|
||||
context.skills = actor.getSkills()
|
||||
context.armes = foundry.utils.duplicate(actor.getWeapons())
|
||||
context.monnaies = foundry.utils.duplicate(actor.getMonnaies())
|
||||
context.protections = foundry.utils.duplicate(actor.getArmors())
|
||||
context.historiques = foundry.utils.duplicate(actor.getHistoriques() || [])
|
||||
context.talents = foundry.utils.duplicate(actor.getTalents() || [])
|
||||
context.mutations = foundry.utils.duplicate(actor.getMutations() || [])
|
||||
context.talentsCell = this.#getCelluleTalents()
|
||||
context.celluleId = this.#getCelluleId()
|
||||
context.profils = foundry.utils.duplicate(actor.getProfils() || [])
|
||||
context.combat = actor.getCombatValues()
|
||||
context.equipements = foundry.utils.duplicate(actor.getEquipments())
|
||||
context.artefacts = foundry.utils.duplicate(actor.getArtefacts())
|
||||
context.richesse = actor.computeRichesse()
|
||||
context.coupDevastateur = actor.items.find(it => it.type == "talent" && it.name.toLowerCase() == "coup devastateur" && !it.system.used)
|
||||
context.valeurEquipement = actor.computeValeurEquipement()
|
||||
context.nbCombativite = actor.system.sante.nbcombativite
|
||||
context.combativiteList = HawkmoonUtility.getCombativiteList(actor.system.sante.nbcombativite)
|
||||
context.initiative = actor.getFlag("world", "last-initiative") || -1
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* Get talents from cellules this actor is a member of
|
||||
* @returns {Array}
|
||||
* @private
|
||||
*/
|
||||
#getCelluleTalents() {
|
||||
let talents = []
|
||||
for (let cellule of game.actors) {
|
||||
if (cellule.type == "cellule") {
|
||||
let found = cellule.system.members.includes(this.actor.id)
|
||||
if (found) {
|
||||
talents = talents.concat(cellule.getTalents())
|
||||
}
|
||||
}
|
||||
}
|
||||
return talents
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ID of the cellule this actor is a member of
|
||||
* @returns {string|null}
|
||||
* @private
|
||||
*/
|
||||
#getCelluleId() {
|
||||
for (let cellule of game.actors) {
|
||||
if (cellule.type == "cellule") {
|
||||
if (cellule.system.members.includes(this.actor.id)) {
|
||||
return cellule.id
|
||||
}
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Open cellule sheet
|
||||
* @param {Event} event
|
||||
* @param {HTMLElement} target
|
||||
* @private
|
||||
*/
|
||||
static async #onOpenCellule(event, target) {
|
||||
const celluleId = target.dataset.celluleId
|
||||
if (!celluleId) return
|
||||
const cellule = game.actors.get(celluleId)
|
||||
if (cellule) cellule.sheet.render(true)
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/profil-sheet.mjs
Normal file
21
modules/applications/sheets/profil-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonProfilSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["profil"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["profil-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-profil-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/protection-sheet.mjs
Normal file
21
modules/applications/sheets/protection-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonProtectionSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["protection"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["protection-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-protection-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
21
modules/applications/sheets/ressource-sheet.mjs
Normal file
21
modules/applications/sheets/ressource-sheet.mjs
Normal file
@@ -0,0 +1,21 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonRessourceSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["ressource"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["ressource-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-ressource-sheet.hbs",
|
||||
},
|
||||
}
|
||||
}
|
||||
51
modules/applications/sheets/talent-sheet.mjs
Normal file
51
modules/applications/sheets/talent-sheet.mjs
Normal file
@@ -0,0 +1,51 @@
|
||||
import HawkmoonItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class HawkmoonTalentSheet extends HawkmoonItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["talent"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["talent-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-talent-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
primary: "description",
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare an array of form header tabs.
|
||||
* @returns {Record<string, Partial<ApplicationTab>>}
|
||||
*/
|
||||
#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
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
context.tabs = this.#getTabs()
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
|
||||
return context
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -------------------------------------------- */
|
||||
import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonRollDialog } from "./hawkmoon-roll-dialog.js";
|
||||
import { HawkmoonRollDialog } from "./applications/hawkmoon-roll-dialog.mjs";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
const __degatsBonus = [-2, -2, -1, -1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10]
|
||||
@@ -655,8 +655,7 @@ export class HawkmoonActor extends Actor {
|
||||
let rollData = this.getCommonRollData(attrKey)
|
||||
rollData.multiplier = (isInit) ? 1 : 2
|
||||
rollData.isInit = isInit
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -664,22 +663,30 @@ export class HawkmoonActor extends Actor {
|
||||
let rollData = this.getCommonRollData(attrKey, compId)
|
||||
rollData.multiplier = 1 // Attr multiplier, always 1 in competence mode
|
||||
console.log("RollDatra", rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollArmeOffensif(armeId) {
|
||||
let arme = this.items.get(armeId)
|
||||
if (!arme.system.equipped) {
|
||||
ui.notifications.warn("Cette arme doit être équipée pour pouvoir attaquer !")
|
||||
return
|
||||
}
|
||||
if (arme.type == "arme") {
|
||||
arme = this.prepareArme(arme)
|
||||
}
|
||||
if (!arme.system.competence) {
|
||||
ui.notifications.warn("Aucune compétence trouvée pour cette arme !")
|
||||
return
|
||||
}
|
||||
let rollData = this.getCommonRollData(arme.system.attrKey, arme.system.competence._id)
|
||||
rollData.arme = arme
|
||||
rollData.isCombat = true
|
||||
rollData.isTir = arme.system.isDistance || false
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
console.log("ARME!", rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollAssommer() {
|
||||
@@ -687,8 +694,7 @@ export class HawkmoonActor extends Actor {
|
||||
rollData.assomer = true
|
||||
rollData.conditionsCommunes = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollCoupBas() {
|
||||
@@ -696,8 +702,7 @@ export class HawkmoonActor extends Actor {
|
||||
rollData.coupBas = true
|
||||
rollData.conditionsCommunes = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollImmobiliser() {
|
||||
@@ -706,8 +711,7 @@ export class HawkmoonActor extends Actor {
|
||||
rollData.conditionsCommunes = true
|
||||
rollData.cibleconsciente = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollRepousser() {
|
||||
@@ -716,8 +720,7 @@ export class HawkmoonActor extends Actor {
|
||||
rollData.conditionsCommunes = true
|
||||
rollData.cibleconsciente = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollDesengager() {
|
||||
@@ -725,13 +728,16 @@ export class HawkmoonActor extends Actor {
|
||||
rollData.desengager = true
|
||||
rollData.conditionsCommunes = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
await HawkmoonRollDialog.create(this, rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollArmeDegats(armeId, targetVigueur = undefined, rollDataInput = undefined) {
|
||||
let arme = this.items.get(armeId)
|
||||
if (!arme.system.equipped) {
|
||||
ui.notifications.warn("Cette arme doit être équipée pour pouvoir infliger des dégâts !")
|
||||
return
|
||||
}
|
||||
if (arme.type == "arme") {
|
||||
arme = this.prepareArme(arme)
|
||||
}
|
||||
@@ -782,7 +788,7 @@ export class HawkmoonActor extends Actor {
|
||||
nbEtatPerdus: nbEtatPerdus
|
||||
}
|
||||
HawkmoonUtility.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-degats-result.html`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-degats-result.hbs`, rollData)
|
||||
})
|
||||
|
||||
if (rollDataInput?.defenderTokenId && nbEtatPerdus) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* -------------------------------------------- */
|
||||
|
||||
import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonRollDialog } from "./hawkmoon-roll-dialog.js";
|
||||
import { HawkmoonRollDialog } from "./applications/hawkmoon-roll-dialog.mjs";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class HawkmoonCommands {
|
||||
@@ -106,18 +106,17 @@ export class HawkmoonCommands {
|
||||
static _chatAnswer(msg, content) {
|
||||
msg.whisper = [game.user.id];
|
||||
msg.content = content;
|
||||
ChatMessage.create(msg);
|
||||
ChatMessage.create(msg);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async poolRoll( msg) {
|
||||
let rollData = HawkmoonUtility.getBasicRollData()
|
||||
rollData.alias = "Dice Pool Roll",
|
||||
rollData.alias = "Dice Pool Roll",
|
||||
rollData.mode = "generic"
|
||||
rollData.title = `Dice Pool Roll`;
|
||||
|
||||
let rollDialog = await HawkmoonRollDialog.create( this, rollData);
|
||||
rollDialog.render( true );
|
||||
|
||||
await HawkmoonRollDialog.create( this, rollData);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -24,7 +24,7 @@ export class HawkmoonTokenHud {
|
||||
|
||||
const controlIconActions = $(html).find('.control-icon[data-action=combat]');
|
||||
// initiative
|
||||
await HawkmoonTokenHud._configureSubMenu(controlIconActions, 'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html', hudData,
|
||||
await HawkmoonTokenHud._configureSubMenu(controlIconActions, 'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.hbs', hudData,
|
||||
(event) => {
|
||||
let adversite = event.currentTarget.attributes['data-action-index'].value
|
||||
let value = Number(event.currentTarget.attributes['data-action-value'].value)
|
||||
|
||||
@@ -9,10 +9,7 @@
|
||||
/* -------------------------------------------- */
|
||||
// Import Modules
|
||||
import { HawkmoonActor } from "./hawkmoon-actor.js";
|
||||
import { HawkmoonItemSheet } from "./hawkmoon-item-sheet.js";
|
||||
import { HawkmoonActorSheet } from "./hawkmoon-actor-sheet.js";
|
||||
import { HawkmoonCreatureSheet } from "./hawkmoon-creature-sheet.js";
|
||||
import { HawkmoonCelluleSheet } from "./hawkmoon-cellule-sheet.js";
|
||||
|
||||
import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonCombat } from "./hawkmoon-combat.js";
|
||||
import { HawkmoonItem } from "./hawkmoon-item.js";
|
||||
@@ -20,6 +17,12 @@ import { HawkmoonAutomation } from "./hawkmoon-automation.js";
|
||||
import { HawkmoonTokenHud } from "./hawkmoon-hud.js";
|
||||
import { HAWKMOON_CONFIG } from "./hawkmoon-config.js";
|
||||
|
||||
// Import DataModels
|
||||
import * as models from "./models/index.mjs";
|
||||
|
||||
// Import AppV2 Item Sheets
|
||||
import * as sheets from "./applications/sheets/_module.mjs";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Foundry VTT Initialization */
|
||||
/* -------------------------------------------- */
|
||||
@@ -48,22 +51,59 @@ Hooks.once("init", async function () {
|
||||
// Define custom Entity classes
|
||||
CONFIG.Combat.documentClass = HawkmoonCombat
|
||||
CONFIG.Actor.documentClass = HawkmoonActor
|
||||
CONFIG.Actor.dataModels = {
|
||||
personnage: models.PersonnageDataModel,
|
||||
cellule: models.CelluleDataModel,
|
||||
creature: models.CreatureDataModel
|
||||
}
|
||||
|
||||
CONFIG.Item.documentClass = HawkmoonItem
|
||||
CONFIG.Item.dataModels = {
|
||||
talent: models.TalentDataModel,
|
||||
historique: models.HistoriqueDataModel,
|
||||
profil: models.ProfilDataModel,
|
||||
competence: models.CompetenceDataModel,
|
||||
arme: models.ArmeDataModel,
|
||||
protection: models.ProtectionDataModel,
|
||||
monnaie: models.MonnaieDataModel,
|
||||
equipement: models.EquipementDataModel,
|
||||
artefact: models.ArtefactDataModel,
|
||||
ressource: models.RessourceDataModel,
|
||||
contact: models.ContactDataModel,
|
||||
mutation: models.MutationDataModel
|
||||
}
|
||||
|
||||
CONFIG.HAWKMOON = HAWKMOON_CONFIG
|
||||
|
||||
game.system.hawkmoon = {
|
||||
HawkmoonUtility,
|
||||
HawkmoonAutomation,
|
||||
config : HAWKMOON_CONFIG
|
||||
config: HAWKMOON_CONFIG,
|
||||
models,
|
||||
sheets
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Regster sheet application classes
|
||||
// Register sheet application classes
|
||||
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonActorSheet, { types: ["personnage"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCreatureSheet, { types: ["creature"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCelluleSheet, { types: ["cellule"], makeDefault: true });
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonPersonnageSheet, { types: ["personnage"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonCreatureSheet, { types: ["creature"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonCelluleSheet, { types: ["cellule"], makeDefault: true });
|
||||
|
||||
// Register AppV2 Item Sheets
|
||||
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", HawkmoonItemSheet, { makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonTalentSheet, { types: ["talent"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonCompetenceSheet, { types: ["competence"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonArmeSheet, { types: ["arme"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonProtectionSheet, { types: ["protection"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonHistoriqueSheet, { types: ["historique"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonProfilSheet, { types: ["profil"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonEquipementSheet, { types: ["equipement"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonMonnaieSheet, { types: ["monnaie"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonArtefactSheet, { types: ["artefact"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonRessourceSheet, { types: ["ressource"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonContactSheet, { types: ["contact"], makeDefault: true })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", sheets.HawkmoonMutationSheet, { types: ["mutation"], makeDefault: true })
|
||||
|
||||
HawkmoonUtility.init()
|
||||
HawkmoonAutomation.init()
|
||||
@@ -76,12 +116,39 @@ function welcomeMessage() {
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
whisper: [game.user.id],
|
||||
content: `<div id="welcome-message-Hawkmoon"><span class="rdd-roll-part">
|
||||
<strong>Bienvenue dans Hawkmoon et le troisième Millénaire !</strong>
|
||||
<p>Les livres de Hawkmoon sont nécessaires pour jouer : https://www.titam-france.fr</p>
|
||||
<p>Hawkmoon est jeu de rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.</p>
|
||||
<p>Système développé par LeRatierBretonnien, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p>
|
||||
` });
|
||||
content: `
|
||||
<div class="hawkmoon-chat-result">
|
||||
<div class="chat-result-header">
|
||||
<img class="actor-icon" src="systems/fvtt-hawkmoon-cyd/assets/logos/hawkmoon_logo.webp" alt="Hawkmoon" />
|
||||
<div class="header-info">
|
||||
<h4 class="actor-name">Bienvenue dans Hawkmoon !</h4>
|
||||
<div class="action-title">
|
||||
<i class="fas fa-book-open"></i>
|
||||
Le Troisième Millénaire
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="result-details">
|
||||
<div class="details-section">
|
||||
<h5 class="section-title"><i class="fas fa-info-circle"></i> Informations importantes</h5>
|
||||
<div class="description-content">
|
||||
<p><strong>Les livres de Hawkmoon sont nécessaires pour jouer.</strong></p>
|
||||
<p>Hawkmoon est un jeu de rôle publié par <strong>Titam France / Sombres projets</strong>, tous les droits leur appartiennent.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="details-section">
|
||||
<h5 class="section-title"><i class="fas fa-users"></i> Support & Communauté</h5>
|
||||
<div class="description-content">
|
||||
<p>Système développé par <strong>LeRatierBretonnien</strong></p>
|
||||
<p>Support disponible sur le <a href="https://discord.gg/pPSDNJk" target="_blank" style="color: #d4af37; text-decoration: underline;">Discord FR de Foundry VTT</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -113,10 +180,10 @@ Hooks.once("ready", function () {
|
||||
});
|
||||
}
|
||||
|
||||
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
|
||||
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
|
||||
console.log("ClassCounter loaded", moduleCounter)
|
||||
moduleCounter.ClassCounter.registerUsageCount()
|
||||
}).catch(err=>
|
||||
}).catch(err =>
|
||||
console.log("No stats available, giving up.")
|
||||
)
|
||||
|
||||
|
||||
@@ -205,13 +205,13 @@ export class HawkmoonUtility {
|
||||
static async preloadHandlebarsTemplates() {
|
||||
|
||||
const templatePaths = [
|
||||
'systems/fvtt-hawkmoon-cyd/templates/editor-notes-gm.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-header.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-description.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-nav.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-prix.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-automation.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/editor-notes-gm.hbs',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-header.hbs',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-description.hbs',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-nav.hbs',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-prix.hbs',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-automation.hbs',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.hbs',
|
||||
]
|
||||
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
||||
}
|
||||
@@ -265,11 +265,14 @@ export class HawkmoonUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getTarget() {
|
||||
if (game.user.targets && game.user.targets.size == 1) {
|
||||
console.log("getTarget - targets size:", game.user.targets?.size)
|
||||
if (game.user.targets && game.user.targets.size >= 1) {
|
||||
for (let target of game.user.targets) {
|
||||
return target;
|
||||
console.log("getTarget - Returning target:", target.id)
|
||||
return target; // Prendre la première cible si plusieurs
|
||||
}
|
||||
}
|
||||
console.log("getTarget - No target found")
|
||||
return undefined;
|
||||
}
|
||||
|
||||
@@ -443,11 +446,10 @@ export class HawkmoonUtility {
|
||||
}
|
||||
}
|
||||
}
|
||||
rollData.diceFormula += `+${rollData.bonusMalusContext}`
|
||||
} else if (rollData.attr2) {
|
||||
rollData.diceFormula += `+${rollData.attr.value}+${rollData.attr2.value}+${rollData.modificateur}+${rollData.bonusMalusContext}`
|
||||
rollData.diceFormula += `+${rollData.attr.value}+${rollData.attr2.value}+${rollData.modificateur}`
|
||||
} else {
|
||||
rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}+${rollData.bonusMalusContext}`
|
||||
rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}`
|
||||
}
|
||||
|
||||
// Bonus arme naturelle en défense
|
||||
@@ -526,7 +528,7 @@ export class HawkmoonUtility {
|
||||
}
|
||||
|
||||
this.createChatWithRollMode(rollData.alias, {
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.hbs`, rollData)
|
||||
}, rollData)
|
||||
|
||||
if ((rollData.coupBas || rollData.arme) && rollData.isSuccess && rollData.defenderTokenId) {
|
||||
@@ -568,7 +570,7 @@ export class HawkmoonUtility {
|
||||
this.computeResultQuality(rollData)
|
||||
|
||||
this.createChatWithRollMode(rollData.alias, {
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.hbs`, rollData)
|
||||
}, rollData)
|
||||
|
||||
}
|
||||
@@ -651,9 +653,13 @@ export class HawkmoonUtility {
|
||||
break;
|
||||
}
|
||||
chatOptions.alias = chatOptions.alias || name
|
||||
|
||||
// Ajouter le flag directement dans les options pour éviter les problèmes de timing
|
||||
if (rollData) {
|
||||
chatOptions.flags = { world: { "hawkmoon-roll": rollData } }
|
||||
}
|
||||
|
||||
let msg = await ChatMessage.create(chatOptions)
|
||||
console.log("=======>", rollData)
|
||||
msg.setFlag("world", "hawkmoon-roll", rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -664,8 +670,7 @@ export class HawkmoonUtility {
|
||||
modificateursOptions: this.getModificateurOptions(),
|
||||
pointAmeOptions: this.getPointAmeOptions(),
|
||||
difficulte: 0,
|
||||
modificateur: 0,
|
||||
bonusMalusContext: 0,
|
||||
modificateur: "0",
|
||||
bonusArmeNaturelle: 0,
|
||||
defenseurAveugle: false,
|
||||
defenseurDeDos: false,
|
||||
@@ -676,6 +681,8 @@ export class HawkmoonUtility {
|
||||
tireurDeplacement: "immobile",
|
||||
cibleCouvert: "aucun",
|
||||
distanceTir: "porteemoyenne",
|
||||
cibleDeplace: false,
|
||||
cibleCaC: false,
|
||||
attaqueCharge: false,
|
||||
attaqueDesarme: false,
|
||||
attaqueAmbidextre1: false,
|
||||
@@ -690,10 +697,18 @@ export class HawkmoonUtility {
|
||||
/* -------------------------------------------- */
|
||||
static updateWithTarget(rollData) {
|
||||
let target = HawkmoonUtility.getTarget()
|
||||
console.log("updateWithTarget - Current target:", target)
|
||||
console.log("updateWithTarget - Existing defenderTokenId:", rollData.defenderTokenId)
|
||||
if (target) {
|
||||
rollData.defenderTokenId = target.id
|
||||
console.log("updateWithTarget - Set defenderTokenId to:", rollData.defenderTokenId)
|
||||
}
|
||||
// Utiliser la cible déjà enregistrée si aucune cible n'est actuellement sélectionnée
|
||||
if (rollData.defenderTokenId) {
|
||||
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
||||
console.log("updateWithTarget - Defender actor:", defender.name)
|
||||
rollData.armeDefense = defender.getBestDefenseValue()
|
||||
console.log("updateWithTarget - armeDefense:", rollData.armeDefense)
|
||||
rollData.armeAttaqueDefenseur = defender.getBestAttackValue()
|
||||
rollData.targetVigueur = defender.getVigueur()
|
||||
rollData.protectionDefenseur = defender.getProtection()
|
||||
@@ -709,14 +724,23 @@ export class HawkmoonUtility {
|
||||
rollData.difficulte = rollData.armeAttaqueDefenseur?.system?.totalOffensif || 0;
|
||||
} else if (rollData.armeDefense) {
|
||||
rollData.difficulte = rollData.armeDefense.system.totalDefensif
|
||||
if (!rollData.desengager && !rollData.arme.system.armenaturelle && !rollData.arme.system.armefortune) {
|
||||
console.log("updateWithTarget - Calculated difficulte from armeDefense:", rollData.difficulte)
|
||||
if (rollData.arme && !rollData.desengager && !rollData.arme.system.armenaturelle && !rollData.arme.system.armefortune) {
|
||||
if (rollData.armeDefense.system.armenaturelle || rollData.armeDefense.system.armefortune) {
|
||||
rollData.bonusArmeNaturelle = 3
|
||||
}
|
||||
}
|
||||
} else if (rollData.arme?.system.isDistance) {
|
||||
// Pour les armes à distance, calculer la difficulté de base (protection + distance par défaut)
|
||||
const distanceValues = { "porteecourte": 5, "porteemoyenne": 9, "porteelongue": 14 }
|
||||
rollData.difficulte = rollData.protectionDefenseur + distanceValues[rollData.distanceTir || "porteemoyenne"]
|
||||
console.log("updateWithTarget - Calculated difficulte for ranged:", rollData.difficulte, "= protection", rollData.protectionDefenseur, "+ distance", distanceValues[rollData.distanceTir || "porteemoyenne"])
|
||||
} else {
|
||||
console.log("updateWithTarget - No armeDefense found!")
|
||||
ui.notifications.warn("Aucune arme de défense équipée, difficulté manuelle à positionner.")
|
||||
}
|
||||
} else {
|
||||
console.log("updateWithTarget - No defenderTokenId, skipping target calculations")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -807,7 +831,7 @@ export class HawkmoonUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async confirmDelete(actorSheet, li) {
|
||||
let itemId = li.data("item-id");
|
||||
let itemId = li.dataset.itemId;
|
||||
let msgTxt = "<p>Etes vous certain de vouloir supprimer cet item ?";
|
||||
let buttons = {
|
||||
delete: {
|
||||
@@ -815,7 +839,7 @@ export class HawkmoonUtility {
|
||||
label: "Oui !",
|
||||
callback: () => {
|
||||
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
||||
li.slideUp(200, () => actorSheet.render(false));
|
||||
actorSheet.render(false);
|
||||
}
|
||||
},
|
||||
cancel: {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les armes
|
||||
*/
|
||||
export class ArmeDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class ArmeDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les artefacts
|
||||
*/
|
||||
export class ArtefactDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class ArtefactDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les cellules
|
||||
*/
|
||||
export class CelluleDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class CelluleDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les compétences
|
||||
*/
|
||||
export class CompetenceDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class CompetenceDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les contacts
|
||||
*/
|
||||
export class ContactDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class ContactDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les créatures
|
||||
*/
|
||||
export class CreatureDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class CreatureDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
@@ -14,11 +14,11 @@ export class CreatureDataModel extends foundry.abstract.TypeDataModel {
|
||||
cheveux: new fields.StringField({ initial: "" }),
|
||||
sexe: new fields.StringField({ initial: "" }),
|
||||
yeux: new fields.StringField({ initial: "" }),
|
||||
description: new fields.StringField({ initial: "" }),
|
||||
habitat: new fields.StringField({ initial: "" }),
|
||||
notes: new fields.StringField({ initial: "" }),
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
habitat: new fields.HTMLField({ initial: "" }),
|
||||
notes: new fields.HTMLField({ initial: "" }),
|
||||
statut: new fields.StringField({ initial: "" }),
|
||||
gmnotes: new fields.StringField({ initial: "" }),
|
||||
gmnotes: new fields.HTMLField({ initial: "" }),
|
||||
statutresistant: new fields.StringField({ initial: "commun" })
|
||||
}),
|
||||
// Template core
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour l'équipement
|
||||
*/
|
||||
export class EquipementDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class EquipementDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les historiques
|
||||
*/
|
||||
export class HistoriqueDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class HistoriqueDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -4,23 +4,20 @@
|
||||
*/
|
||||
|
||||
// Modèles d'items
|
||||
export { TalentDataModel } from './talent.mjs';
|
||||
export { HistoriqueDataModel } from './historique.mjs';
|
||||
export { ProfilDataModel } from './profil.mjs';
|
||||
export { CompetenceDataModel } from './competence.mjs';
|
||||
export { ArmeDataModel } from './arme.mjs';
|
||||
export { ProtectionDataModel } from './protection.mjs';
|
||||
export { MonnaieDataModel } from './monnaie.mjs';
|
||||
export { EquipementDataModel } from './equipement.mjs';
|
||||
export { ArtefactDataModel } from './artefact.mjs';
|
||||
export { RessourceDataModel } from './ressource.mjs';
|
||||
export { ContactDataModel } from './contact.mjs';
|
||||
export { MutationDataModel } from './mutation.mjs';
|
||||
export { default as TalentDataModel } from './talent.mjs';
|
||||
export { default as HistoriqueDataModel } from './historique.mjs';
|
||||
export { default as ProfilDataModel } from './profil.mjs';
|
||||
export { default as CompetenceDataModel } from './competence.mjs';
|
||||
export { default as ArmeDataModel } from './arme.mjs';
|
||||
export { default as ProtectionDataModel } from './protection.mjs';
|
||||
export { default as MonnaieDataModel } from './monnaie.mjs';
|
||||
export { default as EquipementDataModel } from './equipement.mjs';
|
||||
export { default as ArtefactDataModel } from './artefact.mjs';
|
||||
export { default as RessourceDataModel } from './ressource.mjs';
|
||||
export { default as ContactDataModel } from './contact.mjs';
|
||||
export { default as MutationDataModel } from './mutation.mjs';
|
||||
|
||||
// Modèles d'acteurs
|
||||
export { PersonnageDataModel } from './personnage.mjs';
|
||||
export { CelluleDataModel } from './cellule.mjs';
|
||||
export { CreatureDataModel } from './creature.mjs';
|
||||
|
||||
// Templates de base (si nécessaire pour extension)
|
||||
export { BaseItemModel, BaseEquipItemModel, AutomationItemModel } from './base-item.mjs';
|
||||
export { default as PersonnageDataModel } from './personnage.mjs';
|
||||
export { default as CelluleDataModel } from './cellule.mjs';
|
||||
export { default as CreatureDataModel } from './creature.mjs';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les monnaies
|
||||
*/
|
||||
export class MonnaieDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class MonnaieDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les mutations
|
||||
*/
|
||||
export class MutationDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class MutationDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les personnages
|
||||
*/
|
||||
export class PersonnageDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class PersonnageDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
@@ -14,11 +14,11 @@ export class PersonnageDataModel extends foundry.abstract.TypeDataModel {
|
||||
cheveux: new fields.StringField({ initial: "" }),
|
||||
sexe: new fields.StringField({ initial: "" }),
|
||||
yeux: new fields.StringField({ initial: "" }),
|
||||
description: new fields.StringField({ initial: "" }),
|
||||
habitat: new fields.StringField({ initial: "" }),
|
||||
notes: new fields.StringField({ initial: "" }),
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
habitat: new fields.HTMLField({ initial: "" }),
|
||||
notes: new fields.HTMLField({ initial: "" }),
|
||||
statut: new fields.StringField({ initial: "" }),
|
||||
gmnotes: new fields.StringField({ initial: "" }),
|
||||
gmnotes: new fields.HTMLField({ initial: "" }),
|
||||
statutresistant: new fields.StringField({ initial: "commun" })
|
||||
}),
|
||||
// Template core
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les profils
|
||||
*/
|
||||
export class ProfilDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class ProfilDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les protections
|
||||
*/
|
||||
export class ProtectionDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class ProtectionDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les ressources
|
||||
*/
|
||||
export class RessourceDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class RessourceDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Data model pour les talents
|
||||
*/
|
||||
export class TalentDataModel extends foundry.abstract.TypeDataModel {
|
||||
export default class TalentDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000333
|
||||
MANIFEST-000377
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.155164 7f93eb7fe6c0 Recovering log #331
|
||||
2026/01/05-22:20:56.166270 7f93eb7fe6c0 Delete type=3 #329
|
||||
2026/01/05-22:20:56.166327 7f93eb7fe6c0 Delete type=0 #331
|
||||
2026/01/05-22:39:51.165703 7f93e9ffb6c0 Level-0 table #336: started
|
||||
2026/01/05-22:39:51.165730 7f93e9ffb6c0 Level-0 table #336: 0 bytes OK
|
||||
2026/01/05-22:39:51.171765 7f93e9ffb6c0 Delete type=0 #334
|
||||
2026/01/05-22:39:51.199079 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.199117 7f93e9ffb6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:07.997473 7f1c563fe6c0 Recovering log #375
|
||||
2026/01/09-17:40:08.091717 7f1c563fe6c0 Delete type=0 #375
|
||||
2026/01/09-17:40:08.091792 7f1c563fe6c0 Delete type=3 #373
|
||||
2026/01/09-17:44:28.072757 7f1c54bfb6c0 Level-0 table #380: started
|
||||
2026/01/09-17:44:28.072827 7f1c54bfb6c0 Level-0 table #380: 0 bytes OK
|
||||
2026/01/09-17:44:28.079432 7f1c54bfb6c0 Delete type=0 #378
|
||||
2026/01/09-17:44:28.105106 7f1c54bfb6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.117150 7f1c54bfb6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.288531 7f34ccff96c0 Recovering log #327
|
||||
2025/11/21-21:17:11.303357 7f34ccff96c0 Delete type=3 #325
|
||||
2025/11/21-21:17:11.303441 7f34ccff96c0 Delete type=0 #327
|
||||
2025/11/21-21:20:34.182000 7f322ffff6c0 Level-0 table #332: started
|
||||
2025/11/21-21:20:34.182040 7f322ffff6c0 Level-0 table #332: 0 bytes OK
|
||||
2025/11/21-21:20:34.189103 7f322ffff6c0 Delete type=0 #330
|
||||
2025/11/21-21:20:34.199156 7f322ffff6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.220809 7f322ffff6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.713116 7f93ea7fc6c0 Recovering log #371
|
||||
2026/01/08-08:15:08.722804 7f93ea7fc6c0 Delete type=3 #369
|
||||
2026/01/08-08:15:08.722873 7f93ea7fc6c0 Delete type=0 #371
|
||||
2026/01/08-08:28:05.068912 7f93e9ffb6c0 Level-0 table #376: started
|
||||
2026/01/08-08:28:05.068957 7f93e9ffb6c0 Level-0 table #376: 0 bytes OK
|
||||
2026/01/08-08:28:05.106033 7f93e9ffb6c0 Delete type=0 #374
|
||||
2026/01/08-08:28:05.217659 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:05.217719 7f93e9ffb6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000332
|
||||
MANIFEST-000376
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.048400 7f93eaffd6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.058614 7f93eaffd6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.058678 7f93eaffd6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.125881 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.125907 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.131746 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.137885 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.137919 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:07.215100 7f1c563fe6c0 Recovering log #374
|
||||
2026/01/09-17:40:07.308808 7f1c563fe6c0 Delete type=0 #374
|
||||
2026/01/09-17:40:07.308890 7f1c563fe6c0 Delete type=3 #372
|
||||
2026/01/09-17:44:28.036990 7f1c54bfb6c0 Level-0 table #379: started
|
||||
2026/01/09-17:44:28.037073 7f1c54bfb6c0 Level-0 table #379: 0 bytes OK
|
||||
2026/01/09-17:44:28.043547 7f1c54bfb6c0 Delete type=0 #377
|
||||
2026/01/09-17:44:28.043784 7f1c54bfb6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.043823 7f1c54bfb6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.119952 7f34cd7fa6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.135840 7f34cd7fa6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.135940 7f34cd7fa6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.115063 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.115090 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.121038 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.121241 7f322ffff6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.121271 7f322ffff6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.609938 7f93eaffd6c0 Recovering log #370
|
||||
2026/01/08-08:15:08.619765 7f93eaffd6c0 Delete type=3 #368
|
||||
2026/01/08-08:15:08.619830 7f93eaffd6c0 Delete type=0 #370
|
||||
2026/01/08-08:28:04.844266 7f93e9ffb6c0 Level-0 table #375: started
|
||||
2026/01/08-08:28:04.844294 7f93e9ffb6c0 Level-0 table #375: 0 bytes OK
|
||||
2026/01/08-08:28:04.883113 7f93e9ffb6c0 Delete type=0 #373
|
||||
2026/01/08-08:28:04.919770 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.919798 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000332
|
||||
MANIFEST-000376
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.023009 7f93eb7fe6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.032779 7f93eb7fe6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.032853 7f93eb7fe6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.087705 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.087797 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.094096 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.112531 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.112576 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:07.033899 7f1c55bfd6c0 Recovering log #374
|
||||
2026/01/09-17:40:07.115529 7f1c55bfd6c0 Delete type=0 #374
|
||||
2026/01/09-17:40:07.115669 7f1c55bfd6c0 Delete type=3 #372
|
||||
2026/01/09-17:44:28.002424 7f1c54bfb6c0 Level-0 table #379: started
|
||||
2026/01/09-17:44:28.002453 7f1c54bfb6c0 Level-0 table #379: 0 bytes OK
|
||||
2026/01/09-17:44:28.008591 7f1c54bfb6c0 Delete type=0 #377
|
||||
2026/01/09-17:44:28.016607 7f1c54bfb6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.016651 7f1c54bfb6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.082663 7f34ccff96c0 Recovering log #326
|
||||
2025/11/21-21:17:11.097415 7f34ccff96c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.097522 7f34ccff96c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.082672 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.082698 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.088631 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.094927 7f322ffff6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.094971 7f322ffff6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.584392 7f93eb7fe6c0 Recovering log #370
|
||||
2026/01/08-08:15:08.595037 7f93eb7fe6c0 Delete type=3 #368
|
||||
2026/01/08-08:15:08.595129 7f93eb7fe6c0 Delete type=0 #370
|
||||
2026/01/08-08:28:04.658126 7f93e9ffb6c0 Level-0 table #375: started
|
||||
2026/01/08-08:28:04.658154 7f93e9ffb6c0 Level-0 table #375: 0 bytes OK
|
||||
2026/01/08-08:28:04.696322 7f93e9ffb6c0 Delete type=0 #373
|
||||
2026/01/08-08:28:04.770719 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.770775 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000332
|
||||
MANIFEST-000376
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:55.998572 7f93ea7fc6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.008503 7f93ea7fc6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.008556 7f93ea7fc6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.100430 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.100453 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.106283 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.112557 7f93e9ffb6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.112589 7f93e9ffb6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:06.860640 7f1c553fc6c0 Recovering log #374
|
||||
2026/01/09-17:40:06.945970 7f1c553fc6c0 Delete type=0 #374
|
||||
2026/01/09-17:40:06.946049 7f1c553fc6c0 Delete type=3 #372
|
||||
2026/01/09-17:44:27.995662 7f1c54bfb6c0 Level-0 table #379: started
|
||||
2026/01/09-17:44:27.995696 7f1c54bfb6c0 Level-0 table #379: 0 bytes OK
|
||||
2026/01/09-17:44:28.002283 7f1c54bfb6c0 Delete type=0 #377
|
||||
2026/01/09-17:44:28.016595 7f1c54bfb6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.016641 7f1c54bfb6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.044217 7f34ce7fc6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.059351 7f34ce7fc6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.059409 7f34ce7fc6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.076024 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.076057 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.082546 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.094915 7f322ffff6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.094962 7f322ffff6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.560342 7f93eaffd6c0 Recovering log #370
|
||||
2026/01/08-08:15:08.570307 7f93eaffd6c0 Delete type=3 #368
|
||||
2026/01/08-08:15:08.570398 7f93eaffd6c0 Delete type=0 #370
|
||||
2026/01/08-08:28:04.883258 7f93e9ffb6c0 Level-0 table #375: started
|
||||
2026/01/08-08:28:04.883283 7f93e9ffb6c0 Level-0 table #375: 0 bytes OK
|
||||
2026/01/08-08:28:04.919585 7f93e9ffb6c0 Delete type=0 #373
|
||||
2026/01/08-08:28:04.919781 7f93e9ffb6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.919805 7f93e9ffb6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000332
|
||||
MANIFEST-000376
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.073305 7f93eb7fe6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.084269 7f93eb7fe6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.084336 7f93eb7fe6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.112726 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.112760 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.119133 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.137862 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.137903 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:07.398683 7f1c55bfd6c0 Recovering log #374
|
||||
2026/01/09-17:40:07.488253 7f1c55bfd6c0 Delete type=0 #374
|
||||
2026/01/09-17:40:07.488337 7f1c55bfd6c0 Delete type=3 #372
|
||||
2026/01/09-17:44:28.016766 7f1c54bfb6c0 Level-0 table #379: started
|
||||
2026/01/09-17:44:28.016805 7f1c54bfb6c0 Level-0 table #379: 0 bytes OK
|
||||
2026/01/09-17:44:28.023141 7f1c54bfb6c0 Delete type=0 #377
|
||||
2026/01/09-17:44:28.043713 7f1c54bfb6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.043764 7f1c54bfb6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.157103 7f34ce7fc6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.172875 7f34ce7fc6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.172939 7f34ce7fc6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.095092 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.095126 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.102295 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.121183 7f322ffff6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.121249 7f322ffff6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.634608 7f93eb7fe6c0 Recovering log #370
|
||||
2026/01/08-08:15:08.644771 7f93eb7fe6c0 Delete type=3 #368
|
||||
2026/01/08-08:15:08.644849 7f93eb7fe6c0 Delete type=0 #370
|
||||
2026/01/08-08:28:04.770939 7f93e9ffb6c0 Level-0 table #375: started
|
||||
2026/01/08-08:28:04.770974 7f93e9ffb6c0 Level-0 table #375: 0 bytes OK
|
||||
2026/01/08-08:28:04.807757 7f93e9ffb6c0 Delete type=0 #373
|
||||
2026/01/08-08:28:04.919742 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.919789 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000332
|
||||
MANIFEST-000376
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.034759 7f93ea7fc6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.045303 7f93ea7fc6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.045387 7f93ea7fc6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.094206 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.094228 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.100330 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.112546 7f93e9ffb6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.112583 7f93e9ffb6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:07.118312 7f1c553fc6c0 Recovering log #374
|
||||
2026/01/09-17:40:07.212316 7f1c553fc6c0 Delete type=0 #374
|
||||
2026/01/09-17:40:07.212395 7f1c553fc6c0 Delete type=3 #372
|
||||
2026/01/09-17:44:28.008871 7f1c54bfb6c0 Level-0 table #379: started
|
||||
2026/01/09-17:44:28.008958 7f1c54bfb6c0 Level-0 table #379: 0 bytes OK
|
||||
2026/01/09-17:44:28.016332 7f1c54bfb6c0 Delete type=0 #377
|
||||
2026/01/09-17:44:28.016621 7f1c54bfb6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.016661 7f1c54bfb6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.100312 7f34ce7fc6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.117500 7f34ce7fc6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.117567 7f34ce7fc6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.069446 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.069505 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.075899 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.094892 7f322ffff6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.094951 7f322ffff6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.597802 7f93ea7fc6c0 Recovering log #370
|
||||
2026/01/08-08:15:08.607783 7f93ea7fc6c0 Delete type=3 #368
|
||||
2026/01/08-08:15:08.607847 7f93ea7fc6c0 Delete type=0 #370
|
||||
2026/01/08-08:28:04.733376 7f93e9ffb6c0 Level-0 table #375: started
|
||||
2026/01/08-08:28:04.733403 7f93e9ffb6c0 Level-0 table #375: 0 bytes OK
|
||||
2026/01/08-08:28:04.770489 7f93e9ffb6c0 Delete type=0 #373
|
||||
2026/01/08-08:28:04.770754 7f93e9ffb6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.770794 7f93e9ffb6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000242
|
||||
MANIFEST-000286
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.010250 7f93eaffd6c0 Recovering log #240
|
||||
2026/01/05-22:20:56.020208 7f93eaffd6c0 Delete type=3 #238
|
||||
2026/01/05-22:20:56.020270 7f93eaffd6c0 Delete type=0 #240
|
||||
2026/01/05-22:39:51.106439 7f93e9ffb6c0 Level-0 table #245: started
|
||||
2026/01/05-22:39:51.106472 7f93e9ffb6c0 Level-0 table #245: 0 bytes OK
|
||||
2026/01/05-22:39:51.112404 7f93e9ffb6c0 Delete type=0 #243
|
||||
2026/01/05-22:39:51.112570 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.112598 7f93e9ffb6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:06.948771 7f1c563fe6c0 Recovering log #284
|
||||
2026/01/09-17:40:07.030884 7f1c563fe6c0 Delete type=0 #284
|
||||
2026/01/09-17:40:07.030949 7f1c563fe6c0 Delete type=3 #282
|
||||
2026/01/09-17:44:27.988602 7f1c54bfb6c0 Level-0 table #289: started
|
||||
2026/01/09-17:44:27.988662 7f1c54bfb6c0 Level-0 table #289: 0 bytes OK
|
||||
2026/01/09-17:44:27.995503 7f1c54bfb6c0 Delete type=0 #287
|
||||
2026/01/09-17:44:28.016581 7f1c54bfb6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.016631 7f1c54bfb6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.062660 7f34cdffb6c0 Recovering log #236
|
||||
2025/11/21-21:17:11.079663 7f34cdffb6c0 Delete type=3 #234
|
||||
2025/11/21-21:17:11.079731 7f34cdffb6c0 Delete type=0 #236
|
||||
2025/11/21-21:20:34.088817 7f322ffff6c0 Level-0 table #241: started
|
||||
2025/11/21-21:20:34.088856 7f322ffff6c0 Level-0 table #241: 0 bytes OK
|
||||
2025/11/21-21:20:34.094750 7f322ffff6c0 Delete type=0 #239
|
||||
2025/11/21-21:20:34.094940 7f322ffff6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.094980 7f322ffff6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.572263 7f93ebfff6c0 Recovering log #280
|
||||
2026/01/08-08:15:08.581752 7f93ebfff6c0 Delete type=3 #278
|
||||
2026/01/08-08:15:08.581804 7f93ebfff6c0 Delete type=0 #280
|
||||
2026/01/08-08:28:04.623048 7f93e9ffb6c0 Level-0 table #285: started
|
||||
2026/01/08-08:28:04.623109 7f93e9ffb6c0 Level-0 table #285: 0 bytes OK
|
||||
2026/01/08-08:28:04.657992 7f93e9ffb6c0 Delete type=0 #283
|
||||
2026/01/08-08:28:04.770699 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.770767 7f93e9ffb6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000332
|
||||
MANIFEST-000376
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.088422 7f93eaffd6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.098507 7f93eaffd6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.098565 7f93eaffd6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.119253 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.119282 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.125789 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.137875 7f93e9ffb6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.137911 7f93e9ffb6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:07.491383 7f1c563fe6c0 Recovering log #374
|
||||
2026/01/09-17:40:07.586434 7f1c563fe6c0 Delete type=0 #374
|
||||
2026/01/09-17:40:07.586511 7f1c563fe6c0 Delete type=3 #372
|
||||
2026/01/09-17:44:28.051505 7f1c54bfb6c0 Level-0 table #379: started
|
||||
2026/01/09-17:44:28.051547 7f1c54bfb6c0 Level-0 table #379: 0 bytes OK
|
||||
2026/01/09-17:44:28.058087 7f1c54bfb6c0 Delete type=0 #377
|
||||
2026/01/09-17:44:28.072587 7f1c54bfb6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.072630 7f1c54bfb6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.175622 7f34cd7fa6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.190667 7f34cd7fa6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.190757 7f34cd7fa6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.109081 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.109106 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.114933 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.121229 7f322ffff6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.121264 7f322ffff6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.648157 7f93ea7fc6c0 Recovering log #370
|
||||
2026/01/08-08:15:08.657922 7f93ea7fc6c0 Delete type=3 #368
|
||||
2026/01/08-08:15:08.657990 7f93ea7fc6c0 Delete type=0 #370
|
||||
2026/01/08-08:28:04.807939 7f93e9ffb6c0 Level-0 table #375: started
|
||||
2026/01/08-08:28:04.807972 7f93e9ffb6c0 Level-0 table #375: 0 bytes OK
|
||||
2026/01/08-08:28:04.844126 7f93e9ffb6c0 Delete type=0 #373
|
||||
2026/01/08-08:28:04.919757 7f93e9ffb6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.919814 7f93e9ffb6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000332
|
||||
MANIFEST-000376
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/01/05-22:20:56.060705 7f93ebfff6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.070672 7f93ebfff6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.070726 7f93ebfff6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.131859 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.131886 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.137774 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.137894 7f93e9ffb6c0 Manual compaction at level-0 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.137928 7f93e9ffb6c0 Manual compaction at level-1 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:40:07.312206 7f1c56bff6c0 Recovering log #374
|
||||
2026/01/09-17:40:07.395670 7f1c56bff6c0 Delete type=0 #374
|
||||
2026/01/09-17:40:07.395743 7f1c56bff6c0 Delete type=3 #372
|
||||
2026/01/09-17:44:28.030121 7f1c54bfb6c0 Level-0 table #379: started
|
||||
2026/01/09-17:44:28.030156 7f1c54bfb6c0 Level-0 table #379: 0 bytes OK
|
||||
2026/01/09-17:44:28.036628 7f1c54bfb6c0 Delete type=0 #377
|
||||
2026/01/09-17:44:28.043749 7f1c54bfb6c0 Manual compaction at level-0 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
2026/01/09-17:44:28.043794 7f1c54bfb6c0 Manual compaction at level-1 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2025/11/21-21:17:11.139151 7f34cdffb6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.154714 7f34cdffb6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.154795 7f34cdffb6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.102428 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.102452 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.108966 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.121216 7f322ffff6c0 Manual compaction at level-0 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.121256 7f322ffff6c0 Manual compaction at level-1 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:15:08.621917 7f93ebfff6c0 Recovering log #370
|
||||
2026/01/08-08:15:08.632677 7f93ebfff6c0 Delete type=3 #368
|
||||
2026/01/08-08:15:08.632727 7f93ebfff6c0 Delete type=0 #370
|
||||
2026/01/08-08:28:04.696491 7f93e9ffb6c0 Level-0 table #375: started
|
||||
2026/01/08-08:28:04.696521 7f93e9ffb6c0 Level-0 table #375: 0 bytes OK
|
||||
2026/01/08-08:28:04.733225 7f93e9ffb6c0 Delete type=0 #373
|
||||
2026/01/08-08:28:04.770736 7f93e9ffb6c0 Manual compaction at level-0 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
2026/01/08-08:28:04.770784 7f93e9ffb6c0 Manual compaction at level-1 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user