Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c97b7a4889 | |||
| 5d13500838 | |||
| d21515e1e3 | |||
| 78ef009465 | |||
| e794611bf3 | |||
| 529a62045e | |||
| d462d22a0a | |||
| 710ee54531 | |||
| 7994aa7db4 | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/xpplus1.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/icons/xpplus1.webp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.1 KiB | 
| @@ -15,7 +15,7 @@ export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet { | |||||||
|       classes: ["fvtt-te-deum", "sheet", "actor"], |       classes: ["fvtt-te-deum", "sheet", "actor"], | ||||||
|       template: "systems/fvtt-te-deum/templates/actors/actor-sheet.hbs", |       template: "systems/fvtt-te-deum/templates/actors/actor-sheet.hbs", | ||||||
|       width: 860, |       width: 860, | ||||||
|       height:680, |       height: 680, | ||||||
|       tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }], |       tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }], | ||||||
|       dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }], |       dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }], | ||||||
|       editScore: true |       editScore: true | ||||||
| @@ -67,7 +67,6 @@ export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet { | |||||||
|     } |     } | ||||||
|     this.formData = formData; |     this.formData = formData; | ||||||
|  |  | ||||||
|     console.log("PC : ", formData, this.object); |  | ||||||
|     return formData; |     return formData; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -80,7 +79,7 @@ export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet { | |||||||
|     // Everything below here is only needed if the sheet is editable |     // Everything below here is only needed if the sheet is editable | ||||||
|     if (!this.options.editable) return; |     if (!this.options.editable) return; | ||||||
|  |  | ||||||
|     html.bind("keydown", function(e) { // Ignore Enter in actores sheet |     html.bind("keydown", function (e) { // Ignore Enter in actores sheet | ||||||
|       if (e.keyCode === 13) return false; |       if (e.keyCode === 13) return false; | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
| @@ -88,7 +87,7 @@ export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet { | |||||||
|     html.find('.item-edit').click(ev => { |     html.find('.item-edit').click(ev => { | ||||||
|       const li = $(ev.currentTarget).parents(".item-id") |       const li = $(ev.currentTarget).parents(".item-id") | ||||||
|       let itemId = li.data("item-id") |       let itemId = li.data("item-id") | ||||||
|       const item = this.actor.items.get( itemId ); |       const item = this.actor.items.get(itemId); | ||||||
|       item.sheet.render(true); |       item.sheet.render(true); | ||||||
|     }); |     }); | ||||||
|     // Delete Inventory Item |     // Delete Inventory Item | ||||||
| @@ -100,16 +99,20 @@ export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet { | |||||||
|       let dataType = $(ev.currentTarget).data("type") |       let dataType = $(ev.currentTarget).data("type") | ||||||
|       this.actor.createEmbeddedDocuments('Item', [{ name: "Nouveau " + dataType, type: dataType }], { renderSheet: true }) |       this.actor.createEmbeddedDocuments('Item', [{ name: "Nouveau " + dataType, type: dataType }], { renderSheet: true }) | ||||||
|     }) |     }) | ||||||
|  |     html.find('.blessure-add').click(ev => { | ||||||
|  |       let dataType = $(ev.currentTarget).data("type") | ||||||
|  |       this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + dataType, type: dataType, system: { typeBlessure: "estafilade", localisation: "corps", value: 0, appliquee: true, description: "" } }], { renderSheet: true }) | ||||||
|  |     }) | ||||||
|     html.find('.competence-add').click(ev => { |     html.find('.competence-add').click(ev => { | ||||||
|       let dataType = $(ev.currentTarget).data("type") |       let dataType = $(ev.currentTarget).data("type") | ||||||
|       let caracKey = $(ev.currentTarget).data("carac-key") |       let caracKey = $(ev.currentTarget).data("carac-key") | ||||||
|       this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + dataType, type: dataType, system: {caracteristique: caracKey} }], { renderSheet: true }) |       this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + dataType, type: dataType, system: { caracteristique: caracKey } }], { renderSheet: true }) | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|     html.find('.subactor-edit').click(ev => { |     html.find('.subactor-edit').click(ev => { | ||||||
|       const li = $(ev.currentTarget).parents(".item"); |       const li = $(ev.currentTarget).parents(".item"); | ||||||
|       let actorId = li.data("actor-id"); |       let actorId = li.data("actor-id"); | ||||||
|       let actor = game.actors.get( actorId ); |       let actor = game.actors.get(actorId); | ||||||
|       actor.sheet.render(true); |       actor.sheet.render(true); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
| @@ -120,12 +123,12 @@ export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet { | |||||||
|     }); |     }); | ||||||
|     html.find('.quantity-minus').click(event => { |     html.find('.quantity-minus').click(event => { | ||||||
|       const li = $(event.currentTarget).parents(".item"); |       const li = $(event.currentTarget).parents(".item"); | ||||||
|       this.actor.incDecQuantity( li.data("item-id"), -1 ); |       this.actor.incDecQuantity(li.data("item-id"), -1); | ||||||
|     } ); |     }); | ||||||
|     html.find('.quantity-plus').click(event => { |     html.find('.quantity-plus').click(event => { | ||||||
|       const li = $(event.currentTarget).parents(".item"); |       const li = $(event.currentTarget).parents(".item"); | ||||||
|       this.actor.incDecQuantity( li.data("item-id"), +1 ); |       this.actor.incDecQuantity(li.data("item-id"), +1); | ||||||
|     } ); |     }); | ||||||
|  |  | ||||||
|     html.find('.roll-competence').click((event) => { |     html.find('.roll-competence').click((event) => { | ||||||
|       let compId = $(event.currentTarget).data("comp-id") |       let compId = $(event.currentTarget).data("comp-id") | ||||||
| @@ -147,13 +150,13 @@ export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet { | |||||||
|     }); |     }); | ||||||
|     html.find('.item-equip').click(ev => { |     html.find('.item-equip').click(ev => { | ||||||
|       const li = $(ev.currentTarget).parents(".item"); |       const li = $(ev.currentTarget).parents(".item"); | ||||||
|       this.actor.equipItem( li.data("item-id") ); |       this.actor.equipItem(li.data("item-id")); | ||||||
|       this.render(true); |       this.render(true); | ||||||
|     }); |     }); | ||||||
|     html.find('.update-field').change(ev => { |     html.find('.update-field').change(ev => { | ||||||
|       const fieldName = $(ev.currentTarget).data("field-name"); |       const fieldName = $(ev.currentTarget).data("field-name"); | ||||||
|       let value = Number(ev.currentTarget.value); |       let value = Number(ev.currentTarget.value); | ||||||
|       this.actor.update( { [`${fieldName}`]: value } ); |       this.actor.update({ [`${fieldName}`]: value }); | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ export class TeDeumActor extends Actor { | |||||||
|       return actor; |       return actor; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (data.type == 'pj' ||  data.type == 'pnj') { |     if (data.type == 'pj' || data.type == 'pnj') { | ||||||
|       const skills = await TeDeumUtility.loadCompendium("fvtt-te-deum.competences") |       const skills = await TeDeumUtility.loadCompendium("fvtt-te-deum.competences") | ||||||
|       data.items = data.items || [] |       data.items = data.items || [] | ||||||
|       for (let skill of skills) { |       for (let skill of skills) { | ||||||
| @@ -65,14 +65,43 @@ export class TeDeumActor extends Actor { | |||||||
|     super._preUpdate(changed, options, user); |     super._preUpdate(changed, options, user); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|   getCompetenceScore(compName) { |   getCompetenceScore(compName) { | ||||||
|     let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase()) |     let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase()) | ||||||
|     if (competence) { |     if (competence) { | ||||||
|  |       if (competence.system.isBase) { | ||||||
|  |         return this.system.caracteristiques[competence.system.caracteristique].value | ||||||
|  |       } | ||||||
|       return competence.system.score |       return competence.system.score | ||||||
|     } |     } | ||||||
|     return 0 |     return 0 | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   getMeilleureCompetenceMainGauche(comp) { | ||||||
|  |     let compScore = this.getCompetenceScore(comp.name) | ||||||
|  |     let mainGaucheScore = this.getCompetenceScore("main gauche") | ||||||
|  |     if (mainGaucheScore < compScore) { | ||||||
|  |       ui.notifications.info(`${this.name} : Utilisation de la compétence Main Gauche au lieu de ${comp.name}`) | ||||||
|  |       let mainGaucheComp = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "main gauche") | ||||||
|  |       if (!mainGaucheComp) { | ||||||
|  |         // Create a fake competence object | ||||||
|  |         mainGaucheComp = foundry.utils.duplicate(comp) | ||||||
|  |         mainGaucheComp.name = "Main Gauche" | ||||||
|  |         mainGaucheComp.system.isBase = false | ||||||
|  |         mainGaucheComp.system.score = 0 | ||||||
|  |         mainGaucheComp.system.caracteristique = "adresse" | ||||||
|  |         mainGaucheComp.system.description = "Compétence Main Gauche (automatique)" | ||||||
|  |         mainGaucheComp.system.isMainGauche = true | ||||||
|  |         return mainGaucheComp | ||||||
|  |       } else { | ||||||
|  |         return mainGaucheComp | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       return comp | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   _onUpdate(changed, options, userId) { |   _onUpdate(changed, options, userId) { | ||||||
|     let updates = [] |     let updates = [] | ||||||
| @@ -112,12 +141,6 @@ export class TeDeumActor extends Actor { | |||||||
|       updates.push({ _id: initiative.id, "system.score": Number(newScore) }) |       updates.push({ _id: initiative.id, "system.score": Number(newScore) }) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     let actionsTour = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "actions/tour") |  | ||||||
|     newScore = this.getCommonBaseValue(this.system.caracteristiques.adresse.value) |  | ||||||
|     if (actionsTour && actionsTour?.system.score != newScore) { |  | ||||||
|       updates.push({ _id: actionsTour.id, "system.score": Number(newScore) }) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     let effort = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "effort") |     let effort = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "effort") | ||||||
|     newScore = this.getCommonBaseValue(this.system.caracteristiques.puissance.value) |     newScore = this.getCommonBaseValue(this.system.caracteristiques.puissance.value) | ||||||
|     if (effort && effort?.system.score != newScore) { |     if (effort && effort?.system.score != newScore) { | ||||||
| @@ -147,7 +170,7 @@ export class TeDeumActor extends Actor { | |||||||
|   getCommonBaseValue(value) { |   getCommonBaseValue(value) { | ||||||
|     return game.system.tedeum.config.COMMON_VALUE[value]?.value || 0 |     return game.system.tedeum.config.COMMON_VALUE[value]?.value || 0 | ||||||
|   } |   } | ||||||
|   getInitiative() { |   getInitiativeValue() { | ||||||
|     return game.system.tedeum.config.COMMON_VALUE[this.system.caracteristiques.adresse.value]?.value || 0 |     return game.system.tedeum.config.COMMON_VALUE[this.system.caracteristiques.adresse.value]?.value || 0 | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -155,6 +178,24 @@ export class TeDeumActor extends Actor { | |||||||
|     return game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value] |     return game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value] | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|  |   getAttaqueBonusDegats(rollData = undefined) { | ||||||
|  |     let base = game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value].value | ||||||
|  |     let additionalBonus = 0 | ||||||
|  |     if (rollData) { | ||||||
|  |       // Spécificité armes naturelle avec gantelet | ||||||
|  |       if (rollData?.arme?.system.specificites?.poing?.hasSpec && this.items.find(item => item.type == "armure" && item.name.toLowerCase() == "gantelet" && item.system.equipe)) { | ||||||
|  |         additionalBonus += 1 | ||||||
|  |         rollData.gantelet = true | ||||||
|  |       } | ||||||
|  |       if (rollData.isChargeAPied) { | ||||||
|  |         additionalBonus += this.getCompetenceScore("course") | ||||||
|  |       } else if (rollData.isChargeACheval) { | ||||||
|  |         additionalBonus += this.getCompetenceScore("equitation") | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return base + additionalBonus | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|   getNbArmures() { |   getNbArmures() { | ||||||
|     return game.system.tedeum.config.MAX_ARMURES_LOURDES[this.system.caracteristiques.puissance.value] |     return game.system.tedeum.config.MAX_ARMURES_LOURDES[this.system.caracteristiques.puissance.value] | ||||||
|   } |   } | ||||||
| @@ -266,41 +307,105 @@ export class TeDeumActor extends Actor { | |||||||
|       modTotal += blessDef.modifier |       modTotal += blessDef.modifier | ||||||
|     } |     } | ||||||
|     // Si le nombre de blessures est supérieur au score d'endurance, alors malus supplémentaire |     // Si le nombre de blessures est supérieur au score d'endurance, alors malus supplémentaire | ||||||
|     let endurance = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "endurance") |     let enduranceScore = this.getCompetenceScore("endurance") | ||||||
|     if (blessures.length > endurance.system.score) { |     if (blessures.length > enduranceScore) { | ||||||
|       modTotal += -1 |       modTotal += -1 | ||||||
|     } |     } | ||||||
|     return modTotal |     return modTotal | ||||||
|   } |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   async appliquerBlessure(blessureId, locId, comment = "") { | ||||||
|  |     let blessure = game.system.tedeum.config.blessures[blessureId] | ||||||
|  |     if (!blessure) { | ||||||
|  |       ui.notifications.warn("Type de blessure inconnu : " + blessureId) | ||||||
|  |       console.error("Type de blessure inconnu : " + blessureId) | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     // Create a new blessure object | ||||||
|  |     let blessureObj = { | ||||||
|  |       name: blessure.label, | ||||||
|  |       type: "blessure", | ||||||
|  |       system: { | ||||||
|  |         typeBlessure: blessureId, | ||||||
|  |         localisation: locId || "maindroite", | ||||||
|  |         value: blessure.value, | ||||||
|  |         appliquee: true, | ||||||
|  |         description: comment, | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     this.createEmbeddedDocuments('Item', [blessureObj]); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   getArmorDegatsModifier(rollData, combat) { | ||||||
|  |     let loc = combat[rollData.loc.id] | ||||||
|  |     // Sans armure | ||||||
|  |     if (loc.armures.length == 0) { | ||||||
|  |       return rollData.arme.system.degatsArmure.sansarmure | ||||||
|  |     } | ||||||
|  |     // Avec armure de cuir | ||||||
|  |     if (loc.armures.find(a => a.system.typeArmure == "cuir")) { | ||||||
|  |       return rollData.arme.system.degatsArmure.cuir | ||||||
|  |     } | ||||||
|  |     // Avec armure de maille | ||||||
|  |     if (loc.armures.find(a => a.system.typeArmure == "maille")) { | ||||||
|  |       return rollData.arme.system.degatsArmure.mailles | ||||||
|  |     } | ||||||
|  |     // Avec armure de plate | ||||||
|  |     if (loc.armures.find(a => a.system.typeArmure == "plate")) { | ||||||
|  |       return rollData.arme.system.degatsArmure.plates | ||||||
|  |     } | ||||||
|  |     return 0 | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async appliquerDegats(rollData) { |   async appliquerDegats(rollData) { | ||||||
|     let combat = this.prepareCombat() |     let combat = this.prepareCombat() | ||||||
|     rollData.defenderName = this.name |     rollData.defenderName = this.name | ||||||
|     let touche = combat[rollData.loc.id].touche |     let touche = combat[rollData.loc.id].touche | ||||||
|  |     let armorDegatModifier = this.getArmorDegatsModifier(rollData, combat) | ||||||
|  |     rollData.degats += armorDegatModifier | ||||||
|  |     rollData.armorDegatModifier = armorDegatModifier | ||||||
|  |  | ||||||
|  |     let blessureId = "indemne" | ||||||
|     if (rollData.degats > 0 && rollData.degats > touche) { |     if (rollData.degats > 0 && rollData.degats > touche) { | ||||||
|       let diff = rollData.degats - touche |       let diff = rollData.degats - touche | ||||||
|       for (let bId in game.system.tedeum.config.blessures) { |       for (let bId in game.system.tedeum.config.blessures) { | ||||||
|         let blessure = game.system.tedeum.config.blessures[bId] |         let blessure = game.system.tedeum.config.blessures[bId] | ||||||
|         if (diff >= blessure.degatsMin && diff <= blessure.degatsMax) { |         if (diff >= blessure.degatsMin && diff <= blessure.degatsMax) { | ||||||
|           // Create a new blessure object |           if (rollData.isReussiteCritique) { | ||||||
|           let blessureObj = { |             bId = game.system.tedeum.config.blessuresOrder[blessure.value + 1] | ||||||
|             name: blessure.label, |  | ||||||
|             type: "blessure", |  | ||||||
|             system: { |  | ||||||
|               typeBlessure: bId, |  | ||||||
|               localisation: rollData.loc.id, |  | ||||||
|               appliquee: true, |  | ||||||
|               description: "Blessure infligée par un coup de " + rollData.arme.name + " de " + rollData.alias, |  | ||||||
|             } |  | ||||||
|           } |           } | ||||||
|           rollData.blessure = blessureObj |           blessureId = bId | ||||||
|           this.createEmbeddedDocuments('Item', [blessureObj]); |           break | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     if (rollData.isReussiteCritique && blessureId == "indemne") { // Critical success without degats => lightest blessure | ||||||
|  |       blessureId = "estafilade" | ||||||
|  |     } | ||||||
|  |     console.log("Appliquer dégats", rollData, combat, blessureId) | ||||||
|  |     if (blessureId != "indemne") { | ||||||
|  |       let blessure = game.system.tedeum.config.blessures[blessureId] | ||||||
|  |       // Create a new blessure object | ||||||
|  |       let blessureObj = { | ||||||
|  |         name: blessure.label, | ||||||
|  |         type: "blessure", | ||||||
|  |         system: { | ||||||
|  |           typeBlessure: blessureId, | ||||||
|  |           localisation: rollData.loc.id, | ||||||
|  |           value: blessure.value, | ||||||
|  |           appliquee: true, | ||||||
|  |           description: "Blessure infligée par un coup de " + rollData.arme.name + " de " + rollData.alias, | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       rollData.blessure = blessureObj | ||||||
|  |       rollData.touche = touche | ||||||
|  |       this.createEmbeddedDocuments('Item', [blessureObj]); | ||||||
|  |     } | ||||||
|     // Display the relevant chat message |     // Display the relevant chat message | ||||||
|     let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, { |     let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, { | ||||||
|       content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-blessure-result.hbs`, rollData) |       content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-blessure-result.hbs`, rollData) | ||||||
|     }) |     }) | ||||||
|     await msg.setFlag("world", "te-deum-rolldata", rollData) |     await msg.setFlag("world", "te-deum-rolldata", rollData) | ||||||
|   } |   } | ||||||
| @@ -382,6 +487,7 @@ export class TeDeumActor extends Actor { | |||||||
|     xp = Math.max(xp + value, 0) |     xp = Math.max(xp + value, 0) | ||||||
|     await this.update({ [`system.caracteristiques.${key}.experience`]: xp }) |     await this.update({ [`system.caracteristiques.${key}.experience`]: xp }) | ||||||
|     this.sheet?.render(true) |     this.sheet?.render(true) | ||||||
|  |     ui.notifications.info(`+${value} XP en ${game.system.tedeum.config.caracteristiques[key].label}`) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -454,7 +560,7 @@ export class TeDeumActor extends Actor { | |||||||
|               flag = armure.system.superposableCuir |               flag = armure.system.superposableCuir | ||||||
|             } |             } | ||||||
|             if (item.system.typeArmure == "maille") { |             if (item.system.typeArmure == "maille") { | ||||||
|               flag =  armure.system.superposableMaille |               flag = armure.system.superposableMaille | ||||||
|             } |             } | ||||||
|             if (item.system.typeArmure == "plate") { |             if (item.system.typeArmure == "plate") { | ||||||
|               flag = armure.system.superposablePlate |               flag = armure.system.superposablePlate | ||||||
| @@ -529,12 +635,16 @@ export class TeDeumActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   getInitiativeScore() { |   getInitiativeScore() { | ||||||
|     let initiative = this.items.find(it => it.type == "competence" && it.name.toLowerCase() == "initiative") |     let initiative = this.getInitiativeValue() | ||||||
|     if (initiative) { |     // Vérifie les armes avec bonus d'initiative | ||||||
|       return initiative.system.score |     let armes = this.getArmes() | ||||||
|  |     for (let arme of armes) { | ||||||
|  |       if (arme.system.equipe && Number(arme.system.initiativeBonus) && Number(arme.system.initiativeBonus) != 0) { | ||||||
|  |         ui.notifications.info("L'arme " + arme.name + " vous confère un bonus d'initiative de " + arme.system.initiativeBonus) | ||||||
|  |         initiative += arme.system.initiativeBonus | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|     ui.notifications.warn("Impossible de trouver la compétence Initiative pour l'acteur " + this.name) |     return initiative | ||||||
|     return -1; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -604,12 +714,12 @@ export class TeDeumActor extends Actor { | |||||||
|     let weapon = this.items.get(armeId) |     let weapon = this.items.get(armeId) | ||||||
|     if (weapon) { |     if (weapon) { | ||||||
|       let bDegats = 0 |       let bDegats = 0 | ||||||
|       if ( weapon.system.typeArme == "melee" ) { |       if (weapon.system.typeArme == "melee") { | ||||||
|         bDegats = this.getBonusDegats() |         bDegats = this.getBonusDegats() | ||||||
|       } |       } | ||||||
|       let formula = weapon.system.degats + "+" + bDegats.value |       let formula = weapon.system.degats + "+" + bDegats.value | ||||||
|       let degatsRoll = await new Roll(formula).roll() |       let degatsRoll = await new Roll(formula).roll() | ||||||
|       await TeDeumUtility.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode") ) |       await TeDeumUtility.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode")) | ||||||
|       let rollData = this.getCommonRollData() |       let rollData = this.getCommonRollData() | ||||||
|       rollData.mode = "degats" |       rollData.mode = "degats" | ||||||
|       rollData.formula = formula |       rollData.formula = formula | ||||||
| @@ -654,9 +764,14 @@ export class TeDeumActor extends Actor { | |||||||
|       let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase()) |       let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase()) | ||||||
|       if (competence) { |       if (competence) { | ||||||
|         rollData.competence = competence |         rollData.competence = competence | ||||||
|  |         rollData.compScore = rollData.competence.system.isBase ? this.system.caracteristiques[rollData.competence.system.caracteristique].value : rollData.competence.system.score | ||||||
|         let c = foundry.utils.duplicate(this.system.caracteristiques[competence.system.caracteristique]) |         let c = foundry.utils.duplicate(this.system.caracteristiques[competence.system.caracteristique]) | ||||||
|         this.updateCarac(c, competence.system.caracteristique) |         this.updateCarac(c, competence.system.caracteristique) | ||||||
|         rollData.carac = c |         rollData.carac = c | ||||||
|  |         rollData.allongeLabel = game.system.tedeum.config.armeAllonges[weapon.system.allonge].label | ||||||
|  |         rollData.allongeId = "courte" | ||||||
|  |         rollData.allonges = foundry.utils.duplicate(game.system.tedeum.config.allonges[weapon.system.allonge]) | ||||||
|  |  | ||||||
|       } else { |       } else { | ||||||
|         ui.notifications.warn("Impossible de trouver la compétence " + compName) |         ui.notifications.warn("Impossible de trouver la compétence " + compName) | ||||||
|         return |         return | ||||||
|   | |||||||
| @@ -4,18 +4,42 @@ import { TeDeumUtility } from "../common/tedeum-utility.js"; | |||||||
| export class TeDeumCombat extends Combat { | export class TeDeumCombat extends Combat { | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async rollInitiative(ids, formula = undefined, messageOptions = {} ) { |   async rollInitiative(ids, formula = undefined, messageOptions = {}) { | ||||||
|     //console.log("Roll INIT !") |     //console.log("Roll INIT !") | ||||||
|     ids = typeof ids === "string" ? [ids] : ids; |     ids = typeof ids === "string" ? [ids] : ids; | ||||||
|     for (let cId of ids) { |     for (let cId of ids) { | ||||||
|       const c = this.combatants.get(cId); |       const c = this.combatants.get(cId); | ||||||
|       let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, cId ) : -1; |       let initBonus = c.actor ? c.actor.getInitiativeScore(this.id, cId) : -1; | ||||||
|       await this.updateEmbeddedDocuments("Combatant", [ { _id: cId, initiative: initBonus } ]); |       console.log("Init Bonus : ", c.name, initBonus) | ||||||
|  |       await this.updateEmbeddedDocuments("Combatant", [{ _id: cId, initiative: initBonus }]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return this; |     return this; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   async modifyAction(combatantId, delta, isMainGauche = false) { | ||||||
|  |     let combatant = this.combatants.get(combatantId) | ||||||
|  |     if (!combatant) return; | ||||||
|  |     let ca = combatant.getFlag("world", "available-actions") | ||||||
|  |     if (!ca) { | ||||||
|  |       ca = { nbActions: 1, nbActionsMainGauche: 0 } | ||||||
|  |     } | ||||||
|  |     if (isMainGauche) { | ||||||
|  |       ca.nbActionsMainGauche += delta | ||||||
|  |     } else { | ||||||
|  |       ca.nbActions += delta | ||||||
|  |     } | ||||||
|  |     if (ca.nbActionsMainGauche < 0) ca.nbActionsMainGauche = 0 | ||||||
|  |     if (ca.nbActions < 0) ca.nbActions = 0 | ||||||
|  |     console.log("Modify Action : ", combatant.name, ca) | ||||||
|  |     if (game.user.isGM) { | ||||||
|  |       await TeDeumUtility.updateCombatantActions(combatant, ca) | ||||||
|  |     } else { | ||||||
|  |       game.socket.emit("system.fvtt-te-deum", { msg: "msg_modify_combat_action", data: { combatantId: combatantId, ca: ca } }) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async checkTurnPosition() { |   static async checkTurnPosition() { | ||||||
|     while (game.combat.turn > 0) { |     while (game.combat.turn > 0) { | ||||||
|   | |||||||
| @@ -4,30 +4,46 @@ export const SYSTEM_ID = "fvtt-te-deum"; | |||||||
| export const TEDEUM_CONFIG = { | export const TEDEUM_CONFIG = { | ||||||
|  |  | ||||||
|   BONUS_DEGATS: [{}, { label: "1d4", value: -2 }, { label: "1d6", value: -1 }, { label: "1d8", value: 0 }, |   BONUS_DEGATS: [{}, { label: "1d4", value: -2 }, { label: "1d6", value: -1 }, { label: "1d8", value: 0 }, | ||||||
|     { label: "1d10", value: 1 }, { label: "1d12", value: 2 }, { label: "1d20", value: 3 }], |   { label: "1d10", value: 1 }, { label: "1d12", value: 2 }, { label: "1d20", value: 3 }], | ||||||
|   MAX_ARMURES_LOURDES: [{}, { value: 1 }, { value: 3 }, { value: 5 }, |   MAX_ARMURES_LOURDES: [{}, { value: 1 }, { value: 3 }, { value: 5 }, | ||||||
|     { value: 7 }, { value: 9 }, { value: 11 }], |   { value: 7 }, { value: 9 }, { value: 11 }], | ||||||
|   ACTIONS_PAR_TOUR: [{}, { value: 1 }, { value: 2 }, { value: 2 }, |   ACTIONS_PAR_TOUR: [{}, { value: 1 }, { value: 2 }, { value: 2 }, | ||||||
|     { value: 3 }, { value: 3 }, { value: 4 }], |   { value: 3 }, { value: 3 }, { value: 4 }], | ||||||
|   COMMON_VALUE: [{}, { value: 1 }, { value: 2 }, { value: 3 }, |   COMMON_VALUE: [{}, { value: 1 }, { value: 2 }, { value: 3 }, | ||||||
|     { value: 4 }, { value: 5 }, { value: 6 }], |   { value: 4 }, { value: 5 }, { value: 6 }], | ||||||
|   COUT_XP: [{}, { value: 10 }, { value: 10 }, { value: 10 }, |   COUT_XP: [{}, { value: 10 }, { value: 10 }, { value: 10 }, | ||||||
|     { value: 10 }, { value: 30 }, { value: 50 }], |   { value: 10 }, { value: 30 }, { value: 50 }], | ||||||
|  |  | ||||||
|   LOCALISATION: { |   LOCALISATION: { | ||||||
|     "pieddroit": { label: "Pied Droit", value: 1, locMod: 0, id: "pieddroit", nbArmure: 1, score: { min: 1, max: 1 }, coord: { top: 500, left: 0 } }, |     "pieddroit": { label: "Pied Droit", value: 1, locMod: 0, id: "pieddroit", categorie: "pied", nbArmure: 1, score: { min: 1, max: 1 }, coord: { top: 500, left: 0 } }, | ||||||
|     "jambedroite": { label: "Jambe Droite", value: 1, locMod: -1, id: "jambedroite", nbArmure: 1, score: { min: 3, max: 4 }, coord: { top: 400, left: 100 } }, |     "jambedroite": { label: "Jambe Droite", value: 1, locMod: -1, id: "jambedroite", categorie: "jambe", nbArmure: 1, score: { min: 3, max: 4 }, coord: { top: 400, left: 100 } }, | ||||||
|     "jambegauche": { label: "Jambe Gauche", value: 1, locMod: -1, id: "jambegauche", nbArmure: 1, score: { min: 5, max: 6 }, coord: { top: 400, left: 300 } }, |     "jambegauche": { label: "Jambe Gauche", value: 1, locMod: -1, id: "jambegauche", categorie: "jambe", nbArmure: 1, score: { min: 5, max: 6 }, coord: { top: 400, left: 300 } }, | ||||||
|     "piedgauche": { label: "Pied Gauche", value: 1, locMod: 0, id: "piedgauche", nbArmure: 1, score: { min: 2, max: 2 }, coord: { top: 500, left: 400 } }, |     "piedgauche": { label: "Pied Gauche", value: 1, locMod: 0, id: "piedgauche", categorie: "pied", nbArmure: 1, score: { min: 2, max: 2 }, coord: { top: 500, left: 400 } }, | ||||||
|     "maindroite": { label: "Main Droite", value: 1, locMod: 0, id: "maindroite", nbArmure: 1, score: { min: 7, max: 7 }, coord: { top: 0, left: 0 } }, |     "maindroite": { label: "Main Droite", value: 1, locMod: 0, id: "maindroite", categorie: "main", nbArmure: 1, score: { min: 7, max: 7 }, coord: { top: 0, left: 0 } }, | ||||||
|     "maingauche": { label: "Main Gauche", value: 1, locMod: 0, id: "maingauche", nbArmure: 1, score: { min: 8, max: 8 }, coord: { top: 0, left: 400 } }, |     "maingauche": { label: "Main Gauche", value: 1, locMod: 0, id: "maingauche", categorie: "main", nbArmure: 1, score: { min: 8, max: 8 }, coord: { top: 0, left: 400 } }, | ||||||
|     "brasdroit": { label: "Bras Droit", value: 1, locMod: -1, id: "brasdroit", nbArmure: 2, score: { min: 9, max: 10 }, coord: { top: 200, left: 0 } }, |     "brasdroit": { label: "Bras Droit", value: 1, locMod: -1, id: "brasdroit", categorie: "bras", nbArmure: 2, score: { min: 9, max: 10 }, coord: { top: 200, left: 0 } }, | ||||||
|     "brasgauche": { label: "Bras Gauche", value: 1, locMod: -1, id: "brasgauche", nbArmure: 2, score: { min: 11, max: 12 }, coord: { top: 200, left: 400 } }, |     "brasgauche": { label: "Bras Gauche", value: 1, locMod: -1, id: "brasgauche", categorie: "bras", nbArmure: 2, score: { min: 11, max: 12 }, coord: { top: 200, left: 400 } }, | ||||||
|     "corps": { label: "Corps", value: 1, id: "corps", locMod: -2, nbArmure: 2, score: { min: 13, max: 17 }, coord: { top: 200, left: 200 } }, |     "corps": { label: "Corps", value: 1, id: "corps", categorie: "corps", locMod: -2, nbArmure: 2, score: { min: 13, max: 17 }, coord: { top: 200, left: 200 } }, | ||||||
|     "tete": { label: "Tête", value: 1, id: "tete", locMod: -2, nbArmure: 2, score: { min: 18, max: 20 }, coord: { top: 0, left: 200 } }, |     "tete": { label: "Tête", value: 1, id: "tete", categorie: "tete", locMod: -2, nbArmure: 2, score: { min: 18, max: 20 }, coord: { top: 0, left: 200 } }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   ATTAQUE_CIBLEES: { | ||||||
|  |     "aucune": { label: "Aucune", id: "aucune", locMod: 0, description: "Attaque non ciblée" }, | ||||||
|  |     "pieddroit": { label: "Pied Droit", id: "pieddroit", locMod: 0, description: "Attaque ciblée sur le pied droit" }, | ||||||
|  |     "jambedroite": { label: "Jambe Droite", id: "jambedroite", locMod: -1, description: "Attaque ciblée sur la jambe droite" }, | ||||||
|  |     "jambegauche": { label: "Jambe Gauche", id: "jambegauche", locMod: -1, description: "Attaque ciblée sur la jambe gauche" }, | ||||||
|  |     "piedgauche": { label: "Pied Gauche", id: "piedgauche", locMod: 0, description: "Attaque ciblée sur le pied gauche" }, | ||||||
|  |     "maindroite": { label: "Main Droite", id: "maindroite", locMod: 0, description: "Attaque ciblée sur la main droite" }, | ||||||
|  |     "maingauche": { label: "Main Gauche", id: "maingauche", locMod: 0, description: "Attaque ciblée sur la main gauche" }, | ||||||
|  |     "brasdroit": { label: "Bras Droit", id: "brasdroit", locMod: -1, description: "Attaque ciblée sur le bras droit" }, | ||||||
|  |     "brasgauche": { label: "Bras Gauche", id: "brasgauche", locMod: -1, description: "Attaque ciblée sur le bras gauche" }, | ||||||
|  |     "corps": { label: "Corps", id: "corps", locMod: -2, description: "Attaque ciblée sur le corps" }, | ||||||
|  |     "tete": { label: "Tête", id: "tete", locMod: -2, description: "Attaque ciblée sur la tête" }, | ||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   ARME_SPECIFICITE: { |   ARME_SPECIFICITE: { | ||||||
|  |     "poing": { label: "Poings", id: "poing", melee: true, tir: false }, | ||||||
|  |     "pied": { label: "Pieds", id: "pied", melee: true, tir: false }, | ||||||
|     "encombrante": { label: "Encombrante", id: "encombrante", melee: true, tir: true }, |     "encombrante": { label: "Encombrante", id: "encombrante", melee: true, tir: true }, | ||||||
|     "maintiendistance": { label: "Maintien à distance", id: "maintiendistance", melee: true, tir: false }, |     "maintiendistance": { label: "Maintien à distance", id: "maintiendistance", melee: true, tir: false }, | ||||||
|     "coupassomant": { label: "Coup assomant", id: "coupassomant", melee: true, tir: false }, |     "coupassomant": { label: "Coup assomant", id: "coupassomant", melee: true, tir: false }, | ||||||
| @@ -43,11 +59,11 @@ export const TEDEUM_CONFIG = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   ARME_PORTEES: { |   ARME_PORTEES: { | ||||||
|     "brulepourpoint": { label: "Brûle-pourpoint", difficulty: "facile", id: "brulepourpoint" }, |     "brulepourpoint": { label: "Brûle-pourpoint (5)", difficulty: "facile", id: "brulepourpoint" }, | ||||||
|     "courte": { label: "Courte", difficulty: "pardefaut", id: "courte" }, |     "courte": { label: "Courte (7)", difficulty: "pardefaut", id: "courte" }, | ||||||
|     "moyenne": { label: "Moyenne", difficulty: "difficile", id: "moyenne" }, |     "moyenne": { label: "Moyenne (11)", difficulty: "difficile", id: "moyenne" }, | ||||||
|     "longue": { label: "Longue", difficulty: "perilleux", id: "longue" }, |     "longue": { label: "Longue (13)", difficulty: "perilleux", id: "longue" }, | ||||||
|     "extreme": { label: "Extrême", difficulty: "desespere", id: "extreme" }, |     "extreme": { label: "Extrême (15)", difficulty: "desespere", id: "extreme" }, | ||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   genre: { |   genre: { | ||||||
| @@ -94,7 +110,7 @@ export const TEDEUM_CONFIG = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   caracteristiques: { |   caracteristiques: { | ||||||
|     savoir: { id: "savoir", value: "savoir", label: "Savoir", description:"Cette caractéristique correspond à la capacité d'abstraction intellectuelle ainsi qu'à la culture générale du personnage. Elle permet d'évaluer la compétence de base Mémoriser." }, |     savoir: { id: "savoir", value: "savoir", label: "Savoir", description: "Cette caractéristique correspond à la capacité d'abstraction intellectuelle ainsi qu'à la culture générale du personnage. Elle permet d'évaluer la compétence de base Mémoriser." }, | ||||||
|     sensibilite: { id: "sensibilite", value: "sensibilite", label: "Sensibilité", description: "Cette caractéristique correspond à l'ouverture du personnage sur le monde. Elle englobe l'altruisme, la spiritualité et la créativité du personnage. Elle permet d'évaluer la compétence de base Perception." }, |     sensibilite: { id: "sensibilite", value: "sensibilite", label: "Sensibilité", description: "Cette caractéristique correspond à l'ouverture du personnage sur le monde. Elle englobe l'altruisme, la spiritualité et la créativité du personnage. Elle permet d'évaluer la compétence de base Perception." }, | ||||||
|     entregent: { id: "entregent", value: "entregent", label: "Entregent", description: "Cette caractéristique correspond à l'ensemble des prédispositions sociales du personnage. Elle englobe le charisme et le respect des usages. Elle permet d'évaluer la compétence de base Charme." }, |     entregent: { id: "entregent", value: "entregent", label: "Entregent", description: "Cette caractéristique correspond à l'ensemble des prédispositions sociales du personnage. Elle englobe le charisme et le respect des usages. Elle permet d'évaluer la compétence de base Charme." }, | ||||||
|     complexion: { id: "complexion", value: "complexion", label: "Complexion", description: "Cette caractéristique permet d'évaluer la santé et la résistance physique du per- sonnage. Elle permet de calculer la com- pétence de base Endurance, capitale dans la résolution des blessures, la résistance à la douleur, au poison et aux maladies." }, |     complexion: { id: "complexion", value: "complexion", label: "Complexion", description: "Cette caractéristique permet d'évaluer la santé et la résistance physique du per- sonnage. Elle permet de calculer la com- pétence de base Endurance, capitale dans la résolution des blessures, la résistance à la douleur, au poison et aux maladies." }, | ||||||
| @@ -102,10 +118,10 @@ export const TEDEUM_CONFIG = { | |||||||
|     adresse: { id: "adresse", value: "adresse", label: "Adresse", description: "Cette caractéristique correspond à la rapidité et la dextérité du personnage. Elle livre le nombre d'actions qu'un personnage peut accomplir en un tour de combat et permet d'évaluer les compétences de base Initiative & Course." }, |     adresse: { id: "adresse", value: "adresse", label: "Adresse", description: "Cette caractéristique correspond à la rapidité et la dextérité du personnage. Elle livre le nombre d'actions qu'un personnage peut accomplir en un tour de combat et permet d'évaluer les compétences de base Initiative & Course." }, | ||||||
|   }, |   }, | ||||||
|   allonges: { |   allonges: { | ||||||
|     courte: { courte: { malus: 0 }, moyenne: { malus: -1 }, longue: { malus: -2 }, treslongue: { malus: 0, esquive: 2 } }, |     courte: { courte: { label: "Courte (0)", malus: 0 }, moyenne: { label: "Moyenne (-1)", malus: -1 }, longue: { label: "Longue (-2)", malus: -2 }, treslongue: { label: "Très longue (0, 2 Esquives)", malus: 0, esquive: 2 } }, | ||||||
|     moyenne: { courte: { malus: 0 }, moyenne: { malus: 0 }, longue: { malus: -1 }, treslongue: { malus: 0, esquive: 2 } }, |     moyenne: { courte: { label: "Courte (0)", malus: 0 }, moyenne: { label: "Moyenne (0)", malus: 0 }, longue: { label: "Longue (-1)", malus: -1 }, treslongue: { label: "Très longue (0, 2 Esquives)", malus: 0, esquive: 2 } }, | ||||||
|     longue: { courte: { malus: -2 }, moyenne: { malus: -1 }, longue: { malus: 0 }, treslongue: { malus: -1, esquive: 1 } }, |     longue: { courte: { label: "Courte (-2)", malus: -2 }, moyenne: { label: "Moyenne (-1)", malus: -1 }, longue: { label: "Longue (0)", malus: 0 }, treslongue: { label: "Très longue (-1, 2 Esquives)", malus: -1, esquive: 1 } }, | ||||||
|     treslongue: { courte: { malus: 0, esquive: 2 }, moyenne: { malus: 0, esquive: 2 }, longue: { malus: 0, esquive: 1 }, treslongue: { malus: 0 } }, |     treslongue: { courte: { label: "Courte (0, 2 Esquives)", malus: 0, esquive: 2 }, moyenne: { label: "Moyenne (0, 2 Esquives)", malus: 0, esquive: 2 }, longue: { label: "Longue (0, 1 Esquive)", malus: 0, esquive: 1 }, treslongue: { label: "Très longue (0)", malus: 0 } }, | ||||||
|   }, |   }, | ||||||
|   providence: [ |   providence: [ | ||||||
|     { labelM: "Brebis égarée", labelF: "Brebis égarée", value: 0, diceValue: "0" }, |     { labelM: "Brebis égarée", labelF: "Brebis égarée", value: 0, diceValue: "0" }, | ||||||
| @@ -152,13 +168,13 @@ export const TEDEUM_CONFIG = { | |||||||
|   }, |   }, | ||||||
|   difficulte: { |   difficulte: { | ||||||
|     aucune: { label: "Aucune", key: "aucune", value: 0 }, |     aucune: { label: "Aucune", key: "aucune", value: 0 }, | ||||||
|     routine: { label: "Routine", key: "routine", value: 3 }, |     routine: { label: "Routine (3)", key: "routine", value: 3 }, | ||||||
|     facile: { label: "Facile", key: "facile", value: 5 }, |     facile: { label: "Facile (5)", key: "facile", value: 5 }, | ||||||
|     pardefaut: { label: "Par Défaut", key: "pardefaut", value: 7 }, |     pardefaut: { label: "Par Défaut (7)", key: "pardefaut", value: 7 }, | ||||||
|     malaise: { label: "Malaisé", key: "malaise", value: 9 }, |     malaise: { label: "Malaisé (9)", key: "malaise", value: 9 }, | ||||||
|     difficile: { label: "Difficile", key: "difficile", value: 11 }, |     difficile: { label: "Difficile (11)", key: "difficile", value: 11 }, | ||||||
|     perilleux: { label: "Perilleux", key: "perilleux", value: 13 }, |     perilleux: { label: "Perilleux (13)", key: "perilleux", value: 13 }, | ||||||
|     desespere: { label: "Désespéré", key: "desespere", value: 15 } |     desespere: { label: "Désespéré (15)", key: "desespere", value: 15 } | ||||||
|   }, |   }, | ||||||
|   monnaie: { |   monnaie: { | ||||||
|     denier: { label: "Deniers", id: "denier", value: 1 }, |     denier: { label: "Deniers", id: "denier", value: 1 }, | ||||||
| @@ -195,13 +211,14 @@ export const TEDEUM_CONFIG = { | |||||||
|     { value: "1", label: "+1 niveau" }, |     { value: "1", label: "+1 niveau" }, | ||||||
|     { value: "2", label: "+2 niveaux" } |     { value: "2", label: "+2 niveaux" } | ||||||
|   ], |   ], | ||||||
|  |   blessuresOrder: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet", "tuenet", "tuenet", "tuenet", "tuenet"], | ||||||
|   blessures: { |   blessures: { | ||||||
|     indemne: { value: 0, label: "Indemne", key: "indemne", degatsMax: -1, count: 0, modifier: 0 }, |     indemne: { value: 0, label: "Indemne", key: "indemne", degatsMax: -1, count: 0, modifier: 0 }, | ||||||
|     estafilade: { value: 1, label: "Estafilade", key: "estafilade", degatsMin: 0, degatsMax: 2, count: 1, modifier: 0 }, |     estafilade: { value: 1, label: "Estafilade", key: "estafilade", degatsMin: 0, degatsMax: 2, count: 1, modifier: 0 }, | ||||||
|     plaie: { value: 2, label: "Plaie", key: "plaie", degatsMin: 3, degatsMax: 4, count: 1, modifier: -1 }, |     plaie: { value: 2, label: "Plaie", key: "plaie", degatsMin: 3, degatsMax: 4, count: 1, modifier: -1 }, | ||||||
|     plaiebeante: { value: 3, label: "Plaie béante", key: "plaiebeante", degatsMin: 5, degatsMax: 6, count: 1, modifier: -2 }, |     plaiebeante: { value: 3, label: "Plaie béante", key: "plaiebeante", degatsMin: 5, degatsMax: 6, count: 1, modifier: -2 }, | ||||||
|     plaieatroce: { value: 4, label: "Plaie atroce", key: "plaieatroce", degatsMin: 7, degatsMax: 8, count: 1, horsCombat: true, modifier: -12 }, |     plaieatroce: { value: 4, label: "Plaie atroce", key: "plaieatroce", degatsMin: 7, degatsMax: 8, count: 1, horsCombat: true, modifier: -12 }, | ||||||
|     tunenet: { value: 5, label: "Tué net", key: "tuenet", degatsMin: 9, degatsMax: 100, count: 1, horsCombat: true, mort: true, modifier: -12 } |     tuenet: { value: 5, label: "Tué net", key: "tuenet", degatsMin: 9, degatsMax: 100, count: 1, horsCombat: true, mort: true, modifier: -100 } | ||||||
|   }, |   }, | ||||||
|   virulence: { |   virulence: { | ||||||
|     aucune: { label: "Aucune", value: "aucune", modifier: 0 }, |     aucune: { label: "Aucune", value: "aucune", modifier: 0 }, | ||||||
|   | |||||||
| @@ -12,7 +12,9 @@ export class TeDeumUtility { | |||||||
|     CONFIG.JournalEntry.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" |     CONFIG.JournalEntry.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" | ||||||
|     CONFIG.Macro.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" |     CONFIG.Macro.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" | ||||||
|     CONFIG.Adventure.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" |     CONFIG.Adventure.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static installHooks() { | ||||||
|     Hooks.on('renderChatLog', (log, html, data) => TeDeumUtility.chatListeners(html)); |     Hooks.on('renderChatLog', (log, html, data) => TeDeumUtility.chatListeners(html)); | ||||||
|  |  | ||||||
|     Hooks.on("renderActorDirectory", (app, html, data) => { |     Hooks.on("renderActorDirectory", (app, html, data) => { | ||||||
| @@ -28,7 +30,47 @@ export class TeDeumUtility { | |||||||
|         $(html).find('.header-actions').after(button) |         $(html).find('.header-actions').after(button) | ||||||
|       } |       } | ||||||
|     }) |     }) | ||||||
|     //Hooks.on("getChatLogEntryContext", (html, options) => TeDeumUtility.chatMenuManager(html, options)); |  | ||||||
|  |     Hooks.on("combatStart", async (combat, updateData, options) => { | ||||||
|  |       this.resetCombatActions(combat) | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     Hooks.on("combatRound", (combat, updateData, updateOptions) => { | ||||||
|  |       // List all actors related to combatant | ||||||
|  |       if (game.user.isGM) { | ||||||
|  |         this.resetCombatActions(combat) | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |     Hooks.on("getCombatTrackerContextOptions", (html, options) => { | ||||||
|  |       console.log("Get Combat Tracker Context", html, options) | ||||||
|  |       this.pushCombatOptions(html, options); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static pushCombatOptions(html, options) { | ||||||
|  |     options.push({ name: "Actions +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1); } }) | ||||||
|  |     options.push({ name: "Actions -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1); } }) | ||||||
|  |     options.push({ name: "Actions MG +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1, true); } }) | ||||||
|  |     options.push({ name: "Actions MG -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1, true); } }) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static async resetCombatActions(combat) { | ||||||
|  |     if (game.user.isGM) { | ||||||
|  |       for (let c of combat.combatants) { | ||||||
|  |         let actor = game.actors.get(c.actorId) | ||||||
|  |         if (actor) { | ||||||
|  |           let nbActions = actor.getNbActions()?.value || 0 | ||||||
|  |           let isMainGauche = (actor.getCompetenceScore("Main gauche") > 0) | ||||||
|  |           let nbActionsMainGauche = isMainGauche ? nbActions : 0 | ||||||
|  |           await c.setFlag("world", "available-actions", { nbActions, nbActionsMainGauche }) | ||||||
|  |           await c.update({ name: `${c.token.name} (${nbActions} / ${nbActionsMainGauche})` }) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -201,7 +243,7 @@ export class TeDeumUtility { | |||||||
|     return actor |     return actor | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */  /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async manageOpposition(rollData) { |   static async manageOpposition(rollData) { | ||||||
|     if (!this.currentOpposition) { |     if (!this.currentOpposition) { | ||||||
|       // Store rollData as current GM opposition |       // Store rollData as current GM opposition | ||||||
| @@ -210,29 +252,47 @@ export class TeDeumUtility { | |||||||
|     } else { |     } else { | ||||||
|       // Perform the opposition |       // Perform the opposition | ||||||
|       let isAttackWinner = true |       let isAttackWinner = true | ||||||
|       let rWinner = this.currentOpposition |       let rWinner, rLooser | ||||||
|       let rLooser = rollData |       if (this.currentOpposition.total <= rollData.total) { | ||||||
|       if (rWinner.total < rLooser.total) { |         rWinner = foundry.utils.duplicate(rollData) | ||||||
|         rWinner = rollData |         rLooser = foundry.utils.duplicate(this.currentOpposition) | ||||||
|         rLooser = this.currentOpposition |  | ||||||
|         isAttackWinner = false |         isAttackWinner = false | ||||||
|  |       } else { | ||||||
|  |         rWinner = foundry.utils.duplicate(this.currentOpposition) | ||||||
|  |         rLooser = foundry.utils.duplicate(rollData) | ||||||
|  |         isAttackWinner = true | ||||||
|       } |       } | ||||||
|       this.currentOpposition = undefined // Reset opposition |       this.currentOpposition = undefined // Reset opposition | ||||||
|       let oppositionData = { |       let oppositionData = { | ||||||
|         winner: rWinner, |         winner: rWinner, | ||||||
|         looser: rLooser |         looser: rLooser | ||||||
|       } |       } | ||||||
|  |       // Update difficulty | ||||||
|  |       rWinner.difficulty = rLooser.total | ||||||
|  |       rLooser.difficulty = rWinner.total | ||||||
|  |       await this.computeResults(rWinner) | ||||||
|  |       await this.computeResults(rLooser) | ||||||
|  |       // Auto XP management when opposed | ||||||
|  |       if (rWinner.isReussiteCritique) { | ||||||
|  |         let actor = this.getActorFromRollData(rWinner) | ||||||
|  |         actor.modifyXP(rWinner.carac.key, 1) | ||||||
|  |       } | ||||||
|  |       if (rLooser.isEchecCritique) { | ||||||
|  |         let actor = this.getActorFromRollData(rLooser) | ||||||
|  |         actor.modifyXP(rLooser.carac.key, 1) | ||||||
|  |       } | ||||||
|  |  | ||||||
|       let msg = await this.createChatWithRollMode(rollData.alias, { |       let msg = await this.createChatWithRollMode(rollData.alias, { | ||||||
|         content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-opposition-result.hbs`, oppositionData) |         content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-opposition-result.hbs`, oppositionData) | ||||||
|       }) |       }) | ||||||
|       await msg.setFlag("world", "te-deum-rolldata", rollData) |       await msg.setFlag("world", "te-deum-rolldata", rollData) | ||||||
|  |  | ||||||
|       // Si le gagnant est l'attaquant, appliquer les dégats sur la victime |       // Si le gagnant est l'attaquant, appliquer les dégats sur la victime | ||||||
|       if ( isAttackWinner && rWinner.isSuccess && rWinner.mode == "arme" &&  rWinner.arme?.system.typeArme == "melee" && rWinner.defenderTokenId) { |       if (isAttackWinner && rWinner.isSuccess && rWinner.mode == "arme" && rWinner.arme?.system.typeArme == "melee" && rWinner.defenderTokenId) { | ||||||
|         this.appliquerDegats(rWinner) |         await this.appliquerDegats(rWinner) | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       console.log("Rolldata result", rollData) |       console.log("Opposition result", rollData, isAttackWinner, oppositionData) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -242,7 +302,18 @@ export class TeDeumUtility { | |||||||
|     let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId) |     let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId) | ||||||
|     if (defenderToken) { |     if (defenderToken) { | ||||||
|       let actor = defenderToken.actor |       let actor = defenderToken.actor | ||||||
|       await actor.appliquerDegats(rollData) |       if (game.user.isGM || actor.isOwner) { | ||||||
|  |         await actor.appliquerDegats(rollData) | ||||||
|  |       } else { | ||||||
|  |         // Send a socket message | ||||||
|  |         game.socket.emit("system.fvtt-te-deum", { name: "msg_apply_damage", data: { rollData } }); | ||||||
|  |       } | ||||||
|  |       // Attaque naturelle avec dégats inférieur à -2 | ||||||
|  |       if ((rollData?.arme?.system.specificites?.poing?.hasSpec || rollData?.arme?.system.specificites?.pied?.hasSpec) && rollData.degats < -2) { | ||||||
|  |         let attacker = this.getActorFromRollData(rollData) | ||||||
|  |         attacker.appliquerBlessure("estafilade", "maindroite", "Contusion suite à une attaque naturelle") | ||||||
|  |         ui.notifications.info(`${attacker.name} subit 1 contusion en infligeant ${rollData.degats} dégâts à mains nues`) | ||||||
|  |       } | ||||||
|     } else { |     } else { | ||||||
|       ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué") |       ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué") | ||||||
|     } |     } | ||||||
| @@ -267,6 +338,17 @@ export class TeDeumUtility { | |||||||
|         TeDeumUtility.appliquerDegats(rollData, messageId) |         TeDeumUtility.appliquerDegats(rollData, messageId) | ||||||
|       } |       } | ||||||
|     }) |     }) | ||||||
|  |     $(html).on("click", '.chat-command-gain-xp', event => { | ||||||
|  |       let messageId = TeDeumUtility.findChatMessageId(event.currentTarget) | ||||||
|  |       let message = game.messages.get(messageId) | ||||||
|  |       let rollData = message.getFlag("world", "te-deum-rolldata") | ||||||
|  |       if (rollData) { | ||||||
|  |         let actor = TeDeumUtility.getActorFromRollData(rollData) | ||||||
|  |         actor.modifyXP(rollData.carac.key, 1) | ||||||
|  |         // Hide this button | ||||||
|  |         event.currentTarget.style.display = 'none'; | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -361,6 +443,28 @@ export class TeDeumUtility { | |||||||
|         chatMsg.setFlag("world", "tedeum-rolldata", rollData) |         chatMsg.setFlag("world", "tedeum-rolldata", rollData) | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     if (msg.name == "msg_modify_combat_action") { | ||||||
|  |       if (game.user.isGM) { | ||||||
|  |         let { combatantId, ca } = msg.data | ||||||
|  |         let combatant = game.combat.combatants.get(combatantId) | ||||||
|  |         if (combatant) { | ||||||
|  |           console.log("sock - Modify Combat Action : ", combatant.name, ca) | ||||||
|  |           await TeDeumUtility.updateCombatantActions(combatant, ca) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (msg.name == "msg_apply_damage") { | ||||||
|  |       if (game.user.isGM) { | ||||||
|  |         let rollData = msg.data.rollData | ||||||
|  |         let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId) | ||||||
|  |         if (defenderToken) { | ||||||
|  |           let actor = defenderToken.actor | ||||||
|  |           await actor.appliquerDegats(rollData) | ||||||
|  |         } else { | ||||||
|  |           ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué") | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -477,6 +581,15 @@ export class TeDeumUtility { | |||||||
|       if (rollData.isMouvement) { |       if (rollData.isMouvement) { | ||||||
|         localModifier -= 1 |         localModifier -= 1 | ||||||
|       } |       } | ||||||
|  |       if (rollData.arme && rollData.allongeId) { | ||||||
|  |         localModifier += rollData.allonges[rollData.allongeId].malus | ||||||
|  |         rollData.allongeMalus = rollData.allonges[rollData.allongeId].malus | ||||||
|  |         rollData.nbEsquives = rollData.allonges[rollData.allongeId]?.esquive || 0 | ||||||
|  |       } | ||||||
|  |       if (rollData.attaqueCiblee && rollData.attaqueCiblee != "aucune") { | ||||||
|  |         localModifier -= 1 | ||||||
|  |         rollData.loc = foundry.utils.duplicate(game.system.tedeum.config.LOCALISATION[rollData.attaqueCiblee]) | ||||||
|  |       } | ||||||
|       let diceBase = this.modifyDice(rollData.carac.dice, localModifier + Number(rollData.bonusMalus) + rollData.santeModifier) |       let diceBase = this.modifyDice(rollData.carac.dice, localModifier + Number(rollData.bonusMalus) + rollData.santeModifier) | ||||||
|       if (!diceBase) return; |       if (!diceBase) return; | ||||||
|       diceFormula = diceBase + "x + " + rollData.compScore |       diceFormula = diceBase + "x + " + rollData.compScore | ||||||
| @@ -489,24 +602,30 @@ export class TeDeumUtility { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async getLocalisation(rollData) { |   static async getLocalisation(rollData) { | ||||||
|     let locRoll = await new Roll("1d20").roll() |     let locRoll | ||||||
|     await this.showDiceSoNice(locRoll, game.settings.get("core", "rollMode")) |     if (rollData.loc) { | ||||||
|     rollData.locRoll = foundry.utils.duplicate(locRoll) |       locRoll = await new Roll(String(rollData.loc.score.min)).roll() | ||||||
|     for (let key in game.system.tedeum.config.LOCALISATION) { |     } else { | ||||||
|       let loc = game.system.tedeum.config.LOCALISATION[key] |       locRoll = await new Roll("1d20").roll() | ||||||
|       if (locRoll.total >= loc.score.min && locRoll.total <= loc.score.max) { |       await this.showDiceSoNice(locRoll, game.settings.get("core", "rollMode")) | ||||||
|         rollData.loc = foundry.utils.duplicate(loc) |       for (let key in game.system.tedeum.config.LOCALISATION) { | ||||||
|         break |         let loc = game.system.tedeum.config.LOCALISATION[key] | ||||||
|  |         if (locRoll.total >= loc.score.min && locRoll.total <= loc.score.max) { | ||||||
|  |           rollData.loc = foundry.utils.duplicate(loc) | ||||||
|  |           break | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     rollData.locRoll = foundry.utils.duplicate(locRoll) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async processAttaqueMelee(rollData) { |   static async processAttaqueMelee(rollData) { | ||||||
|     await this.getLocalisation(rollData) |     await this.getLocalisation(rollData) | ||||||
|     let actor = game.actors.get(rollData.actorId) |     let actor = game.actors.get(rollData.actorId) | ||||||
|     let bDegats = actor.getBonusDegats() |     let bDegats = actor.getAttaqueBonusDegats(rollData) | ||||||
|     let degatsRoll = await new Roll(rollData.arme.system.degats + "+" + bDegats.value).roll() |     rollData.degatsFormula = rollData.arme.system.degats + "+" + bDegats | ||||||
|  |     let degatsRoll = await new Roll(rollData.degatsFormula).roll() | ||||||
|     await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode")) |     await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode")) | ||||||
|     rollData.degatsRoll = foundry.utils.duplicate(degatsRoll) |     rollData.degatsRoll = foundry.utils.duplicate(degatsRoll) | ||||||
|     rollData.degats = degatsRoll.total |     rollData.degats = degatsRoll.total | ||||||
| @@ -522,12 +641,51 @@ export class TeDeumUtility { | |||||||
|       await this.getLocalisation(rollData) |       await this.getLocalisation(rollData) | ||||||
|       // Now the degats |       // Now the degats | ||||||
|       let degatsRoll = await new Roll(rollData.arme.system.degats).roll() |       let degatsRoll = await new Roll(rollData.arme.system.degats).roll() | ||||||
|       await this.showDiceSoNice(rollData.locRoll, game.settings.get("core", "rollMode")) |       await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode")) | ||||||
|       rollData.degatsRoll = foundry.utils.duplicate(degatsRoll) |       rollData.degatsRoll = foundry.utils.duplicate(degatsRoll) | ||||||
|       rollData.degats = degatsRoll.total |       rollData.degats = degatsRoll.total | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static async updateCombatantActions(combatant, ca) { | ||||||
|  |     await combatant.setFlag("world", "available-actions", ca) | ||||||
|  |     await combatant.update({ name: `${combatant.token.name} (${ca.nbActions} / ${ca.nbActionsMainGauche})` }) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static async manageCombatActions(actor, rollData) { | ||||||
|  |     let combat = game.combats.active | ||||||
|  |     if (!combat) return; | ||||||
|  |     let combatant = combat.getCombatantByActor(actor) | ||||||
|  |     if (!combatant) return; | ||||||
|  |     let ca = combatant.getFlag("world", "available-actions") | ||||||
|  |     if (!ca) return; | ||||||
|  |     if (rollData.mode == "arme" && rollData.isMainGauche) { | ||||||
|  |       if (ca.nbActionsMainGauche > 0) { | ||||||
|  |         ca.nbActionsMainGauche -= 1 | ||||||
|  |         ca.nbActions = Math.max(ca.nbActions - 1, 0) | ||||||
|  |       } else { | ||||||
|  |         ui.notifications.error(`${actor.name} n'a plus d'actions disponibles à la main gauche pour ce round`) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (ca.nbActions > 0) { | ||||||
|  |       ca.nbActions -= 1 | ||||||
|  |     } else { | ||||||
|  |       ui.notifications.error(`${actor.name} n'a plus d'actions disponibles pour ce round`) | ||||||
|  |     } | ||||||
|  |     console.log("Manage combat actions 1", actor.name, combatant) | ||||||
|  |     if (game.user.isGM) { | ||||||
|  |       await this.updateCombatantActions(combatant, ca) | ||||||
|  |     } else { | ||||||
|  |       // Send a socket message | ||||||
|  |       game.socket.emit("system.fvtt-te-deum", { name: "msg_modify_combat_action", data: { combatantId: combatant.id, ca } }); | ||||||
|  |     } | ||||||
|  |     rollData.hasActions = true | ||||||
|  |     rollData.remainingActions = ca.nbActions | ||||||
|  |     rollData.remainingActionsMainGauche = ca.nbActionsMainGauche | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async rollTeDeum(rollData) { |   static async rollTeDeum(rollData) { | ||||||
|  |  | ||||||
| @@ -537,9 +695,13 @@ export class TeDeumUtility { | |||||||
|       rollData.difficulty = "pardefaut" |       rollData.difficulty = "pardefaut" | ||||||
|     } |     } | ||||||
|     rollData.difficulty = game.system.tedeum.config.difficulte[rollData.difficulty].value |     rollData.difficulty = game.system.tedeum.config.difficulte[rollData.difficulty].value | ||||||
|  |  | ||||||
|     // Compute the real competence score |     // Compute the real competence score | ||||||
|     if ( rollData.competence ) { |     if (rollData.competence) { | ||||||
|       if ( rollData.competence.system.isBase) { |       if (rollData.isMainGauche) { | ||||||
|  |         rollData.competence = actor.getMeilleureCompetenceMainGauche(rollData.competence) | ||||||
|  |       } | ||||||
|  |       if (rollData.competence.system.isBase) { | ||||||
|         rollData.compScore = actor.system.caracteristiques[rollData.competence.system.caracteristique].value |         rollData.compScore = actor.system.caracteristiques[rollData.competence.system.caracteristique].value | ||||||
|       } else { |       } else { | ||||||
|         rollData.compScore = rollData.competence.system.score |         rollData.compScore = rollData.competence.system.score | ||||||
| @@ -561,6 +723,8 @@ export class TeDeumUtility { | |||||||
|  |  | ||||||
|     await this.processAttaqueDistance(rollData) |     await this.processAttaqueDistance(rollData) | ||||||
|  |  | ||||||
|  |     await this.manageCombatActions(actor, rollData) | ||||||
|  |  | ||||||
|     let msg = await this.createChatWithRollMode(rollData.alias, { |     let msg = await this.createChatWithRollMode(rollData.alias, { | ||||||
|       content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData) |       content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData) | ||||||
|     }) |     }) | ||||||
| @@ -571,10 +735,6 @@ export class TeDeumUtility { | |||||||
|     if (rollData.enableProvidence) { |     if (rollData.enableProvidence) { | ||||||
|       actor.modifyProvidence(-1) |       actor.modifyProvidence(-1) | ||||||
|     } |     } | ||||||
|     // Manage XP |  | ||||||
|     if (rollData.isReussiteCritique || rollData.isEchecCritique) { |  | ||||||
|       actor.modifyXP(rollData.carac.key, 1) |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   | |||||||
| @@ -1,17 +1,17 @@ | |||||||
| export  class TeDeumArmeSchema extends foundry.abstract.TypeDataModel { | export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel { | ||||||
|   static defineSchema() { |   static defineSchema() { | ||||||
|     const fields = foundry.data.fields; |     const fields = foundry.data.fields; | ||||||
|     const requiredInteger = { required: true, nullable: false, integer: true }; |     const requiredInteger = { required: true, nullable: false, integer: true }; | ||||||
|     const requiredDouble = { required: true, nullable: false, integer: false }; |     const requiredDouble = { required: true, nullable: false, integer: false }; | ||||||
|     const schema = {}; |     const schema = {}; | ||||||
|  |  | ||||||
|     schema.typeArme = new fields.StringField({required: true, choices: ["melee", "tir"], initial: "melee"}); |     schema.typeArme = new fields.StringField({ required: true, choices: ["melee", "tir"], initial: "melee" }); | ||||||
|     schema.allonge = new fields.StringField({required: true, choices: ["courte", "moyenne", "longue", "treslongue"], initial: "courte"}); |     schema.allonge = new fields.StringField({ required: true, choices: ["courte", "moyenne", "longue", "treslongue"], initial: "courte" }); | ||||||
|  |  | ||||||
|     schema.specificites = new fields.SchemaField( |     schema.specificites = new fields.SchemaField( | ||||||
|       Object.values((game.system.tedeum.config.ARME_SPECIFICITE)).reduce((obj, spec) => { |       Object.values((game.system.tedeum.config.ARME_SPECIFICITE)).reduce((obj, spec) => { | ||||||
|         obj[spec.id] = new fields.SchemaField({ |         obj[spec.id] = new fields.SchemaField({ | ||||||
|           hasSpec: new fields.BooleanField({initial: false}), |           hasSpec: new fields.BooleanField({ initial: false }), | ||||||
|         }); |         }); | ||||||
|         return obj; |         return obj; | ||||||
|       }, {}) |       }, {}) | ||||||
| @@ -26,18 +26,18 @@ export  class TeDeumArmeSchema extends foundry.abstract.TypeDataModel { | |||||||
|       }, {}) |       }, {}) | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     schema.degatsArmure = new fields.SchemaField( { |     schema.degatsArmure = new fields.SchemaField({ | ||||||
|       sansarmure : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), |       sansarmure: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||||
|       cuir : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), |       cuir: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||||
|       plates : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), |       plates: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||||
|       mailles : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), |       mailles: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     schema.tempsRecharge = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); |     schema.tempsRecharge = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); | ||||||
|     schema.competenceRecharge = new fields.StringField({ required: false, choices:["aucune", "archerie", "arquebusade"], initial: "aucune", blank: true }); |     schema.competenceRecharge = new fields.StringField({ required: false, choices: ["aucune", "archerie", "arquebusade"], initial: "aucune", blank: true }); | ||||||
|     schema.valeurEchecCritique = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 }); |     schema.valeurEchecCritique = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 }); | ||||||
|  |  | ||||||
|     schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); |     schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0 }); | ||||||
|  |  | ||||||
|     schema.degats = new fields.StringField({ required: false, blank: true, initial: "0" }); |     schema.degats = new fields.StringField({ required: false, blank: true, initial: "0" }); | ||||||
|     schema.degatscrosse = new fields.StringField({ required: false, blank: true, initial: "0" }); |     schema.degatscrosse = new fields.StringField({ required: false, blank: true, initial: "0" }); | ||||||
| @@ -46,15 +46,15 @@ export  class TeDeumArmeSchema extends foundry.abstract.TypeDataModel { | |||||||
|     for (let key of Object.keys(game.system.tedeum.config.armeCompetences)) { |     for (let key of Object.keys(game.system.tedeum.config.armeCompetences)) { | ||||||
|       comp.push(key); |       comp.push(key); | ||||||
|     } |     } | ||||||
|     schema.competence = new fields.StringField({ required: true, choices:comp, initial: "bagarre" }); |     schema.competence = new fields.StringField({ required: true, choices: comp, initial: "bagarre" }); | ||||||
|     schema.competence2 = new fields.StringField({ required: false, choices:comp, initial: "", blank: true }); |     schema.competence2 = new fields.StringField({ required: false, choices: comp, initial: "", blank: true }); | ||||||
|  |  | ||||||
|     schema.prix = new fields.NumberField({ ...requiredDouble, initial: 0, min: 0 }); |     schema.prix = new fields.NumberField({ ...requiredDouble, initial: 0, min: 0 }); | ||||||
|     schema.monnaie = new fields.StringField({ required: true, blank: false, initial: "denier" }); |     schema.monnaie = new fields.StringField({ required: true, blank: false, initial: "denier" }); | ||||||
|  |  | ||||||
|     schema.equipe = new fields.BooleanField({initial: false}), |     schema.equipe = new fields.BooleanField({ initial: false }), | ||||||
|  |  | ||||||
|     schema.description = new fields.HTMLField({ required: true, blank: true }); |       schema.description = new fields.HTMLField({ required: true, blank: true }); | ||||||
|  |  | ||||||
|     return schema; |     return schema; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -4,8 +4,9 @@ export class TeDeumBlessureSchema extends foundry.abstract.TypeDataModel { | |||||||
|     const requiredInteger = { required: true, nullable: false, integer: true }; |     const requiredInteger = { required: true, nullable: false, integer: true }; | ||||||
|     const schema = {}; |     const schema = {}; | ||||||
|  |  | ||||||
|     schema.typeBlessure = new fields.StringField({required: true, choices: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet"], initial: "estafilade"}); |     schema.typeBlessure = new fields.StringField({ required: true, choices: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet"], initial: "estafilade" }); | ||||||
|     schema.localisation = new fields.StringField({required: true, choices: ["piedgauche", "pieddroit", "jambegauche", "jambedroite", "maingauche", "maindroite", "brasgauche", "brasdroit", "tete", "corps"], initial: "corps"}); |     schema.value = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) | ||||||
|  |     schema.localisation = new fields.StringField({ required: true, choices: ["piedgauche", "pieddroit", "jambegauche", "jambedroite", "maingauche", "maindroite", "brasgauche", "brasdroit", "tete", "corps"], initial: "corps" }); | ||||||
|  |  | ||||||
|     schema.description = new fields.HTMLField({ required: true, blank: true }); |     schema.description = new fields.HTMLField({ required: true, blank: true }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -60,9 +60,18 @@ export class TeDeumRollDialog extends Dialog { | |||||||
|     html.find('#bonusMalusPerso').change((event) => { |     html.find('#bonusMalusPerso').change((event) => { | ||||||
|       this.rollData.bonusMalusPerso = Number(event.currentTarget.value) |       this.rollData.bonusMalusPerso = Number(event.currentTarget.value) | ||||||
|     }) |     }) | ||||||
|  |     html.find('#roll-allonge').change((event) => { | ||||||
|  |       this.rollData.allongeId = event.currentTarget.value | ||||||
|  |     }) | ||||||
|  |     html.find('#roll-main-gauche').change((event) => { | ||||||
|  |       this.rollData.isMainGauche = event.currentTarget.checked | ||||||
|  |     }) | ||||||
|     html.find('#roll-difficulty').change((event) => { |     html.find('#roll-difficulty').change((event) => { | ||||||
|       this.rollData.difficulty = String(event.currentTarget.value) || "pardefaut" |       this.rollData.difficulty = String(event.currentTarget.value) || "pardefaut" | ||||||
|     }) |     }) | ||||||
|  |     html.find('#roll-attaque-ciblee').change((event) => { | ||||||
|  |       this.rollData.attaqueCiblee = event.currentTarget.value || "0" | ||||||
|  |     }) | ||||||
|     html.find('#roll-bonus-malus').change((event) => { |     html.find('#roll-bonus-malus').change((event) => { | ||||||
|       this.rollData.bonusMalus = event.currentTarget.value || "0" |       this.rollData.bonusMalus = event.currentTarget.value || "0" | ||||||
|     }) |     }) | ||||||
| @@ -80,6 +89,12 @@ export class TeDeumRollDialog extends Dialog { | |||||||
|     html.find('#roll-tir-mouvement').change((event) => { |     html.find('#roll-tir-mouvement').change((event) => { | ||||||
|       this.rollData.isMouvement = event.currentTarget.checked |       this.rollData.isMouvement = event.currentTarget.checked | ||||||
|     }) |     }) | ||||||
|  |     html.find('#roll-charge-a-pied').change((event) => { | ||||||
|  |       this.rollData.isChargeAPied = event.currentTarget.checked | ||||||
|  |     }) | ||||||
|  |     html.find('#roll-charge-a-cheval').change((event) => { | ||||||
|  |       this.rollData.isChargeACheval = event.currentTarget.checked | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -59,7 +59,6 @@ export class TeDeumItemSheet extends foundry.appv1.sheets.ItemSheet { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     this.options.editable = !(this.object.origin == "embeddedItem"); |     this.options.editable = !(this.object.origin == "embeddedItem"); | ||||||
|     console.log("ITEM DATA", formData, this); |  | ||||||
|     return formData; |     return formData; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -157,7 +156,7 @@ export class TeDeumItemSheet extends foundry.appv1.sheets.ItemSheet { | |||||||
|       let itemType = li.data("item-type"); |       let itemType = li.data("item-type"); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   get template() { |   get template() { | ||||||
|   | |||||||
| @@ -90,6 +90,8 @@ Hooks.once("init", async function () { | |||||||
|   foundry.documents.collections.Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true }); |   foundry.documents.collections.Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true }); | ||||||
|  |  | ||||||
|   TeDeumUtility.init() |   TeDeumUtility.init() | ||||||
|  |  | ||||||
|  |   TeDeumUtility.installHooks() | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -98,6 +100,7 @@ Hooks.once("init", async function () { | |||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| Hooks.once("ready", function () { | Hooks.once("ready", function () { | ||||||
|  |  | ||||||
|  |  | ||||||
|   // User warning |   // User warning | ||||||
|   if (!game.user.isGM && game.user.character == undefined) { |   if (!game.user.isGM && game.user.character == undefined) { | ||||||
|     ui.notifications.info("Attention ! Aucun personnage relié au joueur !"); |     ui.notifications.info("Attention ! Aucun personnage relié au joueur !"); | ||||||
| @@ -107,10 +110,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) |     console.log("ClassCounter loaded", moduleCounter) | ||||||
|     moduleCounter.ClassCounter.registerUsageCount() |     moduleCounter.ClassCounter.registerUsageCount() | ||||||
|   }).catch(err=> |   }).catch(err => | ||||||
|     console.log("No stats available, giving up.") |     console.log("No stats available, giving up.") | ||||||
|   ) |   ) | ||||||
|   TeDeumUtility.ready(); |   TeDeumUtility.ready(); | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| MANIFEST-000120 | MANIFEST-000165 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:10.022659 7f2a0effd6c0 Recovering log #118 | 2025/09/24-16:42:14.734893 7f7cfb7fe6c0 Recovering log #163 | ||||||
| 2025/07/09-17:43:10.033191 7f2a0effd6c0 Delete type=3 #116 | 2025/09/24-16:42:14.744867 7f7cfb7fe6c0 Delete type=3 #161 | ||||||
| 2025/07/09-17:43:10.033247 7f2a0effd6c0 Delete type=0 #118 | 2025/09/24-16:42:14.744926 7f7cfb7fe6c0 Delete type=0 #163 | ||||||
| 2025/07/09-18:03:48.854204 7f276ffff6c0 Level-0 table #123: started | 2025/09/24-16:43:46.397731 7f7cf9fff6c0 Level-0 table #168: started | ||||||
| 2025/07/09-18:03:48.854235 7f276ffff6c0 Level-0 table #123: 0 bytes OK | 2025/09/24-16:43:46.397776 7f7cf9fff6c0 Level-0 table #168: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.860211 7f276ffff6c0 Delete type=0 #121 | 2025/09/24-16:43:46.462453 7f7cf9fff6c0 Delete type=0 #166 | ||||||
| 2025/07/09-18:03:48.860371 7f276ffff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:46.462659 7f7cf9fff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.560525 7f0793fff6c0 Recovering log #114 | 2025/09/24-16:34:06.472911 7f7cfbfff6c0 Recovering log #159 | ||||||
| 2025/07/02-23:06:08.610681 7f0793fff6c0 Delete type=3 #112 | 2025/09/24-16:34:06.482703 7f7cfbfff6c0 Delete type=3 #157 | ||||||
| 2025/07/02-23:06:08.610784 7f0793fff6c0 Delete type=0 #114 | 2025/09/24-16:34:06.482774 7f7cfbfff6c0 Delete type=0 #159 | ||||||
| 2025/07/02-23:08:13.585521 7f07923ff6c0 Level-0 table #119: started | 2025/09/24-16:41:30.176475 7f7cf9fff6c0 Level-0 table #164: started | ||||||
| 2025/07/02-23:08:13.585561 7f07923ff6c0 Level-0 table #119: 0 bytes OK | 2025/09/24-16:41:30.176525 7f7cf9fff6c0 Level-0 table #164: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.592021 7f07923ff6c0 Delete type=0 #117 | 2025/09/24-16:41:30.183000 7f7cf9fff6c0 Delete type=0 #162 | ||||||
| 2025/07/02-23:08:13.592190 7f07923ff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.195641 7f7cf9fff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000223 | MANIFEST-000268 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:09.933075 7f2a0e7fc6c0 Recovering log #221 | 2025/09/24-16:42:14.642386 7f7d00dfa6c0 Recovering log #266 | ||||||
| 2025/07/09-17:43:09.943069 7f2a0e7fc6c0 Delete type=3 #219 | 2025/09/24-16:42:14.651936 7f7d00dfa6c0 Delete type=3 #264 | ||||||
| 2025/07/09-17:43:09.943126 7f2a0e7fc6c0 Delete type=0 #221 | 2025/09/24-16:42:14.652001 7f7d00dfa6c0 Delete type=0 #266 | ||||||
| 2025/07/09-18:03:48.778823 7f276ffff6c0 Level-0 table #226: started | 2025/09/24-16:43:45.840704 7f7cf9fff6c0 Level-0 table #271: started | ||||||
| 2025/07/09-18:03:48.778862 7f276ffff6c0 Level-0 table #226: 0 bytes OK | 2025/09/24-16:43:45.840737 7f7cf9fff6c0 Level-0 table #271: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.785076 7f276ffff6c0 Delete type=0 #224 | 2025/09/24-16:43:45.898655 7f7cf9fff6c0 Delete type=0 #269 | ||||||
| 2025/07/09-18:03:48.804468 7f276ffff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:45.963394 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.061648 7f0792ffd6c0 Recovering log #217 | 2025/09/24-16:34:06.383778 7f7cfb7fe6c0 Recovering log #262 | ||||||
| 2025/07/02-23:06:08.112616 7f0792ffd6c0 Delete type=3 #215 | 2025/09/24-16:34:06.393755 7f7cfb7fe6c0 Delete type=3 #260 | ||||||
| 2025/07/02-23:06:08.112666 7f0792ffd6c0 Delete type=0 #217 | 2025/09/24-16:34:06.393833 7f7cfb7fe6c0 Delete type=0 #262 | ||||||
| 2025/07/02-23:08:13.519462 7f07923ff6c0 Level-0 table #222: started | 2025/09/24-16:41:30.118332 7f7cf9fff6c0 Level-0 table #267: started | ||||||
| 2025/07/02-23:08:13.519492 7f07923ff6c0 Level-0 table #222: 0 bytes OK | 2025/09/24-16:41:30.118371 7f7cf9fff6c0 Level-0 table #267: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.525466 7f07923ff6c0 Delete type=0 #220 | 2025/09/24-16:41:30.124477 7f7cf9fff6c0 Delete type=0 #265 | ||||||
| 2025/07/02-23:08:13.539414 7f07923ff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.124651 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000222 | MANIFEST-000267 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:09.945259 7f2a0dffb6c0 Recovering log #220 | 2025/09/24-16:42:14.655535 7f7cfbfff6c0 Recovering log #265 | ||||||
| 2025/07/09-17:43:09.955705 7f2a0dffb6c0 Delete type=3 #218 | 2025/09/24-16:42:14.666517 7f7cfbfff6c0 Delete type=3 #263 | ||||||
| 2025/07/09-17:43:09.955844 7f2a0dffb6c0 Delete type=0 #220 | 2025/09/24-16:42:14.666585 7f7cfbfff6c0 Delete type=0 #265 | ||||||
| 2025/07/09-18:03:48.791392 7f276ffff6c0 Level-0 table #225: started | 2025/09/24-16:43:45.762646 7f7cf9fff6c0 Level-0 table #270: started | ||||||
| 2025/07/09-18:03:48.791426 7f276ffff6c0 Level-0 table #225: 0 bytes OK | 2025/09/24-16:43:45.762671 7f7cf9fff6c0 Level-0 table #270: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.797485 7f276ffff6c0 Delete type=0 #223 | 2025/09/24-16:43:45.840542 7f7cf9fff6c0 Delete type=0 #268 | ||||||
| 2025/07/09-18:03:48.804509 7f276ffff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:45.963381 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.115418 7f07937fe6c0 Recovering log #216 | 2025/09/24-16:34:06.395848 7f7d00dfa6c0 Recovering log #261 | ||||||
| 2025/07/02-23:06:08.203034 7f07937fe6c0 Delete type=3 #214 | 2025/09/24-16:34:06.405550 7f7d00dfa6c0 Delete type=3 #259 | ||||||
| 2025/07/02-23:06:08.203104 7f07937fe6c0 Delete type=0 #216 | 2025/09/24-16:34:06.405604 7f7d00dfa6c0 Delete type=0 #261 | ||||||
| 2025/07/02-23:08:13.507158 7f07923ff6c0 Level-0 table #221: started | 2025/09/24-16:41:30.111558 7f7cf9fff6c0 Level-0 table #266: started | ||||||
| 2025/07/02-23:08:13.507179 7f07923ff6c0 Level-0 table #221: 0 bytes OK | 2025/09/24-16:41:30.111589 7f7cf9fff6c0 Level-0 table #266: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.513412 7f07923ff6c0 Delete type=0 #219 | 2025/09/24-16:41:30.118178 7f7cf9fff6c0 Delete type=0 #264 | ||||||
| 2025/07/02-23:08:13.539385 7f07923ff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.124642 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000219 | MANIFEST-000266 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:09.919870 7f2a0d7fa6c0 Recovering log #217 | 2025/09/24-16:42:14.629192 7f7cfaffd6c0 Recovering log #264 | ||||||
| 2025/07/09-17:43:09.930288 7f2a0d7fa6c0 Delete type=3 #215 | 2025/09/24-16:42:14.638946 7f7cfaffd6c0 Delete type=3 #262 | ||||||
| 2025/07/09-17:43:09.930358 7f2a0d7fa6c0 Delete type=0 #217 | 2025/09/24-16:42:14.639014 7f7cfaffd6c0 Delete type=0 #264 | ||||||
| 2025/07/09-18:03:48.785230 7f276ffff6c0 Level-0 table #222: started | 2025/09/24-16:43:45.706058 7f7cf9fff6c0 Level-0 table #269: started | ||||||
| 2025/07/09-18:03:48.785267 7f276ffff6c0 Level-0 table #222: 0 bytes OK | 2025/09/24-16:43:45.706134 7f7cf9fff6c0 Level-0 table #269: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.791250 7f276ffff6c0 Delete type=0 #220 | 2025/09/24-16:43:45.762523 7f7cf9fff6c0 Delete type=0 #267 | ||||||
| 2025/07/09-18:03:48.804490 7f276ffff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:45.963365 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.011331 7f0798bfa6c0 Recovering log #213 | 2025/09/24-16:34:06.370805 7f7cfaffd6c0 Recovering log #260 | ||||||
| 2025/07/02-23:06:08.059546 7f0798bfa6c0 Delete type=3 #211 | 2025/09/24-16:34:06.381415 7f7cfaffd6c0 Delete type=3 #258 | ||||||
| 2025/07/02-23:06:08.059612 7f0798bfa6c0 Delete type=0 #213 | 2025/09/24-16:34:06.381482 7f7cfaffd6c0 Delete type=0 #260 | ||||||
| 2025/07/02-23:08:13.513511 7f07923ff6c0 Level-0 table #218: started | 2025/09/24-16:41:30.104756 7f7cf9fff6c0 Level-0 table #265: started | ||||||
| 2025/07/02-23:08:13.513531 7f07923ff6c0 Level-0 table #218: 0 bytes OK | 2025/09/24-16:41:30.104801 7f7cf9fff6c0 Level-0 table #265: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.519351 7f07923ff6c0 Delete type=0 #216 | 2025/09/24-16:41:30.111363 7f7cf9fff6c0 Delete type=0 #263 | ||||||
| 2025/07/02-23:08:13.539400 7f07923ff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.124633 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000232 | MANIFEST-000277 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:09.957922 7f2a0d7fa6c0 Recovering log #229 | 2025/09/24-16:42:14.669125 7f7cfb7fe6c0 Recovering log #275 | ||||||
| 2025/07/09-17:43:09.968395 7f2a0d7fa6c0 Delete type=3 #227 | 2025/09/24-16:42:14.678629 7f7cfb7fe6c0 Delete type=3 #273 | ||||||
| 2025/07/09-17:43:09.968449 7f2a0d7fa6c0 Delete type=0 #229 | 2025/09/24-16:42:14.678694 7f7cfb7fe6c0 Delete type=0 #275 | ||||||
| 2025/07/09-18:03:48.797598 7f276ffff6c0 Level-0 table #235: started | 2025/09/24-16:43:45.898794 7f7cf9fff6c0 Level-0 table #280: started | ||||||
| 2025/07/09-18:03:48.797621 7f276ffff6c0 Level-0 table #235: 0 bytes OK | 2025/09/24-16:43:45.898823 7f7cf9fff6c0 Level-0 table #280: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.804333 7f276ffff6c0 Delete type=0 #233 | 2025/09/24-16:43:45.963207 7f7cf9fff6c0 Delete type=0 #278 | ||||||
| 2025/07/09-18:03:48.804527 7f276ffff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:45.963407 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,14 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.205635 7f0798bfa6c0 Recovering log #225 | 2025/09/24-16:34:06.407386 7f7cfaffd6c0 Recovering log #271 | ||||||
| 2025/07/02-23:06:08.258516 7f0798bfa6c0 Delete type=3 #223 | 2025/09/24-16:34:06.418079 7f7cfaffd6c0 Delete type=3 #269 | ||||||
| 2025/07/02-23:06:08.258587 7f0798bfa6c0 Delete type=0 #225 | 2025/09/24-16:34:06.418139 7f7cfaffd6c0 Delete type=0 #271 | ||||||
| 2025/07/02-23:08:13.497309 7f07923ff6c0 Level-0 table #230: started | 2025/09/24-16:41:30.124766 7f7cf9fff6c0 Level-0 table #276: started | ||||||
| 2025/07/02-23:08:13.500727 7f07923ff6c0 Level-0 table #230: 31862 bytes OK | 2025/09/24-16:41:30.124809 7f7cf9fff6c0 Level-0 table #276: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.507034 7f07923ff6c0 Delete type=0 #228 | 2025/09/24-16:41:30.131329 7f7cf9fff6c0 Delete type=0 #274 | ||||||
| 2025/07/02-23:08:13.525588 7f07923ff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at '!items!dbl7clezSXISzlqE' @ 511 : 1 | 2025/09/24-16:41:30.151558 7f7cf9fff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end) | ||||||
| 2025/07/02-23:08:13.525598 7f07923ff6c0 Compacting 1@0 + 1@1 files |  | ||||||
| 2025/07/02-23:08:13.532830 7f07923ff6c0 Generated table #231@0: 71 keys, 264331 bytes |  | ||||||
| 2025/07/02-23:08:13.532886 7f07923ff6c0 Compacted 1@0 + 1@1 files => 264331 bytes |  | ||||||
| 2025/07/02-23:08:13.538890 7f07923ff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] |  | ||||||
| 2025/07/02-23:08:13.539063 7f07923ff6c0 Delete type=2 #214 |  | ||||||
| 2025/07/02-23:08:13.539294 7f07923ff6c0 Delete type=2 #230 |  | ||||||
| 2025/07/02-23:08:13.539429 7f07923ff6c0 Manual compaction at level-0 from '!items!dbl7clezSXISzlqE' @ 511 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end) |  | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								packs/education/lost/000242.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/education/lost/000242.log
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								packs/graces/000273.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/graces/000273.log
									
									
									
									
									
										Normal file
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000222 | MANIFEST-000267 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:09.971163 7f2a0e7fc6c0 Recovering log #220 | 2025/09/24-16:42:14.682432 7f7cfaffd6c0 Recovering log #265 | ||||||
| 2025/07/09-17:43:09.980955 7f2a0e7fc6c0 Delete type=3 #218 | 2025/09/24-16:42:14.692809 7f7cfaffd6c0 Delete type=3 #263 | ||||||
| 2025/07/09-17:43:09.981011 7f2a0e7fc6c0 Delete type=0 #220 | 2025/09/24-16:42:14.692870 7f7cfaffd6c0 Delete type=0 #265 | ||||||
| 2025/07/09-18:03:48.811156 7f276ffff6c0 Level-0 table #225: started | 2025/09/24-16:43:46.011645 7f7cf9fff6c0 Level-0 table #270: started | ||||||
| 2025/07/09-18:03:48.811194 7f276ffff6c0 Level-0 table #225: 0 bytes OK | 2025/09/24-16:43:46.011682 7f7cf9fff6c0 Level-0 table #270: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.817214 7f276ffff6c0 Delete type=0 #223 | 2025/09/24-16:43:46.083954 7f7cf9fff6c0 Delete type=0 #268 | ||||||
| 2025/07/09-18:03:48.830580 7f276ffff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:46.208935 7f7cf9fff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.261714 7f0792ffd6c0 Recovering log #216 | 2025/09/24-16:34:06.421631 7f7d00dfa6c0 Recovering log #261 | ||||||
| 2025/07/02-23:06:08.311445 7f0792ffd6c0 Delete type=3 #214 | 2025/09/24-16:34:06.432018 7f7d00dfa6c0 Delete type=3 #259 | ||||||
| 2025/07/02-23:06:08.311538 7f0792ffd6c0 Delete type=0 #216 | 2025/09/24-16:34:06.432112 7f7d00dfa6c0 Delete type=0 #261 | ||||||
| 2025/07/02-23:08:13.545827 7f07923ff6c0 Level-0 table #221: started | 2025/09/24-16:41:30.098303 7f7cf9fff6c0 Level-0 table #266: started | ||||||
| 2025/07/02-23:08:13.545856 7f07923ff6c0 Level-0 table #221: 0 bytes OK | 2025/09/24-16:41:30.098366 7f7cf9fff6c0 Level-0 table #266: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.552104 7f07923ff6c0 Delete type=0 #219 | 2025/09/24-16:41:30.104526 7f7cf9fff6c0 Delete type=0 #264 | ||||||
| 2025/07/02-23:08:13.565260 7f07923ff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.124617 7f7cf9fff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								packs/graces/lost/000232.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/graces/lost/000232.log
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								packs/maladies/000273.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/maladies/000273.log
									
									
									
									
									
										Normal file
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000222 | MANIFEST-000267 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:09.982946 7f2a0effd6c0 Recovering log #220 | 2025/09/24-16:42:14.695212 7f7cfbfff6c0 Recovering log #265 | ||||||
| 2025/07/09-17:43:09.994498 7f2a0effd6c0 Delete type=3 #218 | 2025/09/24-16:42:14.705156 7f7cfbfff6c0 Delete type=3 #263 | ||||||
| 2025/07/09-17:43:09.994574 7f2a0effd6c0 Delete type=0 #220 | 2025/09/24-16:42:14.705234 7f7cfbfff6c0 Delete type=0 #265 | ||||||
| 2025/07/09-18:03:48.804608 7f276ffff6c0 Level-0 table #225: started | 2025/09/24-16:43:46.084105 7f7cf9fff6c0 Level-0 table #270: started | ||||||
| 2025/07/09-18:03:48.804666 7f276ffff6c0 Level-0 table #225: 0 bytes OK | 2025/09/24-16:43:46.084138 7f7cf9fff6c0 Level-0 table #270: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.810987 7f276ffff6c0 Delete type=0 #223 | 2025/09/24-16:43:46.141584 7f7cf9fff6c0 Delete type=0 #268 | ||||||
| 2025/07/09-18:03:48.830569 7f276ffff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:46.208949 7f7cf9fff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.314387 7f07937fe6c0 Recovering log #216 | 2025/09/24-16:34:06.434181 7f7cfb7fe6c0 Recovering log #261 | ||||||
| 2025/07/02-23:06:08.375793 7f07937fe6c0 Delete type=3 #214 | 2025/09/24-16:34:06.444000 7f7cfb7fe6c0 Delete type=3 #259 | ||||||
| 2025/07/02-23:06:08.375871 7f07937fe6c0 Delete type=0 #216 | 2025/09/24-16:34:06.444067 7f7cfb7fe6c0 Delete type=0 #261 | ||||||
| 2025/07/02-23:08:13.539538 7f07923ff6c0 Level-0 table #221: started | 2025/09/24-16:41:30.144559 7f7cf9fff6c0 Level-0 table #266: started | ||||||
| 2025/07/02-23:08:13.539632 7f07923ff6c0 Level-0 table #221: 0 bytes OK | 2025/09/24-16:41:30.144589 7f7cf9fff6c0 Level-0 table #266: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.545699 7f07923ff6c0 Delete type=0 #219 | 2025/09/24-16:41:30.151446 7f7cf9fff6c0 Delete type=0 #264 | ||||||
| 2025/07/02-23:08:13.565250 7f07923ff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.151596 7f7cf9fff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								packs/maladies/lost/000232.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/maladies/lost/000232.log
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								packs/scenes/000210.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/scenes/000210.log
									
									
									
									
									
										Normal file
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000159 | MANIFEST-000204 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:10.009504 7f2a0dffb6c0 Recovering log #157 | 2025/09/24-16:42:14.720636 7f7cfaffd6c0 Recovering log #202 | ||||||
| 2025/07/09-17:43:10.019481 7f2a0dffb6c0 Delete type=3 #155 | 2025/09/24-16:42:14.731231 7f7cfaffd6c0 Delete type=3 #200 | ||||||
| 2025/07/09-17:43:10.019581 7f2a0dffb6c0 Delete type=0 #157 | 2025/09/24-16:42:14.731304 7f7cfaffd6c0 Delete type=0 #202 | ||||||
| 2025/07/09-18:03:48.823612 7f276ffff6c0 Level-0 table #162: started | 2025/09/24-16:43:46.141700 7f7cf9fff6c0 Level-0 table #207: started | ||||||
| 2025/07/09-18:03:48.823646 7f276ffff6c0 Level-0 table #162: 0 bytes OK | 2025/09/24-16:43:46.141727 7f7cf9fff6c0 Level-0 table #207: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.830454 7f276ffff6c0 Delete type=0 #160 | 2025/09/24-16:43:46.208754 7f7cf9fff6c0 Delete type=0 #205 | ||||||
| 2025/07/09-18:03:48.830610 7f276ffff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:46.208965 7f7cf9fff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.461850 7f0792ffd6c0 Recovering log #153 | 2025/09/24-16:34:06.459217 7f7d00dfa6c0 Recovering log #198 | ||||||
| 2025/07/02-23:06:08.557282 7f0792ffd6c0 Delete type=3 #151 | 2025/09/24-16:34:06.469315 7f7d00dfa6c0 Delete type=3 #196 | ||||||
| 2025/07/02-23:06:08.557355 7f0792ffd6c0 Delete type=0 #153 | 2025/09/24-16:34:06.469408 7f7d00dfa6c0 Delete type=0 #198 | ||||||
| 2025/07/02-23:08:13.559253 7f07923ff6c0 Level-0 table #158: started | 2025/09/24-16:41:30.137845 7f7cf9fff6c0 Level-0 table #203: started | ||||||
| 2025/07/02-23:08:13.559274 7f07923ff6c0 Level-0 table #158: 0 bytes OK | 2025/09/24-16:41:30.137895 7f7cf9fff6c0 Level-0 table #203: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.565147 7f07923ff6c0 Delete type=0 #156 | 2025/09/24-16:41:30.144438 7f7cf9fff6c0 Delete type=0 #201 | ||||||
| 2025/07/02-23:08:13.565275 7f07923ff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.151581 7f7cf9fff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								packs/scenes/lost/000169.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/scenes/lost/000169.log
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								packs/simples/000274.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/simples/000274.log
									
									
									
									
									
										Normal file
									
								
							| @@ -1 +1 @@ | |||||||
| MANIFEST-000223 | MANIFEST-000268 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/09-17:43:09.996493 7f2a0d7fa6c0 Recovering log #221 | 2025/09/24-16:42:14.708014 7f7d00dfa6c0 Recovering log #266 | ||||||
| 2025/07/09-17:43:10.006963 7f2a0d7fa6c0 Delete type=3 #219 | 2025/09/24-16:42:14.717668 7f7d00dfa6c0 Delete type=3 #264 | ||||||
| 2025/07/09-17:43:10.007040 7f2a0d7fa6c0 Delete type=0 #221 | 2025/09/24-16:42:14.717743 7f7d00dfa6c0 Delete type=0 #266 | ||||||
| 2025/07/09-18:03:48.817353 7f276ffff6c0 Level-0 table #226: started | 2025/09/24-16:43:45.963524 7f7cf9fff6c0 Level-0 table #271: started | ||||||
| 2025/07/09-18:03:48.817401 7f276ffff6c0 Level-0 table #226: 0 bytes OK | 2025/09/24-16:43:45.963550 7f7cf9fff6c0 Level-0 table #271: 0 bytes OK | ||||||
| 2025/07/09-18:03:48.823494 7f276ffff6c0 Delete type=0 #224 | 2025/09/24-16:43:46.011489 7f7cf9fff6c0 Delete type=0 #269 | ||||||
| 2025/07/09-18:03:48.830589 7f276ffff6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end) | 2025/09/24-16:43:46.208919 7f7cf9fff6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 2025/07/02-23:06:08.378229 7f0793fff6c0 Recovering log #216 | 2025/09/24-16:34:06.445870 7f7cfaffd6c0 Recovering log #262 | ||||||
| 2025/07/02-23:06:08.459001 7f0793fff6c0 Delete type=3 #214 | 2025/09/24-16:34:06.456672 7f7cfaffd6c0 Delete type=3 #260 | ||||||
| 2025/07/02-23:06:08.459067 7f0793fff6c0 Delete type=0 #216 | 2025/09/24-16:34:06.456727 7f7cfaffd6c0 Delete type=0 #262 | ||||||
| 2025/07/02-23:08:13.552198 7f07923ff6c0 Level-0 table #222: started | 2025/09/24-16:41:30.131456 7f7cf9fff6c0 Level-0 table #267: started | ||||||
| 2025/07/02-23:08:13.552225 7f07923ff6c0 Level-0 table #222: 0 bytes OK | 2025/09/24-16:41:30.131488 7f7cf9fff6c0 Level-0 table #267: 0 bytes OK | ||||||
| 2025/07/02-23:08:13.559173 7f07923ff6c0 Delete type=0 #220 | 2025/09/24-16:41:30.137659 7f7cf9fff6c0 Delete type=0 #265 | ||||||
| 2025/07/02-23:08:13.565269 7f07923ff6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end) | 2025/09/24-16:41:30.151571 7f7cf9fff6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								packs/simples/lost/000233.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs/simples/lost/000233.log
									
									
									
									
									
										Normal file
									
								
							| @@ -40,30 +40,35 @@ | |||||||
|       <div class="grid grid-2col"> |       <div class="grid grid-2col"> | ||||||
|  |  | ||||||
|         <div> |         <div> | ||||||
|         <ul class="item-list alternate-list"> |           <ul class="item-list alternate-list"> | ||||||
|           {{#each caracList as |char key|}} |             {{#each caracList as |char key|}} | ||||||
|           <li class="item flexrow list-item carac-box"> |             <li class="item flexrow list-item carac-box"> | ||||||
|             <img class="sheet-competence-img" src="systems/fvtt-te-deum/images/icons/{{key}}.webp" /> |               <img class="sheet-competence-img" src="systems/fvtt-te-deum/images/icons/{{key}}.webp" /> | ||||||
|             <label class="item-left-pad item-field item-field-label-medium" data-tooltip="{{char.description}}">{{char.name}}</label> |               <label class="item-left-pad item-field item-field-label-medium" | ||||||
|             <select type="text" class="input-numeric-short" name="system.caracteristiques.{{key}}.value" |                 data-tooltip="{{char.description}}">{{char.name}}</label> | ||||||
|               data-dtype="Number" /> |               <select type="text" class="input-numeric-short" name="system.caracteristiques.{{key}}.value" | ||||||
|             {{selectOptions @root.config.descriptionValeur selected=char.value labelAttr="valeur"}} |                 data-dtype="Number" /> | ||||||
|             </select> |               {{selectOptions @root.config.descriptionValeur selected=char.value labelAttr="valeur"}} | ||||||
|             <label class="item-field item-field-label-medium">{{char.qualite}}</label> |               </select> | ||||||
|             <label class="item-field item-field-label-medium">{{char.dice}} ({{char.negativeDice}})</label> |               <label class="item-field item-field-label-medium">{{char.qualite}}</label> | ||||||
|           </li> |               <label class="item-field item-field-label-medium">{{char.dice}} ({{char.negativeDice}})</label> | ||||||
|           {{/each}} |             </li> | ||||||
|         </ul> |             {{/each}} | ||||||
|  |           </ul> | ||||||
|  |  | ||||||
|         <div> |           <div> | ||||||
|           <h4>Malus de santé : {{santeModifier}} niveaux</h4> |             <h4>Malus de santé : {{santeModifier}} niveaux</h4> | ||||||
|         </div> |           </div> | ||||||
|  |  | ||||||
|         <ul class="item-list alternate-list"> |           <ul class="item-list alternate-list"> | ||||||
|             <li class="item flexrow list-item items-title-bg"> |             <li class="item flexrow list-item items-title-bg"> | ||||||
|               <span class="item-field-title-long"> |               <span class="item-field-title-long"> | ||||||
|                 <h3><label class="item-field-label-long">Blessures</label></h3> |                 <h3><label class="item-field-label-long">Blessures</label></h3> | ||||||
|               </span> |               </span> | ||||||
|  |               <div class="item-controls item-controls-fixed"> | ||||||
|  |                 <a class="item-control blessure-add" data-type="blessure" title="Ajouter une Blessure"><i class="fas fa-plus"></i></a> | ||||||
|  |               </div> | ||||||
|  |  | ||||||
|             </li> |             </li> | ||||||
|             {{#each blessures as |blessure key|}} |             {{#each blessures as |blessure key|}} | ||||||
|             <li class="item flexrow list-item list-item-shadow item-id" data-item-id="{{blessure._id}}"> |             <li class="item flexrow list-item list-item-shadow item-id" data-item-id="{{blessure._id}}"> | ||||||
| @@ -140,7 +145,8 @@ | |||||||
|         <div> |         <div> | ||||||
|           <ul class="item-list alternate-list"> |           <ul class="item-list alternate-list"> | ||||||
|             <li class="item flexrow list-item carac-box"> |             <li class="item flexrow list-item carac-box"> | ||||||
|               <label class="item-left-pad  item-field item-field-label-medium" data-tooltip="{{providence.description}}">Providence</label> |               <label class="item-left-pad  item-field item-field-label-medium" | ||||||
|  |                 data-tooltip="{{providence.description}}">Providence</label> | ||||||
|               <select type="text" class="input-numeric-short" name="system.providence.value" data-dtype="Number" /> |               <select type="text" class="input-numeric-short" name="system.providence.value" data-dtype="Number" /> | ||||||
|               {{selectOptions @root.config.providence selected=providence.value nameAttr="value" valueAttr="value" |               {{selectOptions @root.config.providence selected=providence.value nameAttr="value" valueAttr="value" | ||||||
|               labelAttr="value"}} |               labelAttr="value"}} | ||||||
| @@ -149,16 +155,21 @@ | |||||||
|               <label class="item-field item-field-label-short">{{providence.dice}}</label> |               <label class="item-field item-field-label-short">{{providence.dice}}</label> | ||||||
|             </li> |             </li> | ||||||
|             <li class="item flexrow list-item carac-box"> |             <li class="item flexrow list-item carac-box"> | ||||||
|               <label class="item-left-pad item-field item-field-label-medium" data-tooltip=" La Bienveillance n’est pas à proprement parler une compétence : il s’agit de l’évaluation chiffrée de l'atta- chement que l'ange gardien du personnage éprouve pour son protégé. Cet attachement peut se détériorer si le personnage se montre indigne ou mauvais, et s'érode avec l’âge. La Bienveillance a un score initial de 10 pour un nouveau PJ ayant moins de 30 ans."> |               <label class="item-left-pad item-field item-field-label-medium" | ||||||
|  |                 data-tooltip=" La Bienveillance n’est pas à proprement parler une compétence : il s’agit de l’évaluation chiffrée de l'atta- chement que l'ange gardien du personnage éprouve pour son protégé. Cet attachement peut se détériorer si le personnage se montre indigne ou mauvais, et s'érode avec l’âge. La Bienveillance a un score initial de 10 pour un nouveau PJ ayant moins de 30 ans."> | ||||||
|                 Bienveillance</label> |                 Bienveillance</label> | ||||||
|               <input class="input-numeric-short" type="text" name="system.bienveillance.value" value="{{system.bienveillance.value}}" data-dtype="Number" /> |               <input class="input-numeric-short" type="text" name="system.bienveillance.value" | ||||||
|  |                 value="{{system.bienveillance.value}}" data-dtype="Number" /> | ||||||
|               <label class="item-left-pad item-field item-field-label-medium">Bonus dégats</label> |               <label class="item-left-pad item-field item-field-label-medium">Bonus dégats</label> | ||||||
|               <input class="input-numeric-short" type="text" value="{{bonusDegats.label}}" disabled data-dtype="Number" /> |               <input class="input-numeric-short" type="text" value="{{bonusDegats.value}}" disabled | ||||||
|  |                 data-dtype="Number" /> | ||||||
|             </li> |             </li> | ||||||
|             <li class="item flexrow list-item carac-box"> |             <li class="item flexrow list-item carac-box"> | ||||||
|               <label class="item-left-pad item-field item-field-label-medium">Armures Lourdes</label> |               <label class="item-left-pad item-field item-field-label-medium">Armures Lourdes</label> | ||||||
|               <input class="input-numeric-short" type="text" value="{{nbArmuresLourdes}}" disabled data-dtype="Number" /> /  |               <input class="input-numeric-short" type="text" value="{{nbArmuresLourdes}}" disabled | ||||||
|               <input class="input-numeric-short" type="text" value="{{pointsArmuresLourdes.value}}" disabled data-dtype="Number" /> |                 data-dtype="Number" /> /  | ||||||
|  |               <input class="input-numeric-short" type="text" value="{{pointsArmuresLourdes.value}}" disabled | ||||||
|  |                 data-dtype="Number" /> | ||||||
|               <label class="item-left-pad item-field item-field-label-medium">Actions/Tour</label> |               <label class="item-left-pad item-field item-field-label-medium">Actions/Tour</label> | ||||||
|               <input class="input-numeric-short" type="text" value="{{nbActions.value}}" disabled data-dtype="Number" /> |               <input class="input-numeric-short" type="text" value="{{nbActions.value}}" disabled data-dtype="Number" /> | ||||||
|             </li> |             </li> | ||||||
| @@ -172,7 +183,7 @@ | |||||||
|               <div class="item-filler"> </div> |               <div class="item-filler"> </div> | ||||||
|               <div class="item-controls item-controls-fixed"> |               <div class="item-controls item-controls-fixed"> | ||||||
|                 <a class="item-control item-add" data-type="grace" title="Créer une Grâce"><i |                 <a class="item-control item-add" data-type="grace" title="Créer une Grâce"><i | ||||||
|                   class="fas fa-plus"></i></a> |                     class="fas fa-plus"></i></a> | ||||||
|               </div> |               </div> | ||||||
|             </li> |             </li> | ||||||
|             {{#each graces as |grace key|}} |             {{#each graces as |grace key|}} | ||||||
| @@ -206,17 +217,18 @@ | |||||||
|           <label class="item-field item-field-label-short">{{carac.value}}</label> |           <label class="item-field item-field-label-short">{{carac.value}}</label> | ||||||
|           <label class="item-field-xp ">{{carac.dice}} (xp : |           <label class="item-field-xp ">{{carac.dice}} (xp : | ||||||
|             {{#if @root.isGM}} |             {{#if @root.isGM}} | ||||||
|             <input class="input-numeric-short" type="text" name="system.caracteristiques.{{key}}.experience" value="{{carac.experience}}" data-dtype="Number" /> |             <input class="input-numeric-short" type="text" name="system.caracteristiques.{{key}}.experience" | ||||||
|  |               value="{{carac.experience}}" data-dtype="Number" /> | ||||||
|             {{else}} |             {{else}} | ||||||
|             {{carac.experience}}) |             {{carac.experience}}) | ||||||
|             {{/if}} |             {{/if}} | ||||||
|             ) |             ) | ||||||
|           </label> |           </label> | ||||||
|           <div class="item-filler"> </div> |           <div class="item-filler"> </div> | ||||||
|             <div class="item-controls item-controls-fixed"> |           <div class="item-controls item-controls-fixed"> | ||||||
|               <a class="item-control competence-add" data-type="competence" data-carac-key="{{key}}" title="Ajouter une Compétence"><i |             <a class="item-control competence-add" data-type="competence" data-carac-key="{{key}}" | ||||||
|                 class="fas fa-plus"></i></a> |               title="Ajouter une Compétence"><i class="fas fa-plus"></i></a> | ||||||
|             </div> |           </div> | ||||||
|         </li> |         </li> | ||||||
|         <ul class="ul-level1 flexrow item-list"> |         <ul class="ul-level1 flexrow item-list"> | ||||||
|           {{#each carac.competences as |comp skillkey|}} |           {{#each carac.competences as |comp skillkey|}} | ||||||
| @@ -267,11 +279,13 @@ | |||||||
|           </span> |           </span> | ||||||
|           <span class="item-field-label-medium">{{upperFirst arme.system.typeArme}}</span> |           <span class="item-field-label-medium">{{upperFirst arme.system.typeArme}}</span> | ||||||
|           <span class="item-field-label-medium">{{upperFirst arme.system.competence}}</span> |           <span class="item-field-label-medium">{{upperFirst arme.system.competence}}</span> | ||||||
|           <span class="item-field-label-medium"><a class="roll-degats" data-arme-id="{{arme._id}}">{{arme.system.degats}}</a></span> |           <span class="item-field-label-medium"><a class="roll-degats" | ||||||
|  |               data-arme-id="{{arme._id}}">{{arme.system.degats}}</a></span> | ||||||
|  |  | ||||||
|           <div class="item-filler"> </div> |           <div class="item-filler"> </div> | ||||||
|           <div class="item-controls item-controls-fixed-full"> |           <div class="item-controls item-controls-fixed-full"> | ||||||
|             <a class="item-control item-equip" title="Equiper" {{#unless arme.system.equipe}}style="color:gray;"{{/unless}}> |             <a class="item-control item-equip" title="Equiper" {{#unless arme.system.equipe}}style="color:gray;" | ||||||
|  |               {{/unless}}> | ||||||
|               <i class="fas fa-shield-alt"></i> |               <i class="fas fa-shield-alt"></i> | ||||||
|             </a> |             </a> | ||||||
|             <a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a> |             <a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a> | ||||||
| @@ -297,7 +311,8 @@ | |||||||
|  |  | ||||||
|           <div class="item-filler"> </div> |           <div class="item-filler"> </div> | ||||||
|           <div class="item-controls item-controls-fixed-full"> |           <div class="item-controls item-controls-fixed-full"> | ||||||
|             <a class="item-control item-equip" title="Equiper" {{#unless armure.system.equipe}}style="color:gray;"{{/unless}}> |             <a class="item-control item-equip" title="Equiper" {{#unless armure.system.equipe}}style="color:gray;" | ||||||
|  |               {{/unless}}> | ||||||
|               <i class="fas fa-shield-alt"></i> |               <i class="fas fa-shield-alt"></i> | ||||||
|             </a> |             </a> | ||||||
|             <a class="item-control item-edit" title="Editer l'armure"><i class="fas fa-edit"></i></a> |             <a class="item-control item-edit" title="Editer l'armure"><i class="fas fa-edit"></i></a> | ||||||
| @@ -318,12 +333,12 @@ | |||||||
|             <h4 class="center">{{loc.score.min}}-{{loc.score.max}}. {{loc.label}}</h4> |             <h4 class="center">{{loc.score.min}}-{{loc.score.max}}. {{loc.label}}</h4> | ||||||
|             <div class="flexcol"> |             <div class="flexcol"> | ||||||
|               {{#each loc.armures as |armure idx| }} |               {{#each loc.armures as |armure idx| }} | ||||||
|                 <span>{{armure.name}} ({{armure.system.protection}})</span> |               <span>{{armure.name}} ({{armure.system.protection}})</span> | ||||||
|               {{/each}} |               {{/each}} | ||||||
|               <span>Touché : {{touche}}</span> |               <span>Touché : {{touche}}</span> | ||||||
|               <span>Blessures : </span> |               <span>Blessures : </span> | ||||||
|               {{#each loc.blessures as |blessure idx| }} |               {{#each loc.blessures as |blessure idx| }} | ||||||
|                 <span>{{blessure.name}} ({{blessure.malus}})</span> |               <span>{{blessure.name}} ({{blessure.malus}})</span> | ||||||
|               {{/each}} |               {{/each}} | ||||||
|             </div> |             </div> | ||||||
|           </div> |           </div> | ||||||
| @@ -397,8 +412,7 @@ | |||||||
|           </span> |           </span> | ||||||
|           <div class="item-filler"> </div> |           <div class="item-filler"> </div> | ||||||
|           <div class="item-controls item-controls-fixed"> |           <div class="item-controls item-controls-fixed"> | ||||||
|             <a class="item-control item-add" data-type="simple" title="Créer une simple"><i |             <a class="item-control item-add" data-type="simple" title="Créer une simple"><i class="fas fa-plus"></i></a> | ||||||
|                 class="fas fa-plus"></i></a> |  | ||||||
|           </div> |           </div> | ||||||
|         </li> |         </li> | ||||||
|         {{#each simples as |simple key|}} |         {{#each simples as |simple key|}} | ||||||
| @@ -415,7 +429,7 @@ | |||||||
|           </div> |           </div> | ||||||
|         </li> |         </li> | ||||||
|         {{/each}} |         {{/each}} | ||||||
|         </ul> |       </ul> | ||||||
|  |  | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
| @@ -428,7 +442,7 @@ | |||||||
|             <li class="item flexrow"> |             <li class="item flexrow"> | ||||||
|               <label class="item-name-label-medium">Genre</label> |               <label class="item-name-label-medium">Genre</label> | ||||||
|               <select type="text" class="" name="system.genre" value="{{system.genre}}" data-dtype="String" /> |               <select type="text" class="" name="system.genre" value="{{system.genre}}" data-dtype="String" /> | ||||||
|                 {{selectOptions @root.config.genre selected=system.genre}} |               {{selectOptions @root.config.genre selected=system.genre}} | ||||||
|               </select> |               </select> | ||||||
|             </li> |             </li> | ||||||
|             <li class="item flexrow"> |             <li class="item flexrow"> | ||||||
| @@ -438,8 +452,7 @@ | |||||||
|             </li> |             </li> | ||||||
|             <li class="item flexrow"> |             <li class="item flexrow"> | ||||||
|               <label class="item-name-label-medium">Age</label> |               <label class="item-name-label-medium">Age</label> | ||||||
|               <input type="text" class="" name="system.age" value="{{system.age}}" |               <input type="text" class="" name="system.age" value="{{system.age}}" data-dtype="String" /> | ||||||
|                 data-dtype="String" /> |  | ||||||
|             </li> |             </li> | ||||||
|             <li class="item flexrow"> |             <li class="item flexrow"> | ||||||
|               <label class="item-name-label-medium">Date de Naissance</label> |               <label class="item-name-label-medium">Date de Naissance</label> | ||||||
| @@ -462,8 +475,7 @@ | |||||||
|             </li> |             </li> | ||||||
|             <li class="item flexrow"> |             <li class="item flexrow"> | ||||||
|               <label class="item-name-label-medium">Religion</label> |               <label class="item-name-label-medium">Religion</label> | ||||||
|               <input type="text" class="" name="system.religion" value="{{system.religion}}" |               <input type="text" class="" name="system.religion" value="{{system.religion}}" data-dtype="String" /> | ||||||
|                 data-dtype="String" /> |  | ||||||
|             </li> |             </li> | ||||||
|           </ul> |           </ul> | ||||||
|         </div> |         </div> | ||||||
|   | |||||||
| @@ -5,27 +5,95 @@ | |||||||
|   <h4 class="chat-actor-name">{{alias}}</h4> |   <h4 class="chat-actor-name">{{alias}}</h4> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|   <hr> | <hr> | ||||||
|  |  | ||||||
|   {{#if img}} | {{#if img}} | ||||||
|   <div > | <div> | ||||||
|     <img class="chat-icon" src="{{img}}" alt="{{name}}" /> |   <img class="chat-icon" src="{{img}}" alt="{{name}}" /> | ||||||
|   </div> | </div> | ||||||
|   {{/if}} | {{/if}} | ||||||
|  |  | ||||||
|   <div class="flexcol"> | <div class="flexcol"> | ||||||
|     </div> | </div> | ||||||
|  |  | ||||||
|     <div> | <div> | ||||||
|       <ul> |   <ul> | ||||||
|         {{#if blessure}} |     <li><strong>{{alias}}</strong> attaque <strong>{{defenderName}}</strong></li> | ||||||
|         <li>{{defenderName}} a subi une blessure!</li> |  | ||||||
|         <li>Gravité : {{blessure.name}}</li> |  | ||||||
|         <li>Localisation : {{loc.label}}</li> |  | ||||||
|         {{else}} |  | ||||||
|         <li>Aucune blessure subie par {{defenderName}}</li> |  | ||||||
|         {{/if}}         |  | ||||||
|       </ul> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|   </div> |     {{#if arme}} | ||||||
|  |     <li><label class="chat-weapon-name">Dégats {{arme.name}} : {{degats}} ({{degatsFormula}})</label></li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if loc}} | ||||||
|  |     <li>Localisation : {{loc.label}}</li> | ||||||
|  |     <li>Touché : {{touche}}</li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if gantelet}} | ||||||
|  |     <li>Poing avec gantelet: +1 dégat</li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if isChargeAPied}} | ||||||
|  |     <li>Charge à pied (+Course)</li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if isChargeACheval}} | ||||||
|  |     <li>Charge à cheval (+Equitation)</li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if isReussiteCritique}} | ||||||
|  |     <li><strong class="chat-result-success">Réussite critique : La blessure a été augmentée d'un niveau</strong></li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if blessure}} | ||||||
|  |     <li><strong>{{defenderName}} a subi une blessure!</strong></li> | ||||||
|  |     <li>Gravité : {{blessure.name}}</li> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     {{#if (eq loc.categorie "tete")}} | ||||||
|  |     {{#if (gt blessure.system.value 0)}} | ||||||
|  |     <li><strong class="chat-result-warning">{{defenderName}} doit réussir un test d'Endurance de difficulté 7 ou être | ||||||
|  |         assommé</strong></li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if (eq loc.categorie "bras")}} | ||||||
|  |     {{#if (gt blessure.system.value 2)}} | ||||||
|  |     <li><strong class="chat-result-warning">{{defenderName}} lache l'objet tenu par son bras. Il doit faire un test | ||||||
|  |         d'endurance | ||||||
|  |         pour l'utiliser désormais.</strong></li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if (eq loc.categorie "jambe")}} | ||||||
|  |     {{#if (gt blessure.system.value 2)}} | ||||||
|  |     <li><strong class="chat-result-warning">{{defenderName}} tombe au sol. Pour se relever et marcher, il doit réussir | ||||||
|  |         un test | ||||||
|  |         d'Endurance à chaque tour. | ||||||
|  |       </strong></li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if (eq loc.categorie "main")}} | ||||||
|  |     {{#if (gt blessure.system.value 1)}} | ||||||
|  |     <li><strong class="chat-result-warning">{{defenderName}} lache l'objet tenu par sa main. Il doit faire un test | ||||||
|  |         d'endurance | ||||||
|  |         pour l'utiliser désormais.</strong></li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if (eq loc.categorie "pied")}} | ||||||
|  |     {{#if (gt blessure.system.value 1)}} | ||||||
|  |     <li><strong class="chat-result-warning">{{defenderName}} tombe au sol. Pour se relever et marcher, il doit réussir | ||||||
|  |         un test | ||||||
|  |         d'Endurance à chaque tour. | ||||||
|  |       </strong></li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     {{else}} | ||||||
|  |     <li>Aucune blessure subie par {{defenderName}}</li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |   </ul> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  | </div> | ||||||
| @@ -5,19 +5,34 @@ | |||||||
|   <h4 class="chat-actor-name">{{alias}}</h4> |   <h4 class="chat-actor-name">{{alias}}</h4> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|   <hr> | <hr> | ||||||
|  |  | ||||||
|   {{#if img}} | {{#if img}} | ||||||
|   <div > | <div> | ||||||
|     <img class="chat-icon" src="{{arme.img}}" alt="{{name}}" /> |   <img class="chat-icon" src="{{arme.img}}" alt="{{name}}" /> | ||||||
|   </div> | </div> | ||||||
|   {{/if}} | {{/if}} | ||||||
|  |  | ||||||
|     <div> | <div> | ||||||
|       <ul> |   <ul> | ||||||
|         <li>Dégats de {{arme.name}}: {{formula}} </li> |     <li>Dégats de {{arme.name}}: {{formula}} </li> | ||||||
|         <li>Dégats infligés : {{degats}}</li> |     {{#if gantelet}} | ||||||
|       </ul> |     <li>Poing avec gantelet: +1 dégat</li> | ||||||
|     </div> |     {{/if}} | ||||||
|  |     {{#if isChargeAPied}} | ||||||
|  |     <li>Charge à pied (+Course)</li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if isChargeACheval}} | ||||||
|  |     <li>Charge à cheval (+Equitation)</li> | ||||||
|  |     {{/if}} | ||||||
|  |     <li>Dégats infligés : {{degats}}</li> | ||||||
|  |     {{#if loc}} | ||||||
|  |     <li>Localisation : {{loc.label}}</li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if isReussiteCritique}} | ||||||
|  |     <li><strong class="chat-result-success">Réussite critique : La blessure sera augmentée d'un niveau</strong></li> | ||||||
|  |     {{/if}} | ||||||
|  |   </ul> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|   </div> | </div> | ||||||
| @@ -5,92 +5,130 @@ | |||||||
|   <h4 class="chat-actor-name">{{alias}}</h4> |   <h4 class="chat-actor-name">{{alias}}</h4> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|   <hr> | <hr> | ||||||
|  |  | ||||||
|   {{#if img}} | {{#if img}} | ||||||
|   <div > | <div> | ||||||
|     <img class="chat-icon" src="{{img}}" alt="{{name}}" /> |   <img class="chat-icon" src="{{img}}" alt="{{name}}" /> | ||||||
|   </div> | </div> | ||||||
|   {{/if}} | {{/if}} | ||||||
|  |  | ||||||
|   <div class="flexcol"> | <div class="flexcol"> | ||||||
|     </div> | </div> | ||||||
|  |  | ||||||
|     <div> | <div> | ||||||
|       <ul> |   <ul> | ||||||
|         {{#if carac}} |     {{#if carac}} | ||||||
|           <li>{{carac.name}}: {{carac.qualite}} ({{carac.dice}}) </li> |     <li>{{carac.name}}: {{carac.qualite}} ({{carac.dice}}) </li> | ||||||
|         {{/if}} |     {{/if}} | ||||||
|         {{#if competence}} |     {{#if competence}} | ||||||
|           <li>{{competence.name}}: {{compScore}} </li> |     <li>{{competence.name}}: {{compScore}} </li> | ||||||
|         {{/if}} |     {{/if}} | ||||||
|         {{#if bonusMalus}} |     {{#if bonusMalus}} | ||||||
|           <li>Bonus/Malus: {{bonusMalus}} </li> |     <li>Bonus/Malus: {{bonusMalus}} </li> | ||||||
|         {{/if}} |     {{/if}} | ||||||
|         {{#if santeModifier}} |     {{#if santeModifier}} | ||||||
|           <li>Santé: {{santeModifier}} niveaux</li> |     <li>Santé: {{santeModifier}} niveaux</li> | ||||||
|         {{/if}} |     {{/if}} | ||||||
|         {{#if enableProvidence}} |     {{#if enableProvidence}} | ||||||
|           <li>Un niveau de Providence a été utilisé !</li> |     <li>Un niveau de Providence a été utilisé !</li> | ||||||
|         {{/if}} |     {{/if}} | ||||||
|         {{#if isViser}} |  | ||||||
|           <li>Bonus de visée (+1 niveau)</li> |  | ||||||
|         {{/if}} |  | ||||||
|         {{#if isMouvement}} |  | ||||||
|           <li>Malus de cible petite ou en mouvement (-1 niveau)</li> |  | ||||||
|         {{/if}} |  | ||||||
|  |  | ||||||
|         <li>Dés: {{diceFormula}} </li> |     {{#if hasActions}} | ||||||
|         {{#if isTir}} |     <li data-tooltip="Nombre d'actions restantes, avec MG = Main Gauche">Actions restantes: {{remainingActions}} | ||||||
|           <li>Portée: {{porteeLabel}} ( {{difficulty}} )</li> |       (MG:{{remainingActionsMainGauche}})</li> | ||||||
|         {{else}} |     {{/if}} | ||||||
|           <li>Difficulté: {{difficulty}} </li> |  | ||||||
|         {{/if}} |  | ||||||
|  |  | ||||||
|       </ul> |     {{#if arme}} | ||||||
|     </div> |     {{#if isViser}} | ||||||
|  |     <li>Bonus de visée (+1 niveau)</li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if isMouvement}} | ||||||
|  |     <li>Malus de cible petite ou en mouvement (-1 niveau)</li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if attaqueCiblee}} | ||||||
|  |     <li>Attaque ciblée, -1 niveau</li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{#if allongeMalus}} | ||||||
|  |     <li>Malus d'allonge: {{allongeMalus}} niveau</li> | ||||||
|  |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|     <div class="flexrow"> |     <li>Dés: {{diceFormula}} </li> | ||||||
|       <ul class="chat-result-column"> |     {{#if isTir}} | ||||||
|         <li><strong>Résultat: {{total}}</strong> </li> |     <li>Portée: {{porteeLabel}} ( {{difficulty}} )</li> | ||||||
|         {{#if isSuccess}} |     {{else}} | ||||||
|         <li><strong class="chat-result-success">Succès !</strong> </li> |     <li>Difficulté: {{difficulty}} </li> | ||||||
|           {{#if isReussiteCritique}} |     {{/if}} | ||||||
|           <li><strong class="chat-result-success">Réussite critique ! 1 XP gagné en {{carac.name}}.</strong> </li> |  | ||||||
|           {{/if}} |  | ||||||
|  |  | ||||||
|           {{#if arme}} |   </ul> | ||||||
|           <li><strong class="">Attaque réussie ! Faites une opposition avec la défense de la cible ou appliquez directement les dégats.</strong> </li> | </div> | ||||||
|           {{/if}} |  | ||||||
|  |  | ||||||
|         {{else}} | <div class="flexrow"> | ||||||
|           <li><strong class="chat-result-failure">Echec !</strong> </li> |   <ul class="chat-result-column"> | ||||||
|           {{#if isEchecCritique}} |     <li><strong>Résultat: {{total}}</strong> </li> | ||||||
|             <li><strong class="chat-result-failure">Echec critique ! 1 XP gagné en {{carac.name}}.</strong> </li> |     {{#if isSuccess}} | ||||||
|           {{/if}} |     <li><strong class="chat-result-success">Succès !</strong> </li> | ||||||
|         {{/if}} |     {{#if isReussiteCritique}} | ||||||
|  |     <li data-tooltip="Si le jet n'est pas opposé, cliquez sur le bouton pour gagner 1 XP gagné en {{carac.name}}"> | ||||||
|  |       <strong class="chat-result-success">Réussite critique (XP potentiel) !</strong> | ||||||
|  |     </li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|         {{#if loc}} |     {{#if arme}} | ||||||
|         <li><strong>Attaque réussie !!</strong> </li> |     <li><strong class="">Attaque réussie ! Faites une opposition avec la défense de la cible ou appliquez directement | ||||||
|         <li>Localisation: {{loc.label}} </li> |         les dégats.</strong> </li> | ||||||
|         <li>Dégats: {{degats}} {{#if isReussiteCritique}}(Augmentez la gravité de la blessure d'un niveau){{/if}}</li> |     {{/if}} | ||||||
|         {{/if}} |  | ||||||
|       </ul> |  | ||||||
|       <div> |  | ||||||
|         <a class="chat-command-opposition" > |  | ||||||
|           <img class="chat-command-img" data-tooltip="Test en opposition" src="systems/fvtt-te-deum/images/icons/opposition.webp"> |  | ||||||
|         </a> |  | ||||||
|  |  | ||||||
|         {{#if arme}} |     {{else}} | ||||||
|           {{#if isSuccess}} |     <li><strong class="chat-result-failure">Echec !</strong> </li> | ||||||
|             <a class="chat-command-appliquer-degats" > |     {{#if isEchecCritique}} | ||||||
|               <img class="chat-command-img" data-tooltip="Appliquer les dégats directement sans opposition" src="systems/fvtt-te-deum/images/icons/appliquer-degats.webp"> |     <li data-tooltip="Si le jet n'est pas opposé, cliquez sur le bouton pour gagner 1 XP gagné en {{carac.name}}"> | ||||||
|             </a> |       <strong class="chat-result-failure">Echec critique (XP potentiel) !</strong> | ||||||
|           {{/if}} |     </li> | ||||||
|         {{/if}} |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if nbEsquives}} | ||||||
|  |     <li>Rappel : vous devez réussir {{nbEsquives}} tests d'esquive pour arriver au contact (règle d'allonge des armes). | ||||||
|  |     </li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if loc}} | ||||||
|  |     <li><strong>Attaque réussie !!</strong> </li> | ||||||
|  |     <li>Localisation: {{loc.label}} </li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     {{#if degats}} | ||||||
|  |     <li>Dégats: {{degats}} {{#if isReussiteCritique}}(Augmentez la gravité de la blessure d'un niveau){{/if}}</li> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |   </ul> | ||||||
|  |   <div> | ||||||
|  |  | ||||||
|  |     {{#if (or isEchecCritique isReussiteCritique)}} | ||||||
|  |     <a class="chat-command-gain-xp"> | ||||||
|  |       <img class="chat-command-img" data-tooltip="Cliquez ici pour +1 XP en {{carac.name}} si pas d'opposition" | ||||||
|  |         src="systems/fvtt-te-deum/images/icons/xpplus1.webp"> | ||||||
|  |     </a> | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|  |     <a class="chat-command-opposition"> | ||||||
|  |       <img class="chat-command-img" data-tooltip="Test en opposition" | ||||||
|  |         src="systems/fvtt-te-deum/images/icons/opposition.webp"> | ||||||
|  |     </a> | ||||||
|  |  | ||||||
|  |     {{#if arme}} | ||||||
|  |     {{#if isSuccess}} | ||||||
|  |     <a class="chat-command-appliquer-degats"> | ||||||
|  |       <img class="chat-command-img" data-tooltip="Appliquer les dégats directement sans opposition" | ||||||
|  |         src="systems/fvtt-te-deum/images/icons/appliquer-degats.webp"> | ||||||
|  |     </a> | ||||||
|  |     {{/if}} | ||||||
|  |     {{/if}} | ||||||
|  |  | ||||||
|       </div> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|   </div> |   </div> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  | </div> | ||||||
| @@ -1,15 +1,22 @@ | |||||||
| <div class="chat-message-header"> | <div class="chat-message-header"> | ||||||
|  |  | ||||||
|   <img class="actor-icon" src="{{winner.actorImg}}" alt="{{winner.alias}}" /> |   <img class="actor-icon" src="{{winner.actorImg}}" alt="{{winner.alias}}" /> | ||||||
|   <img class="chat-command-img" data-tooltip="Test en opposition" src="systems/fvtt-te-deum/images/icons/opposition.webp"> |   <img class="chat-command-img" data-tooltip="Test en opposition" | ||||||
|  |     src="systems/fvtt-te-deum/images/icons/opposition.webp"> | ||||||
|   <img class="actor-icon" src="{{looser.actorImg}}" alt="{{looser.alias}}" /> |   <img class="actor-icon" src="{{looser.actorImg}}" alt="{{looser.alias}}" /> | ||||||
|     <label class="chat-actor-name-opposition">{{winner.alias}} vs {{looser.alias}}</label> |   <label class="chat-actor-name-opposition">{{winner.alias}} vs {{looser.alias}}</label> | ||||||
|  |  | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|   <hr> | <hr> | ||||||
|  |  | ||||||
|   <div > |  | ||||||
|     <label class="chat-result-success">{{winner.alias}} ({{winner.competence.name}}, {{winner.total}}) l'emporte sur {{looser.alias}} ({{looser.competence.name}},  {{looser.total}})</label> |  | ||||||
|   </div> |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <div> | ||||||
|  |   <label class="chat-result-success">{{winner.alias}} ({{winner.competence.name}}, {{winner.total}}) l'emporte sur | ||||||
|  |     {{looser.alias}} ({{looser.competence.name}}, {{looser.total}})</label> | ||||||
|  |   {{#if winner.isReussiteCritique}} | ||||||
|  |   <div><strong class="chat-result-success">Réussite critique ! 1 XP gagné en {{winner.carac.name}}.</strong> </div> | ||||||
|  |   {{/if}} | ||||||
|  |   {{#if looser.isEchecCritique}} | ||||||
|  |   <div><strong class="chat-result-failure">Echec critique ! 1 XP gagné en {{looser.carac.name}}.</strong> </div> | ||||||
|  |   {{/if}} | ||||||
|  | </div> | ||||||
| @@ -41,28 +41,65 @@ | |||||||
|     {{/if}} |     {{/if}} | ||||||
|  |  | ||||||
|     {{#if arme}} |     {{#if arme}} | ||||||
|       {{#if isTir}} |     {{#if isTir}} | ||||||
|         <div class="flexrow"> |     <div class="flexrow"> | ||||||
|           <span class="roll-dialog-label">Portée : </span> |       <span class="roll-dialog-label">Portée : </span> | ||||||
|           <select class="" type="text" id="roll-portee-tir" value="{{porteeTir}}" data-dtype="String"> |       <select class="" type="text" id="roll-portee-tir" value="{{porteeTir}}" data-dtype="String"> | ||||||
|             {{#select porteeTir}} |         {{#select porteeTir}} | ||||||
|             {{#each config.ARME_PORTEES as |portee key|}} |         {{#each config.ARME_PORTEES as |portee key|}} | ||||||
|               <option value="{{key}}">{{portee.label}}</option> |         <option value="{{key}}">{{portee.label}}</option> | ||||||
|             {{/each}} |         {{/each}} | ||||||
|             {{/select}} |         {{/select}} | ||||||
|           </select> |       </select> | ||||||
|         </div> |     </div> | ||||||
|         <div class="flexrow"> |     <div class="flexrow"> | ||||||
|           <span class="roll-dialog-label">Viser : </span> |       <span class="roll-dialog-label">Viser : </span> | ||||||
|           <input type="checkbox" id="roll-tir-viser" {{checked isViser}} /> |       <input type="checkbox" id="roll-tir-viser" {{checked isViser}} /> | ||||||
|         </div> |     </div> | ||||||
|         <div class="flexrow"> |     <div class="flexrow"> | ||||||
|           <span class="roll-dialog-label">Cible petite/en mouvement : </span> |       <span class="roll-dialog-label">Cible petite/en mouvement : </span> | ||||||
|           <input type="checkbox" id="roll-tir-mouvement" {{checked isMouvement}} /> |       <input type="checkbox" id="roll-tir-mouvement" {{checked isMouvement}} /> | ||||||
|         </div> |     </div> | ||||||
|       {{else}} |     {{else}} | ||||||
|  |     <div class="flexrow"> | ||||||
|       {{/if}} |       <span class="roll-dialog-label">Allonge {{allongeLabel}} : Indiquez l'allonge de votre adversaire | ||||||
|  |         ci-dessous.</span> | ||||||
|  |     </div> | ||||||
|  |     <div class="flexrow"> | ||||||
|  |       <span class="roll-dialog-label" | ||||||
|  |         data-tooltip="Modification d'allonge selon votre arme et celle de votre adversaire">Allonge arme adversaire : | ||||||
|  |       </span> | ||||||
|  |       <select class="" type="text" id="roll-allonge" value="{{allongeId}}" data-dtype="String"> | ||||||
|  |         {{#select allongeId}} | ||||||
|  |         {{#each allonges as |allonge key|}} | ||||||
|  |         <option value="{{key}}">{{allonge.label}}</option> | ||||||
|  |         {{/each}} | ||||||
|  |         {{/select}} | ||||||
|  |       </select> | ||||||
|  |     </div> | ||||||
|  |     <div class="flexrow"> | ||||||
|  |       <span class="roll-dialog-label">Charge à pied ?</span> | ||||||
|  |       <input type="checkbox" id="roll-charge-a-pied" {{checked isChargeAPied}} /> | ||||||
|  |     </div> | ||||||
|  |     <div class="flexrow"> | ||||||
|  |       <span class="roll-dialog-label">Charge à cheval ?</span> | ||||||
|  |       <input type="checkbox" id="roll-charge-a-cheval" {{checked isChargeACheval}} /> | ||||||
|  |     </div> | ||||||
|  |     {{/if}} | ||||||
|  |     <div class="flexrow"> | ||||||
|  |       <span class="roll-dialog-label">Main gauche ?</span> | ||||||
|  |       <input type="checkbox" id="roll-main-gauche" {{checked isMainGauche}} /> | ||||||
|  |     </div> | ||||||
|  |     <div class="flexrow"> | ||||||
|  |       <span class="roll-dialog-label">Attaque ciblée (-1 Niveau): </span> | ||||||
|  |       <select class="" type="text" id="roll-attaque-ciblee" value="{{attaqueCiblee}}" data-dtype="String"> | ||||||
|  |         {{#select attaqueCiblee}} | ||||||
|  |         {{#each config.ATTAQUE_CIBLEES as |attaque key|}} | ||||||
|  |         <option value="{{key}}">{{attaque.label}}</option> | ||||||
|  |         {{/each}} | ||||||
|  |         {{/select}} | ||||||
|  |       </select> | ||||||
|  |     </div> | ||||||
|     {{else}} |     {{else}} | ||||||
|     <div class="flexrow"> |     <div class="flexrow"> | ||||||
|       <span class="roll-dialog-label">Difficulté : </span> |       <span class="roll-dialog-label">Difficulté : </span> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user