Compare commits
	
		
			25 Commits
		
	
	
		
			fvtt-malef
			...
			fvtt-malef
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 34db8695d7 | |||
| a109fd6acb | |||
| d647fcc35e | |||
| 342f9c2342 | |||
| cd14db85cc | |||
| ec06f0fdcb | |||
| 234bd44742 | |||
| e0df1f1ff5 | |||
| 2c92dd6ef9 | |||
| 8af5851246 | |||
| 14b536cc52 | |||
| 9944ebe64d | |||
| 165c836f39 | |||
| cb8e70c6c1 | |||
| b2a9d8cb75 | |||
| 6d75c8532c | |||
| dce8ad025b | |||
| 6e4cd71b99 | |||
| e62480efb0 | |||
| c5509143b1 | |||
| e146c6ba5b | |||
| 04039513bc | |||
| 1923a63ebf | |||
| 06537cbcd9 | |||
| 925f15627c | 
| @@ -1,5 +1,7 @@ | |||||||
| # Système Foundry pour Maléfices (French RPG, Arkhane Asylum Publishing) | # Système Foundry pour Maléfices (French RPG, Arkhane Asylum Publishing) | ||||||
|  |  | ||||||
|  | [Vue du système](https://www.lahiette.com/leratierbretonnien/wp-content/uploads/2023/02/malefices_snapshot.webp) | ||||||
|  |  | ||||||
| ## EN | ## EN | ||||||
|  |  | ||||||
| Unofficial system for Maléfices v4 (French version from Arkhane Asylum Publishing). | Unofficial system for Maléfices v4 (French version from Arkhane Asylum Publishing). | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								images/icons/.directory
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | |||||||
|  | [Dolphin] | ||||||
|  | SortRole=modificationtime | ||||||
|  | Timestamp=2023,2,26,15,32,34.892 | ||||||
|  | Version=4 | ||||||
|  | ViewMode=1 | ||||||
|  | VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails | ||||||
							
								
								
									
										
											BIN
										
									
								
								images/icons/archetype.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 31 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/equipement.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 29 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/resume.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 31 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/sortilege.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 42 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/tarot.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 38 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/tirage.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 40 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/tirer.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 40 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/icons/wisdom.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 49 KiB | 
| Before Width: | Height: | Size: 453 KiB After Width: | Height: | Size: 423 KiB | 
| Before Width: | Height: | Size: 532 KiB After Width: | Height: | Size: 488 KiB | 
| Before Width: | Height: | Size: 534 KiB After Width: | Height: | Size: 492 KiB | 
| Before Width: | Height: | Size: 590 KiB After Width: | Height: | Size: 538 KiB | 
| Before Width: | Height: | Size: 572 KiB After Width: | Height: | Size: 525 KiB | 
| Before Width: | Height: | Size: 545 KiB After Width: | Height: | Size: 494 KiB | 
| Before Width: | Height: | Size: 598 KiB After Width: | Height: | Size: 549 KiB | 
| Before Width: | Height: | Size: 523 KiB After Width: | Height: | Size: 473 KiB | 
| Before Width: | Height: | Size: 514 KiB After Width: | Height: | Size: 394 KiB | 
| Before Width: | Height: | Size: 522 KiB After Width: | Height: | Size: 482 KiB | 
| Before Width: | Height: | Size: 584 KiB After Width: | Height: | Size: 538 KiB | 
| Before Width: | Height: | Size: 591 KiB After Width: | Height: | Size: 546 KiB | 
| Before Width: | Height: | Size: 504 KiB After Width: | Height: | Size: 449 KiB | 
| Before Width: | Height: | Size: 584 KiB After Width: | Height: | Size: 537 KiB | 
| Before Width: | Height: | Size: 583 KiB After Width: | Height: | Size: 533 KiB | 
| Before Width: | Height: | Size: 563 KiB After Width: | Height: | Size: 527 KiB | 
| Before Width: | Height: | Size: 581 KiB After Width: | Height: | Size: 517 KiB | 
| Before Width: | Height: | Size: 590 KiB After Width: | Height: | Size: 531 KiB | 
| Before Width: | Height: | Size: 619 KiB After Width: | Height: | Size: 571 KiB | 
| Before Width: | Height: | Size: 564 KiB After Width: | Height: | Size: 506 KiB | 
| Before Width: | Height: | Size: 586 KiB After Width: | Height: | Size: 521 KiB | 
| Before Width: | Height: | Size: 480 KiB After Width: | Height: | Size: 437 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/tarots/background.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 50 KiB | 
							
								
								
									
										29
									
								
								lang/fr.json
									
									
									
									
									
								
							
							
						
						| @@ -1,22 +1,15 @@ | |||||||
| { | { | ||||||
|   "ACTOR": { |   "TYPES": { | ||||||
|     "TypeCharacter": "Character", |     "Actor": { | ||||||
|     "TypeNpc": "NPC" |       "personnage"  : "Personnage" | ||||||
|     }, |     }, | ||||||
|   "ITEM": { |     "Item": { | ||||||
|     "TypeWeapon": "Weapon", |       "arme"        : "Arme", | ||||||
|     "TypeShield": "Shield", |       "equipement"  : "Equipement", | ||||||
|     "TypeArmor": "Armor", |       "tarot"       : "Tarot", | ||||||
|     "TypeSpell": "Spell", |       "elementbio"  : "Elément Biographique", | ||||||
|     "TypeModule": "Module", |       "archetype"   : "Archetype", | ||||||
|     "TypeMoney": "Money", |       "sortilege"   : "Sortilège" | ||||||
|     "TypeEquipment": "Equipment", |     } | ||||||
|     "TypeAction": "Action", |  | ||||||
|     "TypeFreeaction": "Free Action", |  | ||||||
|     "TypeReaction": "Reaction", |  | ||||||
|     "TypeStance": "Stance", |  | ||||||
|     "TypeTrait": "Trait", |  | ||||||
|     "TypeCondition": "Condition", |  | ||||||
|     "TypeCraftingskill": "Crafting Skill" |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -6,16 +6,16 @@ | |||||||
| import { MaleficesUtility } from "./malefices-utility.js"; | import { MaleficesUtility } from "./malefices-utility.js"; | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| export class MaleficesActorSheet extends ActorSheet { | export class MaleficesActorSheet extends foundry.appv1.sheets.ActorSheet { | ||||||
|  |  | ||||||
|   /** @override */ |   /** @override */ | ||||||
|   static get defaultOptions() { |   static get defaultOptions() { | ||||||
|  |  | ||||||
|     return mergeObject(super.defaultOptions, { |     return foundry.utils.mergeObject(super.defaultOptions, { | ||||||
|       classes: ["fvtt-malefices", "sheet", "actor"], |       classes: ["fvtt-malefices", "sheet", "actor", "malefices-actor-sheet"], | ||||||
|       template: "systems/fvtt-malefices/templates/actors/actor-sheet.hbs", |       template: "systems/fvtt-malefices/templates/actors/actor-sheet.hbs", | ||||||
|       width: 640, |       width: 640, | ||||||
|       height: 640, |       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 | ||||||
| @@ -33,14 +33,20 @@ export class MaleficesActorSheet extends ActorSheet { | |||||||
|       name: this.actor.name, |       name: this.actor.name, | ||||||
|       editable: this.isEditable, |       editable: this.isEditable, | ||||||
|       cssClass: this.isEditable ? "editable" : "locked", |       cssClass: this.isEditable ? "editable" : "locked", | ||||||
|       system: duplicate(this.object.system), |       system: foundry.utils.duplicate(this.object.system), | ||||||
|       limited: this.object.limited, |       limited: this.object.limited, | ||||||
|       armes: duplicate(this.actor.getArmes()), |       armes: foundry.utils.duplicate(this.actor.getArmes()), | ||||||
|       tarots: duplicate(this.actor.getTarots()), |       tarots: foundry.utils.duplicate(this.actor.getTarots()), | ||||||
|       archetype: duplicate(this.actor.getArchetype()), |       tarotsCache: foundry.utils.duplicate(this.actor.getHiddenTarots()), | ||||||
|       equipements: duplicate(this.actor.getEquipements()), |       archetype: foundry.utils.duplicate(this.actor.getArchetype()), | ||||||
|       subActors: duplicate(this.actor.getSubActors()), |       equipements: foundry.utils.duplicate(this.actor.getEquipements()), | ||||||
|  |       subActors: foundry.utils.duplicate(this.actor.getSubActors()), | ||||||
|       phyMalus: this.actor.getPhysiqueMalus(), |       phyMalus: this.actor.getPhysiqueMalus(), | ||||||
|  |       elementsbio: this.actor.getElementsBio(), | ||||||
|  |       sorts: this.actor.getSorts(), | ||||||
|  |       description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, { async: true }), | ||||||
|  |       notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.notes, { async: true }), | ||||||
|  |       equipementlibre: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.equipementlibre, { async: true }), | ||||||
|       options: this.options, |       options: this.options, | ||||||
|       owner: this.document.isOwner, |       owner: this.document.isOwner, | ||||||
|       editScore: this.options.editScore, |       editScore: this.options.editScore, | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ export class MaleficesActor extends Actor { | |||||||
|     if (data instanceof Array) { |     if (data instanceof Array) { | ||||||
|       return super.create(data, options); |       return super.create(data, options); | ||||||
|     } |     } | ||||||
|     // If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic |     // If the created actor has items (only applicable to foundry.utils.duplicated actors) bypass the new actor creation logic | ||||||
|     if (data.items) { |     if (data.items) { | ||||||
|       let actor = super.create(data, options); |       let actor = super.create(data, options); | ||||||
|       return actor; |       return actor; | ||||||
| @@ -86,8 +86,13 @@ export class MaleficesActor extends Actor { | |||||||
|     MaleficesUtility.sortArrayObjectsByName(comp) |     MaleficesUtility.sortArrayObjectsByName(comp) | ||||||
|     return comp; |     return comp; | ||||||
|   } |   } | ||||||
|  |   getSorts() { | ||||||
|  |     let comp = this.items.filter(item => item.type == 'sortilege'); | ||||||
|  |     MaleficesUtility.sortArrayObjectsByName(comp) | ||||||
|  |     return comp; | ||||||
|  |   } | ||||||
|   getArchetype() { |   getArchetype() { | ||||||
|     let comp = duplicate(this.items.find(item => item.type == 'archetype') || {name: "Pas d'archetype"}) |     let comp = foundry.utils.duplicate(this.items.find(item => item.type == 'archetype') || {name: "Pas d'archetype"}) | ||||||
|     if (comp && comp.system) { |     if (comp && comp.system) { | ||||||
|       comp.tarot = MaleficesUtility.getTarot(comp.system.lametutelaire) |       comp.tarot = MaleficesUtility.getTarot(comp.system.lametutelaire) | ||||||
|     } |     } | ||||||
| @@ -95,14 +100,26 @@ export class MaleficesActor extends Actor { | |||||||
|     return comp; |     return comp; | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|  |   getElementsBio() { | ||||||
|  |     let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'elementbio') || []) | ||||||
|  |     MaleficesUtility.sortArrayObjectsByName(comp) | ||||||
|  |     return comp; | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|   getTarots() { |   getTarots() { | ||||||
|     let comp = duplicate(this.items.filter(item => item.type == 'tarot') || []) |     let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'tarot' && !item.system.isgm) || []) | ||||||
|  |     MaleficesUtility.sortArrayObjectsByName(comp) | ||||||
|  |     return comp; | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   getHiddenTarots() { | ||||||
|  |     let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'tarot' && item.system.isgm) || []) | ||||||
|     MaleficesUtility.sortArrayObjectsByName(comp) |     MaleficesUtility.sortArrayObjectsByName(comp) | ||||||
|     return comp; |     return comp; | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   getArmes() { |   getArmes() { | ||||||
|     let comp = duplicate(this.items.filter(item => item.type == 'arme') || []) |     let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'arme') || []) | ||||||
|     MaleficesUtility.sortArrayObjectsByName(comp) |     MaleficesUtility.sortArrayObjectsByName(comp) | ||||||
|     return comp; |     return comp; | ||||||
|   } |   } | ||||||
| @@ -110,7 +127,7 @@ export class MaleficesActor extends Actor { | |||||||
|   getItemById(id) { |   getItemById(id) { | ||||||
|     let item = this.items.find(item => item.id == id); |     let item = this.items.find(item => item.id == id); | ||||||
|     if (item) { |     if (item) { | ||||||
|       item = duplicate(item) |       item = foundry.utils.duplicate(item) | ||||||
|     } |     } | ||||||
|     return item; |     return item; | ||||||
|   } |   } | ||||||
| @@ -156,7 +173,7 @@ export class MaleficesActor extends Actor { | |||||||
|  |  | ||||||
|   /* ------------------------------------------- */ |   /* ------------------------------------------- */ | ||||||
|   async buildContainerTree() { |   async buildContainerTree() { | ||||||
|     let equipments = duplicate(this.items.filter(item => item.type == "equipment") || []) |     let equipments = foundry.utils.duplicate(this.items.filter(item => item.type == "equipment") || []) | ||||||
|     for (let equip1 of equipments) { |     for (let equip1 of equipments) { | ||||||
|       if (equip1.system.iscontainer) { |       if (equip1.system.iscontainer) { | ||||||
|         equip1.system.contents = [] |         equip1.system.contents = [] | ||||||
| @@ -212,22 +229,22 @@ export class MaleficesActor extends Actor { | |||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   getInitiativeScore(combatId, combatantId) { |   getInitiativeScore(combatId, combatantId) { | ||||||
|     let init = Math.floor(this.system.attributs.physique.value+this.system.attributs.habilete.value) |     let init = Math.floor( (this.system.attributs.physique.value+this.system.attributs.habilite.value) / 2) | ||||||
|     let subvalue = new Roll("1d20").roll({async: false}) |     let subvalue = new Roll("1d20").roll({async: false}) | ||||||
|     return init + (subvalue / 100) |     return init + (subvalue.total / 100) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   getSubActors() { |   getSubActors() { | ||||||
|     let subActors = []; |     let subActors = []; | ||||||
|     for (let id of this.system.subactors) { |     for (let id of this.system.subactors) { | ||||||
|       subActors.push(duplicate(game.actors.get(id))) |       subActors.push(foundry.utils.duplicate(game.actors.get(id))) | ||||||
|     } |     } | ||||||
|     return subActors; |     return subActors; | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async addSubActor(subActorId) { |   async addSubActor(subActorId) { | ||||||
|     let subActors = duplicate(this.system.subactors); |     let subActors = foundry.utils.duplicate(this.system.subactors); | ||||||
|     subActors.push(subActorId); |     subActors.push(subActorId); | ||||||
|     await this.update({ 'system.subactors': subActors }); |     await this.update({ 'system.subactors': subActors }); | ||||||
|   } |   } | ||||||
| @@ -255,7 +272,29 @@ export class MaleficesActor extends Actor { | |||||||
|       await this.createEmbeddedDocuments('Item', [newItem]); |       await this.createEmbeddedDocuments('Item', [newItem]); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   incDecFluide(value) { | ||||||
|  |     let fluide = this.system.fluide + value | ||||||
|  |     this.update( {'system.fluide': fluide} ) | ||||||
|  |   } | ||||||
|  |   incDecDestin(value) { | ||||||
|  |     let destin = this.system.pointdestin + value | ||||||
|  |     this.update( {'system.pointdestin': destin} ) | ||||||
|  |   } | ||||||
|  |   incDecMPMB(value) { | ||||||
|  |     let mpmb = this.system.mpmb + value | ||||||
|  |     this.update( {'system.mpmb': mpmb} ) | ||||||
|  |   } | ||||||
|  |   incDecMPMN(value) { | ||||||
|  |     let mpmn = this.system.mpmn + value | ||||||
|  |     this.update( {'system.mpmn': mpmn} ) | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   incDecAttr(attrKey, value) { | ||||||
|  |     let attr = foundry.utils.duplicate(this.system.attributs[attrKey]) | ||||||
|  |     attr.value += value | ||||||
|  |     this.update( { [`system.attributs.${attrKey}`]: attr})     | ||||||
|  |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async incDecQuantity(objetId, incDec = 0) { |   async incDecQuantity(objetId, incDec = 0) { | ||||||
|     let objetQ = this.items.get(objetId) |     let objetQ = this.items.get(objetId) | ||||||
| @@ -297,8 +336,12 @@ export class MaleficesActor extends Actor { | |||||||
|     rollData.actorId = this.id |     rollData.actorId = this.id | ||||||
|     rollData.img = this.img |     rollData.img = this.img | ||||||
|     rollData.phyMalus = this.getPhysiqueMalus() |     rollData.phyMalus = this.getPhysiqueMalus() | ||||||
|  |     rollData.elementsbio = this.getElementsBio() | ||||||
|     rollData.destin = this.system.pointdestin |     rollData.destin = this.system.pointdestin | ||||||
|     rollData.isReroll = false |     rollData.isReroll = false | ||||||
|  |     rollData.confrontationDegre = 0 | ||||||
|  |     rollData.confrontationModif = 0 | ||||||
|  |     rollData.config = game.system.malefices.config | ||||||
|  |  | ||||||
|     console.log("ROLLDATA", rollData) |     console.log("ROLLDATA", rollData) | ||||||
|  |  | ||||||
| @@ -316,7 +359,7 @@ export class MaleficesActor extends Actor { | |||||||
|   rollAttribut(attrKey) { |   rollAttribut(attrKey) { | ||||||
|     let attr = this.system.attributs[attrKey] |     let attr = this.system.attributs[attrKey] | ||||||
|     let rollData = this.getCommonRollData() |     let rollData = this.getCommonRollData() | ||||||
|     rollData.attr = duplicate(attr) |     rollData.attr = foundry.utils.duplicate(attr) | ||||||
|     rollData.mode = "attribut" |     rollData.mode = "attribut" | ||||||
|     rollData.title = attr.label  |     rollData.title = attr.label  | ||||||
|     rollData.img = this.getAtttributImage(attrKey) |     rollData.img = this.getAtttributImage(attrKey) | ||||||
| @@ -327,12 +370,12 @@ export class MaleficesActor extends Actor { | |||||||
|   rollArme(weaponId) { |   rollArme(weaponId) { | ||||||
|     let arme = this.items.get(weaponId) |     let arme = this.items.get(weaponId) | ||||||
|     if (arme) { |     if (arme) { | ||||||
|       arme = duplicate(arme) |       arme = foundry.utils.duplicate(arme) | ||||||
|       let rollData = this.getCommonRollData() |       let rollData = this.getCommonRollData() | ||||||
|       if (arme.system.armetype == "mainsnues" || arme.system.armetype == "epee") { |       if (arme.system.armetype == "mainsnues" || arme.system.armetype == "epee") { | ||||||
|         rollData.attr = { label: "(Physique+Habilité)/2", value: Math.floor( (this.getPhysiqueMalus()+this.system.attributs.physique+this.system.attributs.habilite) / 2) } |         rollData.attr = { label: "(Physique+Habilité)/2", value: Math.floor( (this.getPhysiqueMalus()+this.system.attributs.physique.value+this.system.attributs.habilite.value) / 2) } | ||||||
|       } else { |       } else { | ||||||
|         rollData.attr = duplicate(this.system.attributs.habilite) |         rollData.attr = foundry.utils.duplicate(this.system.attributs.habilite) | ||||||
|       } |       } | ||||||
|       rollData.mode = "arme" |       rollData.mode = "arme" | ||||||
|       rollData.arme = arme |       rollData.arme = arme | ||||||
|   | |||||||
| @@ -2,6 +2,8 @@ | |||||||
|  |  | ||||||
| import { MaleficesUtility } from "./malefices-utility.js"; | import { MaleficesUtility } from "./malefices-utility.js"; | ||||||
| import { MaleficesRollDialog } from "./malefices-roll-dialog.js"; | import { MaleficesRollDialog } from "./malefices-roll-dialog.js"; | ||||||
|  | import { MaleficesTirageTarotDialog } from "./malefices-tirage-tarot-dialog.js" | ||||||
|  | import { MaleficesCharacterSummary } from "./malefices-summary-app.js" | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| export class MaleficesCommands { | export class MaleficesCommands { | ||||||
| @@ -9,8 +11,9 @@ export class MaleficesCommands { | |||||||
|   static init() { |   static init() { | ||||||
|     if (!game.system.malefices.commands) { |     if (!game.system.malefices.commands) { | ||||||
|       const commands = new MaleficesCommands(); |       const commands = new MaleficesCommands(); | ||||||
|       //crucibleCommands.registerCommand({ path: ["/char"], func: (content, msg, params) => crucibleCommands.createChar(msg), descr: "Create a new character" }); |       commands.registerCommand({ path: ["/tirage"], func: (content, msg, params) => MaleficesCommands.createTirage(msg), descr: "Tirage des tarots" }); | ||||||
|       //crucibleCommands.registerCommand({ path: ["/pool"], func: (content, msg, params) => crucibleCommands.poolRoll(msg), descr: "Generic Roll Window" }); |       commands.registerCommand({ path: ["/carte"], func: (content, msg, params) => MaleficesCommands.tirerCarte(msg), descr: "Tirer une carte" }); | ||||||
|  |       commands.registerCommand({ path: ["/resume"], func: (content, msg, params) => MaleficesCharacterSummary.displayPCSummary(), descr: "Affiche la liste des PJs!" }); | ||||||
|       game.system.malefices.commands = commands; |       game.system.malefices.commands = commands; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -77,7 +80,7 @@ export class MaleficesCommands { | |||||||
|     console.log("===> Processing command") |     console.log("===> Processing command") | ||||||
|     let command = commandsTable[name]; |     let command = commandsTable[name]; | ||||||
|     path = path + name + " "; |     path = path + name + " "; | ||||||
|     if (command && command.subTable) { |     if (command?.subTable) { | ||||||
|       if (params[0]) { |       if (params[0]) { | ||||||
|         return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path) |         return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path) | ||||||
|       } |       } | ||||||
| @@ -86,7 +89,7 @@ export class MaleficesCommands { | |||||||
|         return true; |         return true; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     if (command && command.func) { |     if (command?.func) { | ||||||
|       const result = command.func(content, msg, params); |       const result = command.func(content, msg, params); | ||||||
|       if (result == false) { |       if (result == false) { | ||||||
|         CrucibleCommands._chatAnswer(msg, command.descr); |         CrucibleCommands._chatAnswer(msg, command.descr); | ||||||
| @@ -103,15 +106,42 @@ export class MaleficesCommands { | |||||||
|     ChatMessage.create(msg); |     ChatMessage.create(msg); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* --------------------------------------------- */ | ||||||
|   async poolRoll( msg) { |   static async createTirage(msg) { | ||||||
|     let rollData = MaleficesUtility.getBasicRollData() |     if (game.user.isGM) { | ||||||
|     rollData.alias = "Dice Pool Roll",  |       let tirageData = { | ||||||
|     rollData.mode  = "generic" |         state: 'select-player', | ||||||
|     rollData.title = `Dice Pool Roll`; |         nbCard: 0, | ||||||
|  |         maxPlayerCard: 4, | ||||||
|  |         maxSecretCard: 1, | ||||||
|  |         cards: [], | ||||||
|  |         players: foundry.utils.duplicate(game.users), | ||||||
|  |         secretCards: [], | ||||||
|  |         deck: MaleficesUtility.getTarots() | ||||||
|  |       } | ||||||
|  |       for (let i = 0; i < 4; i++) { | ||||||
|  |         tirageData.cards.push({ name: "???", img: "systems/fvtt-malefices/images/tarots/background.webp" }) | ||||||
|  |       } | ||||||
|  |       tirageData.secretCards.push({ name: "???", img: "systems/fvtt-malefices/images/tarots/background.webp" }) | ||||||
|  |  | ||||||
|     let rollDialog = await MaleficesRollDialog.create( this, rollData); |       let tirageDialog = await MaleficesTirageTarotDialog.create(this, tirageData) | ||||||
|     rollDialog.render( true ); |       tirageDialog.render(true) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   /* --------------------------------------------- */ | ||||||
|  |   static async tirerCarte(msg) { | ||||||
|  |     let deck =  MaleficesUtility.getTarots() | ||||||
|  |     let index = Math.round(Math.random() * (deck.length-1)) | ||||||
|  |     let selectedCard = deck[index] | ||||||
|  |     selectedCard.system.ispositif = true | ||||||
|  |     if ( selectedCard.system.isdualside) { // Cas des cartes pouvant avoir 2 sens | ||||||
|  |       selectedCard.system.ispositif = (Math.random() > 0.5) | ||||||
|  |     } | ||||||
|  |     selectedCard.system.isgm = false | ||||||
|  |     selectedCard.value = (selectedCard.system.ispositif)? selectedCard.system.numericvalueup : selectedCard.system.numericvaluedown | ||||||
|  |     MaleficesUtility.createChatMessage(game.user.name, "", { | ||||||
|  |       content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard) | ||||||
|  |     }) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -1,5 +1,14 @@ | |||||||
|  |  | ||||||
| export const MALEFICES_CONFIG = { | export const MALEFICES_CONFIG = { | ||||||
|  |   attributs: { | ||||||
|  |     "constitution": "Cons", | ||||||
|  |     "physique": "Phy", | ||||||
|  |     "culturegenerale": "CGén", | ||||||
|  |     "habilite": "Hab", | ||||||
|  |     "perception": "Per", | ||||||
|  |     "spiritualite": "Spi", | ||||||
|  |     "rationnalite": "Rat" | ||||||
|  |   }, | ||||||
|  |  | ||||||
|   tarotType: { |   tarotType: { | ||||||
|     "majeur": "Arcane Majeur", |     "majeur": "Arcane Majeur", | ||||||
| @@ -18,4 +27,41 @@ export const MALEFICES_CONFIG = { | |||||||
|     "epee": "Epée, sabre, javelot, etc", |     "epee": "Epée, sabre, javelot, etc", | ||||||
|     "mainsnues": "Mains Nues" |     "mainsnues": "Mains Nues" | ||||||
|   }, |   }, | ||||||
|  |    | ||||||
|  |   confrontationDegreOptions :{ | ||||||
|  |     "0": "0", | ||||||
|  |     "1": "1", | ||||||
|  |     "2": "2", | ||||||
|  |     "3": "3", | ||||||
|  |     "4": "4", | ||||||
|  |     "5": "5" | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   confrontationModifOptions: { | ||||||
|  |     "-1": "-1", | ||||||
|  |     "0": "0", | ||||||
|  |     "1": "+1" | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   bonusMalusPersoOptions: [ | ||||||
|  |     {value: "-3", label: "-3"}, | ||||||
|  |     {value: "-2", label: "-2"}, | ||||||
|  |     {value: "-1", label: "-1"}, | ||||||
|  |     {value: "0", label: "0"}, | ||||||
|  |     {value: "+1", label: "+1"}, | ||||||
|  |     {value: "+2", label: "+2"}, | ||||||
|  |     {value: "+3", label: "+3"} | ||||||
|  |   ], | ||||||
|  |   bonusMalusDefOptions: [ | ||||||
|  |     {value: "-6", label: "-6 (réussite critique)"}, | ||||||
|  |     {value: "-3", label: "-3 (réussite)"}, | ||||||
|  |     {value: "0", label: "0 (echec ou pas d'esquive)"}, | ||||||
|  |     {value: "+3", label: "+3 (echec critique)"} | ||||||
|  |   ], | ||||||
|  |   bonusMalusPorteeOptions: [ | ||||||
|  |     {value: "1", label: "+1 (Portée courte)"}, | ||||||
|  |     {value: "0", label: "0 (Portée moyenne)"}, | ||||||
|  |     {value: "-1", label: "-1 (Portée longue)"} | ||||||
|  |   ] | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -4,12 +4,12 @@ import { MaleficesUtility } from "./malefices-utility.js"; | |||||||
|  * Extend the basic ItemSheet with some very simple modifications |  * Extend the basic ItemSheet with some very simple modifications | ||||||
|  * @extends {ItemSheet} |  * @extends {ItemSheet} | ||||||
|  */ |  */ | ||||||
| export class MaleficesItemSheet extends ItemSheet { | export class MaleficesItemSheet extends foundry.appv1.sheets.ItemSheet { | ||||||
|  |  | ||||||
|   /** @override */ |   /** @override */ | ||||||
|   static get defaultOptions() { |   static get defaultOptions() { | ||||||
|  |  | ||||||
|     return mergeObject(super.defaultOptions, { |     return foundry.utils.mergeObject(super.defaultOptions, { | ||||||
|       classes: ["fvtt-malefices", "sheet", "item"], |       classes: ["fvtt-malefices", "sheet", "item"], | ||||||
|       template: "systems/fvtt-malefices/templates/item-sheet.hbs", |       template: "systems/fvtt-malefices/templates/item-sheet.hbs", | ||||||
|       dragDrop: [{ dragSelector: null, dropSelector: null }], |       dragDrop: [{ dragSelector: null, dropSelector: null }], | ||||||
| @@ -19,20 +19,6 @@ export class MaleficesItemSheet extends ItemSheet { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   _getHeaderButtons() { |  | ||||||
|     let buttons = super._getHeaderButtons(); |  | ||||||
|     // Add "Post to chat" button |  | ||||||
|     // We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry! |  | ||||||
|     buttons.unshift( |  | ||||||
|       { |  | ||||||
|         class: "post", |  | ||||||
|         icon: "fas fa-comment", |  | ||||||
|         onclick: ev => { } |  | ||||||
|       }) |  | ||||||
|     return buttons |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   /** @override */ |   /** @override */ | ||||||
|   setPosition(options = {}) { |   setPosition(options = {}) { | ||||||
| @@ -57,13 +43,13 @@ export class MaleficesItemSheet extends ItemSheet { | |||||||
|       name: this.object.name, |       name: this.object.name, | ||||||
|       editable: this.isEditable, |       editable: this.isEditable, | ||||||
|       cssClass: this.isEditable ? "editable" : "locked", |       cssClass: this.isEditable ? "editable" : "locked", | ||||||
|       system: duplicate(this.object.system), |       system: foundry.utils.duplicate(this.object.system), | ||||||
|       config: duplicate(game.system.malefices.config), |       config: foundry.utils.duplicate(game.system.malefices.config), | ||||||
|       limited: this.object.limited, |       limited: this.object.limited, | ||||||
|       options: this.options, |       options: this.options, | ||||||
|       owner: this.document.isOwner, |       owner: this.document.isOwner, | ||||||
|       description: await TextEditor.enrichHTML(this.object.system.description, { async: true }), |       description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, { async: true }), | ||||||
|       notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }), |       notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.notes, { async: true }), | ||||||
|       isGM: game.user.isGM |       isGM: game.user.isGM | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -90,7 +76,7 @@ export class MaleficesItemSheet extends ItemSheet { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   postItem() { |   postItem() { | ||||||
|     let chatData = duplicate(this.item) |     let chatData = foundry.utils.duplicate(this.item) | ||||||
|     if (this.actor) { |     if (this.actor) { | ||||||
|       chatData.actor = { id: this.actor.id }; |       chatData.actor = { id: this.actor.id }; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,8 +1,12 @@ | |||||||
| import { MaleficesUtility } from "./malefices-utility.js"; | import { MaleficesUtility } from "./malefices-utility.js"; | ||||||
|  |  | ||||||
| export const defaultItemImg = { | export const defaultItemImg = { | ||||||
|   //skill: "systems/fvtt-malefices/images/icons/skill1.webp", |   arme: "systems/fvtt-malefices/images/icons/arme.webp", | ||||||
|   arme: "systems/fvtt-malefices/images/icones/arme.webp" |   equipement: "systems/fvtt-malefices/images/icons/equipement.webp", | ||||||
|  |   elementbio: "systems/fvtt-malefices/images/icons/wisdom.webp", | ||||||
|  |   archetype: "systems/fvtt-malefices/images/icons/archetype.webp", | ||||||
|  |   tarot: "systems/fvtt-malefices/images/icons/tarot.webp", | ||||||
|  |   sortilege: "systems/fvtt-malefices/images/icons/sortilege.webp", | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   | |||||||
| @@ -16,7 +16,9 @@ import { MaleficesUtility } from "./malefices-utility.js"; | |||||||
| import { MaleficesCombat } from "./malefices-combat.js"; | import { MaleficesCombat } from "./malefices-combat.js"; | ||||||
| import { MaleficesItem } from "./malefices-item.js"; | import { MaleficesItem } from "./malefices-item.js"; | ||||||
| import { MaleficesHotbar } from "./malefices-hotbar.js" | import { MaleficesHotbar } from "./malefices-hotbar.js" | ||||||
|  | import { MaleficesCharacterSummary } from "./malefices-summary-app.js" | ||||||
| import { MALEFICES_CONFIG } from "./malefices-config.js" | import { MALEFICES_CONFIG } from "./malefices-config.js" | ||||||
|  | import { ClassCounter} from "https://www.uberwald.me/fvtt_appcount/count-class-ready.js" | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| /*  Foundry VTT Initialization                  */ | /*  Foundry VTT Initialization                  */ | ||||||
| @@ -56,18 +58,20 @@ Hooks.once("init", async function () { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   // Register sheet application classes |   // Register sheet application classes | ||||||
|   Actors.unregisterSheet("core", ActorSheet); |   foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet); | ||||||
|   Actors.registerSheet("fvtt-malefices", MaleficesActorSheet, { types: ["personnage"], makeDefault: true }); |   foundry.documents.collections.Actors.registerSheet("fvtt-malefices", MaleficesActorSheet, { types: ["personnage"], makeDefault: true }); | ||||||
|   Actors.registerSheet("fvtt-malefices", MaleficesNPCSheet, { types: ["pnj"], makeDefault: false }); |   foundry.documents.collections.Actors.registerSheet("fvtt-malefices", MaleficesNPCSheet, { types: ["pnj"], makeDefault: false }); | ||||||
|  |  | ||||||
|   Items.unregisterSheet("core", ItemSheet); |   foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet); | ||||||
|   Items.registerSheet("fvtt-malefices", MaleficesItemSheet, { makeDefault: true }); |   foundry.documents.collections.Items.registerSheet("fvtt-malefices", MaleficesItemSheet, { makeDefault: true }); | ||||||
|  |  | ||||||
|   MaleficesUtility.init() |   MaleficesUtility.init() | ||||||
|  |  | ||||||
| }); | }); | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| function welcomeMessage() { | function welcomeMessage() { | ||||||
|  |   if (game.user.isGM) { | ||||||
|     ChatMessage.create({ |     ChatMessage.create({ | ||||||
|       user: game.user.id, |       user: game.user.id, | ||||||
|       whisper: [game.user.id], |       whisper: [game.user.id], | ||||||
| @@ -76,7 +80,8 @@ function welcomeMessage() { | |||||||
|       <p>Le Livre de Base de Maléfices v4 est nécessaire pour jouer : https://arkhane-asylum.fr/en/malefices/</p> |       <p>Le Livre de Base de Maléfices v4 est nécessaire pour jouer : https://arkhane-asylum.fr/en/malefices/</p> | ||||||
|       <p>Maléfices et un jeu de rôle publié par Arkhane Asylum Publishing, tout les droits leur appartiennent.</p> |       <p>Maléfices et un jeu de rôle publié par Arkhane Asylum Publishing, tout les droits leur appartiennent.</p> | ||||||
|       <p>Système développé par LeRatierBretonnien avec l'aide de la Dame du Lac et Malik, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p> |       <p>Système développé par LeRatierBretonnien avec l'aide de la Dame du Lac et Malik, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p> | ||||||
|     ` }); |       <p>Commandes : /tirage pour le tirage des tarots, /carte pour tirer une simple carte et /resume pour le résumé des PJs (MJ seulement)` }); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| @@ -93,17 +98,14 @@ Hooks.once("ready", function () { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // CSS patch for v9 |   ClassCounter.registerUsageCount(); | ||||||
|   if (game.version) { |  | ||||||
|     let sidebar = document.getElementById("sidebar"); |  | ||||||
|     sidebar.style.width = "min-content"; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   welcomeMessage(); |   welcomeMessage(); | ||||||
|   MaleficesUtility.ready() |   MaleficesUtility.ready() | ||||||
|   MaleficesUtility.init() |   MaleficesCharacterSummary.ready() | ||||||
|  |  | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| /*  Foundry VTT Initialization                  */ | /*  Foundry VTT Initialization                  */ | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| @@ -111,10 +113,9 @@ Hooks.on("chatMessage", (html, content, msg) => { | |||||||
|   if (content[0] == '/') { |   if (content[0] == '/') { | ||||||
|     let regExp = /(\S+)/g; |     let regExp = /(\S+)/g; | ||||||
|     let commands = content.match(regExp); |     let commands = content.match(regExp); | ||||||
|     if (game.system.Malefices.commands.processChatCommand(commands, content, msg)) { |     if (game.system.malefices.commands.processChatCommand(commands, content, msg)) { | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   return true; |   return true; | ||||||
| }); | }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,12 +6,12 @@ | |||||||
| import { MaleficesUtility } from "./malefices-utility.js"; | import { MaleficesUtility } from "./malefices-utility.js"; | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| export class MaleficesNPCSheet extends ActorSheet { | export class MaleficesNPCSheet extends foundry.appv1.sheets.ActorSheet { | ||||||
|  |  | ||||||
|   /** @override */ |   /** @override */ | ||||||
|   static get defaultOptions() { |   static get defaultOptions() { | ||||||
|  |  | ||||||
|     return mergeObject(super.defaultOptions, { |     return foundry.utils.mergeObject(super.defaultOptions, { | ||||||
|       classes: ["Malefices", "sheet", "actor"], |       classes: ["Malefices", "sheet", "actor"], | ||||||
|       template: "systems/fvtt-malefices/templates/npc-sheet.html", |       template: "systems/fvtt-malefices/templates/npc-sheet.html", | ||||||
|       width: 640, |       width: 640, | ||||||
| @@ -25,7 +25,7 @@ export class MaleficesNPCSheet extends ActorSheet { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async getData() { |   async getData() { | ||||||
|     const objectData = this.object.system |     const objectData = this.object.system | ||||||
|     let actorData = duplicate(objectData) |     let actorData = foundry.utils.duplicate(objectData) | ||||||
|  |  | ||||||
|     let formData = { |     let formData = { | ||||||
|       title: this.title, |       title: this.title, | ||||||
| @@ -38,16 +38,16 @@ export class MaleficesNPCSheet extends ActorSheet { | |||||||
|       data: actorData, |       data: actorData, | ||||||
|       limited: this.object.limited, |       limited: this.object.limited, | ||||||
|       skills: this.actor.getSkills( ), |       skills: this.actor.getSkills( ), | ||||||
|       weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ), |       weapons: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getWeapons()) ), | ||||||
|       armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())), |       armors: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getArmors())), | ||||||
|       shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())), |       shields: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getShields())), | ||||||
|       spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getLore())), |       spells: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getLore())), | ||||||
|       equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ), |       equipments: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquipmentsOnly()) ), | ||||||
|       equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ), |       equippedWeapons: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquippedWeapons()) ), | ||||||
|       equippedArmor: this.actor.getEquippedArmor(), |       equippedArmor: this.actor.getEquippedArmor(), | ||||||
|       equippedShield: this.actor.getEquippedShield(), |       equippedShield: this.actor.getEquippedShield(), | ||||||
|       subActors: duplicate(this.actor.getSubActors()), |       subActors: foundry.utils.duplicate(this.actor.getSubActors()), | ||||||
|       moneys: duplicate(this.actor.getMoneys()), |       moneys: foundry.utils.duplicate(this.actor.getMoneys()), | ||||||
|       encCapacity: this.actor.getEncumbranceCapacity(), |       encCapacity: this.actor.getEncumbranceCapacity(), | ||||||
|       saveRolls: this.actor.getSaveRoll(), |       saveRolls: this.actor.getSaveRoll(), | ||||||
|       conditions: this.actor.getConditions(), |       conditions: this.actor.getConditions(), | ||||||
|   | |||||||
| @@ -5,26 +5,32 @@ export class MaleficesRollDialog extends Dialog { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async create(actor, rollData) { |   static async create(actor, rollData) { | ||||||
|  |  | ||||||
|     let options = { classes: ["MaleficesDialog"], width: 540, height: 'fit-content', 'z-index': 99999 }; |     let options = { classes: ["MaleficesDialog"], width: 540, height: 'fit-content', 'z-index': 99999 } | ||||||
|     let html = await renderTemplate('systems/fvtt-malefices/templates/dialogs/roll-dialog-generic.hbs', rollData); |     let html | ||||||
|  |     if (rollData?.attr?.iscard)  { | ||||||
|  |       html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-malefices/templates/dialogs/confrontation-dialog.hbs', rollData); | ||||||
|  |     } else { | ||||||
|  |       html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-malefices/templates/dialogs/roll-dialog-generic.hbs', rollData); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return new MaleficesRollDialog(actor, rollData, html, options); |     return new MaleficesRollDialog(actor, rollData, html, options); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   constructor(actor, rollData, html, options, close = undefined) { |   constructor(actor, rollData, html, options, close = undefined) { | ||||||
|  |     let isCard = rollData?.attr?.iscard | ||||||
|     let conf = { |     let conf = { | ||||||
|       title: (rollData.mode == "skill") ? "Skill" : "Attribute", |       title: (isCard) ? "Jet" : "Tirage", | ||||||
|       content: html, |       content: html, | ||||||
|       buttons: { |       buttons: { | ||||||
|         roll: { |         roll: { | ||||||
|           icon: '<i class="fas fa-check"></i>', |           icon: '<i class="fas fa-check"></i>', | ||||||
|           label: "Roll !", |           label: (isCard) ? "Tirer une carte" : "Lancer le dé", | ||||||
|           callback: () => { this.roll() } |           callback: () => { this.roll() } | ||||||
|         }, |         }, | ||||||
|         cancel: { |         cancel: { | ||||||
|           icon: '<i class="fas fa-times"></i>', |           icon: '<i class="fas fa-times"></i>', | ||||||
|           label: "Cancel", |           label: "Annuler", | ||||||
|           callback: () => { this.close() } |           callback: () => { this.close() } | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
| @@ -39,8 +45,13 @@ export class MaleficesRollDialog extends Dialog { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   roll() { |   roll() { | ||||||
|  |     let isCard = this.rollData?.attr?.iscard | ||||||
|  |     if (isCard) { | ||||||
|  |       MaleficesUtility.tirageConfrontationMalefices(this.rollData) | ||||||
|  |     } else { | ||||||
|       MaleficesUtility.rollMalefices(this.rollData) |       MaleficesUtility.rollMalefices(this.rollData) | ||||||
|     } |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async refreshDialog() { |   async refreshDialog() { | ||||||
| @@ -53,7 +64,6 @@ export class MaleficesRollDialog extends Dialog { | |||||||
|   activateListeners(html) { |   activateListeners(html) { | ||||||
|     super.activateListeners(html); |     super.activateListeners(html); | ||||||
|  |  | ||||||
|     var dialog = this; |  | ||||||
|     function onLoad() { |     function onLoad() { | ||||||
|     } |     } | ||||||
|     $(function () { onLoad(); }); |     $(function () { onLoad(); }); | ||||||
| @@ -70,6 +80,12 @@ export class MaleficesRollDialog extends Dialog { | |||||||
|     html.find('#bonusMalusPortee').change((event) => { |     html.find('#bonusMalusPortee').change((event) => { | ||||||
|       this.rollData.bonusMalusPortee = Number(event.currentTarget.value) |       this.rollData.bonusMalusPortee = Number(event.currentTarget.value) | ||||||
|     }) |     }) | ||||||
|  |     html.find('#confrontationDegre').change((event) => { | ||||||
|  |       this.rollData.confrontationDegre = Number(event.currentTarget.value) | ||||||
|  |     }) | ||||||
|  |     html.find('#confrontationModif').change((event) => { | ||||||
|  |       this.rollData.confrontationModif = Number(event.currentTarget.value) | ||||||
|  |     }) | ||||||
|  |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
							
								
								
									
										134
									
								
								modules/malefices-summary-app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,134 @@ | |||||||
|  | /* -------------------------------------------- */ | ||||||
|  | import { MaleficesUtility } from "./malefices-utility.js"; | ||||||
|  |  | ||||||
|  | /* -------------------------------------------- */ | ||||||
|  | export class MaleficesCharacterSummary extends Application { | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static displayPCSummary() { | ||||||
|  |     if (game.user.isGM) { | ||||||
|  |       game.system.malefices.charSummary.render(true) | ||||||
|  |     } else { | ||||||
|  |       ui.notifications.info("Commande /tirage réservée au MJ !") | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   updatePCSummary() { | ||||||
|  |     if (this.rendered) { | ||||||
|  |       this.render(true) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static createSummaryPos() { | ||||||
|  |     return { top: 200, left: 200 }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static ready() { | ||||||
|  |     if (!game.user.isGM) { // Uniquement si GM | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     let charSummary = new MaleficesCharacterSummary() | ||||||
|  |     game.system.malefices.charSummary = charSummary | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   constructor() { | ||||||
|  |     super(); | ||||||
|  |     //game.settings.set("world", "character-summary-data", {npcList: [], x:0, y:0}) | ||||||
|  |     this.settings = game.settings.get("world", "character-summary-data") | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static get defaultOptions() { | ||||||
|  |     return foundry.utils.mergeObject(super.defaultOptions, { | ||||||
|  |       template: "systems/fvtt-malefices/templates/dialogs/character-summary.hbs", | ||||||
|  |       popOut: true, | ||||||
|  |       resizable: true, | ||||||
|  |       dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }], | ||||||
|  |       classes: ["bol", "dialog"], width: 920, height: 'fit-content' | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   getData() { | ||||||
|  |     let formData = super.getData(); | ||||||
|  |  | ||||||
|  |     formData.pcs = game.actors.filter(ac => ac.type == "personnage" && ac.hasPlayerOwner) | ||||||
|  |     formData.npcs = [] | ||||||
|  |     let newList = [] | ||||||
|  |     let toUpdate = false | ||||||
|  |     for (let actorId of this.settings.npcList) { | ||||||
|  |       let actor = game.actors.get(actorId) | ||||||
|  |       if (actor) { | ||||||
|  |         formData.npcs.push(actor) | ||||||
|  |         newList.push(actorId) | ||||||
|  |       } else { | ||||||
|  |         toUpdate = true | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     formData.config = game.system.malefices.config | ||||||
|  |  | ||||||
|  |     if (toUpdate) { | ||||||
|  |       this.settings.npcList = newList | ||||||
|  |       //console.log("Going to update ...", this.settings) | ||||||
|  |       game.settings.set("world", "character-summary-data", this.settings) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return formData | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   updateNPC() { | ||||||
|  |     game.settings.set("world", "character-summary-data", game.system.malefices.charSummary.settings) | ||||||
|  |     game.system.malefices.charSummary.close() | ||||||
|  |     setTimeout(function () { game.system.malefices.charSummary.render(true) }, 500) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   async _onDrop(event) { | ||||||
|  |     //console.log("Dragged data are : ", dragData) | ||||||
|  |     let data = event.dataTransfer.getData('text/plain') | ||||||
|  |     let dataItem = JSON.parse(data) | ||||||
|  |     let actor = fromUuidSync(dataItem.uuid) | ||||||
|  |     if (actor) { | ||||||
|  |       game.system.malefices.charSummary.settings.npcList.push(actor.id) | ||||||
|  |       game.system.malefices.charSummary.updateNPC() | ||||||
|  |  | ||||||
|  |     } else { | ||||||
|  |       ui.notifications.warn("Pas d'acteur trouvé") | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   /** @override */ | ||||||
|  |   async activateListeners(html) { | ||||||
|  |     super.activateListeners(html); | ||||||
|  |  | ||||||
|  |     html.find('.actor-open').click((event) => { | ||||||
|  |       const li = $(event.currentTarget).parents(".item") | ||||||
|  |       const actor = game.actors.get(li.data("actor-id")) | ||||||
|  |       actor.sheet.render(true) | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |     html.find('.summary-roll').click((event) => { | ||||||
|  |       const li = $(event.currentTarget).parents(".item") | ||||||
|  |       const actor = game.actors.get(li.data("actor-id")) | ||||||
|  |       let type = $(event.currentTarget).data("type") | ||||||
|  |       let key = $(event.currentTarget).data("key") | ||||||
|  |       actor.rollAttribut(key) | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |     html.find('.actor-delete').click(event => { | ||||||
|  |       const li = $(event.currentTarget).parents(".item"); | ||||||
|  |       let actorId = li.data("actor-id") | ||||||
|  |       let newList = game.system.malefices.charSummary.settings.npcList.filter(id => id != actorId) | ||||||
|  |       game.system.malefices.charSummary.settings.npcList = newList | ||||||
|  |       game.system.malefices.charSummary.updateNPC() | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										155
									
								
								modules/malefices-tirage-tarot-dialog.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,155 @@ | |||||||
|  | import { MaleficesUtility } from "./malefices-utility.js"; | ||||||
|  |  | ||||||
|  | export class MaleficesTirageTarotDialog extends Dialog { | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static async create(actor, tirageData) { | ||||||
|  |  | ||||||
|  |     let options = { classes: ["MaleficesDialog"], width: 720, height: 740, 'z-index': 99999 }; | ||||||
|  |     let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-malefices/templates/dialogs/tirage-tarot-dialog.hbs', tirageData); | ||||||
|  |  | ||||||
|  |     return new MaleficesTirageTarotDialog(actor, tirageData, html, options); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   constructor(actor, tirageData, html, options, close = undefined) { | ||||||
|  |     let conf = { | ||||||
|  |       title: "Tirage des tarots", | ||||||
|  |       content: html, | ||||||
|  |       buttons: { | ||||||
|  |         cancel: { | ||||||
|  |           icon: '<i class="fas fa-times"></i>', | ||||||
|  |           label: "Fermer/Annuler", | ||||||
|  |           callback: () => { this.close() } | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       close: close | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     super(conf, options); | ||||||
|  |  | ||||||
|  |     this.actor = actor; | ||||||
|  |     this.tirageData = tirageData; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   async sendCardRequest() { | ||||||
|  |     this.tirageData.state = 'waiting-user-card' | ||||||
|  |     let msg = await MaleficesUtility.createChatMessage(this.tirageData.user.name, "useronly", { | ||||||
|  |       content: await renderTemplate(`systems/fvtt-malefices/templates/chat/request-tarot-card.hbs`, this.tirageData) | ||||||
|  |     }) | ||||||
|  |     //msg.setFlag("world", "tirage-data", this.tirageData) | ||||||
|  |     console.log("MSG IS", msg) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   drawCard() { | ||||||
|  |     let index = Math.round(Math.random() * (this.tirageData.deck.length-1)) | ||||||
|  |     let selectedCard = this.tirageData.deck[index] | ||||||
|  |     selectedCard.system.ispositif = true | ||||||
|  |     if ( selectedCard.system.isdualside) { // Cas des cartes pouvant avoir 2 sens | ||||||
|  |       selectedCard.system.ispositif = (Math.random() > 0.5) | ||||||
|  |     } | ||||||
|  |     console.log("CARD SELECTED:", selectedCard) | ||||||
|  |     // Cas spécial de la Roue de la Fortune | ||||||
|  |     if ( selectedCard.name.toLowerCase().includes("fortune")) { | ||||||
|  |       this.tirageData.maxPlayerCard += 1 | ||||||
|  |       this.tirageData.maxSecretCard += 1 | ||||||
|  |     } | ||||||
|  |     let newList = [] | ||||||
|  |     for(let card of this.tirageData.deck) { | ||||||
|  |       if (card.name != selectedCard.name) { | ||||||
|  |         newList.push(card) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     this.tirageData.deck = newList | ||||||
|  |  | ||||||
|  |     return selectedCard | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   async addCard( msgId ) { | ||||||
|  |     MaleficesUtility.removeChatMessageId(msgId) | ||||||
|  |  | ||||||
|  |     let selectedCard = this.drawCard() | ||||||
|  |     selectedCard.system.isgm = false | ||||||
|  |     await MaleficesUtility.createChatMessage(this.tirageData.user.name, "gmroll", { | ||||||
|  |       content: await renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard) | ||||||
|  |     }) | ||||||
|  |     if (this.tirageData.cards[0].name == "???") { | ||||||
|  |       this.tirageData.cards.shift() | ||||||
|  |     } | ||||||
|  |     this.tirageData.cards.push(selectedCard) | ||||||
|  |     this.tirageData.nbCard++ | ||||||
|  |  | ||||||
|  |     if (this.tirageData.nbCard == this.tirageData.maxPlayerCard) { | ||||||
|  |       for (let i=0; i<this.tirageData.maxSecretCard; i++) { | ||||||
|  |         let selectedCard = this.drawCard() | ||||||
|  |         selectedCard.system.isgm = true | ||||||
|  |         await MaleficesUtility.createChatMessage(this.tirageData.user.name, "blindroll", { | ||||||
|  |           content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard) | ||||||
|  |         }) | ||||||
|  |         if (this.tirageData.secretCards[0].name == "???") { | ||||||
|  |           this.tirageData.secretCards.shift() | ||||||
|  |         } | ||||||
|  |         this.tirageData.secretCards.push(selectedCard) | ||||||
|  |       } | ||||||
|  |       this.tirageData.actors = foundry.utils.duplicate(game.actors) | ||||||
|  |       this.tirageData.state = 'attribute-to-actor' | ||||||
|  |     }else { | ||||||
|  |       this.sendCardRequest() | ||||||
|  |     } | ||||||
|  |     this.refreshDialog() | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   async processSelectedPlayer() { | ||||||
|  |     let user = game.users.get(this.tirageData.playerId) | ||||||
|  |     this.tirageData.user  = user | ||||||
|  |     this.tirageData.players = null | ||||||
|  |     console.log("Going to work with ", user.name) | ||||||
|  |     game.system.malefices.currentTirage = this | ||||||
|  |     this.refreshDialog() | ||||||
|  |     this.sendCardRequest() | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   attributeToActor(actorId) { | ||||||
|  |     let actor = game.actors.get(actorId) | ||||||
|  |     if (actor) { | ||||||
|  |       actor.createEmbeddedDocuments('Item', this.tirageData.cards) | ||||||
|  |       actor.createEmbeddedDocuments('Item', this.tirageData.secretCards) | ||||||
|  |       ui.notifications.info("Les cartes ont été attribuées à " + actor.name) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   async refreshDialog() { | ||||||
|  |     const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-malefices/templates/dialogs/tirage-tarot-dialog.hbs", this.tirageData) | ||||||
|  |     this.data.content = content | ||||||
|  |     this.render(true) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   activateListeners(html) { | ||||||
|  |     super.activateListeners(html); | ||||||
|  |  | ||||||
|  |     let dialog = this; | ||||||
|  |     function onLoad() { | ||||||
|  |     } | ||||||
|  |     $(function () { onLoad(); }); | ||||||
|  |  | ||||||
|  |     html.find('#playerId').change((event) => { | ||||||
|  |       if ( event.currentTarget.value != "none") { | ||||||
|  |         dialog.tirageData.playerId = event.currentTarget.value | ||||||
|  |         dialog.processSelectedPlayer() | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     html.find('#actorId').change((event) => { | ||||||
|  |       if ( event.currentTarget.value != "none") { | ||||||
|  |         let actorId = event.currentTarget.value | ||||||
|  |         dialog.attributeToActor(actorId) | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,23 +1,22 @@ | |||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| import { MaleficesCombat } from "./malefices-combat.js"; |  | ||||||
| import { MaleficesCommands } from "./malefices-commands.js"; | import { MaleficesCommands } from "./malefices-commands.js"; | ||||||
|  |  | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| export class MaleficesUtility { | export class MaleficesUtility { | ||||||
|  |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async init() { |   static async init() { | ||||||
|     Hooks.on('renderChatLog', (log, html, data) => MaleficesUtility.chatListeners(html)); |     Hooks.on('renderChatLog', (log, html, data) => MaleficesUtility.chatListeners(html)); | ||||||
|     /*Hooks.on("dropCanvasData", (canvas, data) => { |  | ||||||
|       MaleficesUtility.dropItemOnToken(canvas, data) |  | ||||||
|     });*/ |  | ||||||
|  |  | ||||||
|     this.rollDataStore = {} |     this.rollDataStore = {} | ||||||
|     this.defenderStore = {} |     this.defenderStore = {} | ||||||
|  |  | ||||||
|     MaleficesCommands.init(); |     MaleficesCommands.init(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static async ready() { | ||||||
|  |  | ||||||
|     Handlebars.registerHelper('count', function (list) { |     Handlebars.registerHelper('count', function (list) { | ||||||
|       return list.length; |       return list.length; | ||||||
| @@ -44,6 +43,26 @@ export class MaleficesUtility { | |||||||
|     Handlebars.registerHelper('add', function (a, b) { |     Handlebars.registerHelper('add', function (a, b) { | ||||||
|       return parseInt(a) + parseInt(b); |       return parseInt(a) + parseInt(b); | ||||||
|     }) |     }) | ||||||
|  |     // Handle v12 removal of this helper | ||||||
|  |     Handlebars.registerHelper('select', function (selected, options) { | ||||||
|  |       const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected)); | ||||||
|  |       const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']'); | ||||||
|  |       const html = options.fn(this); | ||||||
|  |       return html.replace(rgx, "$& selected"); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     game.settings.register("world", "character-summary-data", { | ||||||
|  |       name: "character-summary-data", | ||||||
|  |       scope: "world", | ||||||
|  |       config: false, | ||||||
|  |       default: { npcList: [], x: 200, y: 200 }, | ||||||
|  |       type: Object | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |     const tarots = await MaleficesUtility.loadCompendium("fvtt-malefices.malefices-tarots") | ||||||
|  |     this.tarots = tarots.map(i => i.toObject()) | ||||||
|  |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /*-------------------------------------------- */ |   /*-------------------------------------------- */ | ||||||
| @@ -54,18 +73,12 @@ export class MaleficesUtility { | |||||||
|  |  | ||||||
|   /*-------------------------------------------- */ |   /*-------------------------------------------- */ | ||||||
|   static getTarots() { |   static getTarots() { | ||||||
|     return duplicate(this.tarots) |     return foundry.utils.duplicate(this.tarots) | ||||||
|   } |   } | ||||||
|   static getTarot(tId) { |   static getTarot(tId) { | ||||||
|     return this.tarots.find(t => t._id == tId) |     return this.tarots.find(t => t._id == tId) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   static async ready() { |  | ||||||
|     const tarots = await MaleficesUtility.loadCompendium("fvtt-malefices.malefices-tarots") |  | ||||||
|     this.tarots = tarots.map(i => i.toObject()) |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async loadCompendiumData(compendium) { |   static async loadCompendiumData(compendium) { | ||||||
|     const pack = game.packs.get(compendium) |     const pack = game.packs.get(compendium) | ||||||
| @@ -89,11 +102,19 @@ export class MaleficesUtility { | |||||||
|     } |     } | ||||||
|     return actor |     return actor | ||||||
|   } |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static drawDeckCard(msgId) { | ||||||
|  |     if (game.user.isGM) { | ||||||
|  |       game.system.malefices.currentTirage.addCard(msgId) | ||||||
|  |     } else { | ||||||
|  |       game.socket.emit("system.fvtt-malefices", { name: "msg-draw-card", data: { msgId: msgId } }) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async chatListeners(html) { |   static async chatListeners(html) { | ||||||
|  |  | ||||||
|     html.on("click", '.roll-destin', event => { |     $(html).on("click", '.roll-destin', event => { | ||||||
|       let messageId = MaleficesUtility.findChatMessageId(event.currentTarget) |       let messageId = MaleficesUtility.findChatMessageId(event.currentTarget) | ||||||
|       let message = game.messages.get(messageId) |       let message = game.messages.get(messageId) | ||||||
|       let rollData = message.getFlag("world", "rolldata") |       let rollData = message.getFlag("world", "rolldata") | ||||||
| @@ -102,6 +123,11 @@ export class MaleficesUtility { | |||||||
|       rollData.isReroll = true |       rollData.isReroll = true | ||||||
|       this.rollMalefices(rollData) |       this.rollMalefices(rollData) | ||||||
|     }) |     }) | ||||||
|  |     $(html).on("click", '.draw-tarot-card', event => { | ||||||
|  |       let messageId = MaleficesUtility.findChatMessageId(event.currentTarget) | ||||||
|  |       this.drawDeckCard(messageId) | ||||||
|  |     }) | ||||||
|  |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -112,7 +138,7 @@ export class MaleficesUtility { | |||||||
|       'systems/fvtt-malefices/templates/items/partial-item-nav.hbs', |       'systems/fvtt-malefices/templates/items/partial-item-nav.hbs', | ||||||
|       'systems/fvtt-malefices/templates/items/partial-item-description.hbs' |       'systems/fvtt-malefices/templates/items/partial-item-description.hbs' | ||||||
|     ] |     ] | ||||||
|     return loadTemplates(templatePaths); |     return foundry.applications.handlebars.loadTemplates(templatePaths); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -178,28 +204,17 @@ export class MaleficesUtility { | |||||||
|  |  | ||||||
|     let id = rollData.rollId |     let id = rollData.rollId | ||||||
|     let oldRollData = this.rollDataStore[id] || {} |     let oldRollData = this.rollDataStore[id] || {} | ||||||
|     let newRollData = mergeObject(oldRollData, rollData) |     let newRollData = foundry.utils.mergeObject(oldRollData, rollData) | ||||||
|     this.rollDataStore[id] = newRollData |     this.rollDataStore[id] = newRollData | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async onSocketMesssage(msg) { |   static async onSocketMesssage(msg) { | ||||||
|     console.log("SOCKET MESSAGE", msg.name) |     console.log("SOCKET MESSAGE", msg.name) | ||||||
|     if (msg.name == "msg_update_roll") { |     if (msg.name == "msg-draw-card") { | ||||||
|       this.updateRollData(msg.data) |       if (game.user.isGM && game.system.malefices.currentTirage) { | ||||||
|  |         game.system.malefices.currentTirage.addCard(msg.data.msgId) | ||||||
|       } |       } | ||||||
|     if (msg.name == "msg_gm_process_attack_defense") { |  | ||||||
|       this.processSuccessResult(msg.data) |  | ||||||
|     } |  | ||||||
|     if (msg.name == "msg_gm_item_drop" && game.user.isGM) { |  | ||||||
|       let actor = game.actors.get(msg.data.actorId) |  | ||||||
|       let item |  | ||||||
|       if (msg.data.isPack) { |  | ||||||
|         item = await fromUuid("Compendium." + msg.data.isPack + "." + msg.data.itemId) |  | ||||||
|       } else { |  | ||||||
|         item = game.items.get(msg.data.itemId) |  | ||||||
|       } |  | ||||||
|       this.addItemDropToActor(actor, item) |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -261,6 +276,133 @@ export class MaleficesUtility { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static processSpecialCard(actor, rollData) { | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("archange")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("archange")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "gmroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>L'Archange : ${actor.name} gagne 1 point de Spiritualité.` | ||||||
|  |         }) | ||||||
|  |         actor.incDecAttr("spiritualite", 1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("vicaire")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("vicaire")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "blindroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>Le Vicaire : ${actor.name} vient de gagner 1 point en Pratique de la Magie Blanche (MPMB, secret).` | ||||||
|  |         }) | ||||||
|  |         actor.incDecMPMB(1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("chance")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("chance")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "gmroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>La Chance : ${actor.name} a gagné 1 point de Destin.` | ||||||
|  |         }) | ||||||
|  |         actor.incDecDestin(1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("mort")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("mort")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "gmroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>La Mort : ${actor.name} est pétrifié par la peur.` | ||||||
|  |         }) | ||||||
|  |         actor.incDecDestin(1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("diable")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("diable")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "gmroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>Le Diable : ${actor.name} gagne 1 point de Rationnalité.` | ||||||
|  |         }) | ||||||
|  |         actor.incDecAttr("rationnalite", 1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("lune noire")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("lune noire")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "blindroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>La Lune Noire : ${actor.name} vient de gagner 1 point de Fluide (secret).` | ||||||
|  |         }) | ||||||
|  |         actor.incDecFluide(1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("grand livre")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("grand livre")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "blindroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>La Lune Noire : ${actor.name} vient de gagner 1 point de Fluide (secret).` | ||||||
|  |         }) | ||||||
|  |         actor.incDecFluide(1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (rollData.selectedCard.name.toLowerCase().includes("sorcier")) { | ||||||
|  |       let actorCard = actor.items.find(c => c.type == "tarot" && c.name.toLowerCase().includes("sorcier")) | ||||||
|  |       if (actorCard) { | ||||||
|  |         MaleficesUtility.createChatMessage(actor.name, "blindroll", { | ||||||
|  |           content: `Conséquence supplémentaire ! <br>Le Vicaire : ${actor.name} vient de gagner 1 point en Pratique de la Magie Noire (MPMN, secret).` | ||||||
|  |         }) | ||||||
|  |         actor.incDecMPMN(1) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static computeResults(rollData) { | ||||||
|  |     rollData.isSuccess = false | ||||||
|  |     if (rollData.total <= rollData.target) { | ||||||
|  |       rollData.isSuccess = true | ||||||
|  |     } | ||||||
|  |     if (rollData.total == 1) { | ||||||
|  |       rollData.isSuccess = true | ||||||
|  |       rollData.isCritical = true | ||||||
|  |     } | ||||||
|  |     if (rollData.total == 20) { | ||||||
|  |       rollData.isSuccess = false | ||||||
|  |       rollData.isFumble = true | ||||||
|  |     } | ||||||
|  |     if (rollData.total <= Math.floor(rollData.target / 3)) { | ||||||
|  |       rollData.isPart = true | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static async tirageConfrontationMalefices(rollData) { | ||||||
|  |     let actor = game.actors.get(rollData.actorId) | ||||||
|  |  | ||||||
|  |     rollData.target = rollData.attr.value - rollData.confrontationDegre + rollData.confrontationModif | ||||||
|  |  | ||||||
|  |     let deck = this.getTarots() | ||||||
|  |     let index = Math.round(Math.random() * (deck.length - 1)) | ||||||
|  |     let selectedCard = deck[index] | ||||||
|  |     selectedCard.system.ispositif = (Math.random() > 0.5) | ||||||
|  |     selectedCard.value = (selectedCard.system.ispositif) ? selectedCard.system.numericvalueup : selectedCard.system.numericvaluedown | ||||||
|  |     rollData.total = selectedCard.value | ||||||
|  |     rollData.selectedCard = selectedCard | ||||||
|  |     await MaleficesUtility.createChatMessage(actor.name, "gmroll", { | ||||||
|  |       content: await renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard) | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |     this.computeResults(rollData) | ||||||
|  |  | ||||||
|  |     if (rollData.isSuccess) { | ||||||
|  |       rollData.gainAttr = Math.ceil(rollData.confrontationDegre / 2) + ((rollData.isCritical) ? 1 : 0) | ||||||
|  |       actor.incDecAttr(rollData.attr.abbrev, rollData.gainAttr) | ||||||
|  |     } else { | ||||||
|  |       rollData.gainAttr = rollData.confrontationDegre | ||||||
|  |       actor.incDecAttr(rollData.attr.abbrev, -rollData.gainAttr) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     await MaleficesUtility.createChatMessage(actor.name, "gmroll", { | ||||||
|  |       content: await renderTemplate(`systems/fvtt-malefices/templates/chat/chat-confrontation-result.hbs`, rollData) | ||||||
|  |     }) | ||||||
|  |     this.processSpecialCard(actor, rollData) | ||||||
|  |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async rollMalefices(rollData) { |   static async rollMalefices(rollData) { | ||||||
|  |  | ||||||
| @@ -276,28 +418,15 @@ export class MaleficesUtility { | |||||||
|  |  | ||||||
|     // Performs roll |     // Performs roll | ||||||
|     console.log("Roll formula", diceFormula) |     console.log("Roll formula", diceFormula) | ||||||
|     let myRoll = new Roll(diceFormula).roll({ async: false }) |     let myRoll = await new Roll(diceFormula).roll() | ||||||
|     await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) |     await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) | ||||||
|     rollData.roll = myRoll |     rollData.roll = foundry.utils.duplicate(myRoll) | ||||||
|  |     rollData.total = myRoll.total | ||||||
|  |  | ||||||
|     rollData.isSuccess = false |     this.computeResults(rollData) | ||||||
|     if (myRoll.total <= rollData.target) { |  | ||||||
|       rollData.isSuccess = true |  | ||||||
|     } |  | ||||||
|     if (myRoll.total == 1) { |  | ||||||
|       rollData.isSuccess = true |  | ||||||
|       rollData.isCritical = true |  | ||||||
|     } |  | ||||||
|     if (myRoll.total == 20) { |  | ||||||
|       rollData.isSuccess = false |  | ||||||
|       rollData.isFumble = true |  | ||||||
|     } |  | ||||||
|     if (myRoll.total <= Math.floor(rollData.target / 3)) { |  | ||||||
|       rollData.isPart = true |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     let msg = await this.createChatWithRollMode(rollData.alias, { |     let msg = await this.createChatWithRollMode(rollData.alias, { | ||||||
|       content: await renderTemplate(`systems/fvtt-malefices/templates/chat/chat-generic-result.hbs`, rollData) |       content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-malefices/templates/chat/chat-generic-result.hbs`, rollData) | ||||||
|     }) |     }) | ||||||
|     msg.setFlag("world", "rolldata", rollData) |     msg.setFlag("world", "rolldata", rollData) | ||||||
|     if (rollData.mode == "initiative") { |     if (rollData.mode == "initiative") { | ||||||
| @@ -331,11 +460,17 @@ export class MaleficesUtility { | |||||||
|     switch (rollMode) { |     switch (rollMode) { | ||||||
|       case "blindroll": return this.getUsers(user => user.isGM); |       case "blindroll": return this.getUsers(user => user.isGM); | ||||||
|       case "gmroll": return this.getWhisperRecipientsAndGMs(name); |       case "gmroll": return this.getWhisperRecipientsAndGMs(name); | ||||||
|  |       case "useronly": return this.getWhisperRecipientsOnly(name); | ||||||
|       case "selfroll": return [game.user.id]; |       case "selfroll": return [game.user.id]; | ||||||
|     } |     } | ||||||
|     return undefined; |     return undefined; | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|  |   static getWhisperRecipientsOnly(name) { | ||||||
|  |     let recep1 = ChatMessage.getWhisperRecipients(name) || []; | ||||||
|  |     return recep1 | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|   static getWhisperRecipientsAndGMs(name) { |   static getWhisperRecipientsAndGMs(name) { | ||||||
|     let recep1 = ChatMessage.getWhisperRecipients(name) || []; |     let recep1 = ChatMessage.getWhisperRecipients(name) || []; | ||||||
|     return recep1.concat(ChatMessage.getWhisperRecipients('GM')); |     return recep1.concat(ChatMessage.getWhisperRecipients('GM')); | ||||||
| @@ -343,7 +478,7 @@ export class MaleficesUtility { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static blindMessageToGM(chatOptions) { |   static blindMessageToGM(chatOptions) { | ||||||
|     let chatGM = duplicate(chatOptions); |     let chatGM = foundry.utils.duplicate(chatOptions); | ||||||
|     chatGM.whisper = this.getUsers(user => user.isGM); |     chatGM.whisper = this.getUsers(user => user.isGM); | ||||||
|     chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content; |     chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content; | ||||||
|     console.log("blindMessageToGM", chatGM); |     console.log("blindMessageToGM", chatGM); | ||||||
| @@ -369,7 +504,7 @@ export class MaleficesUtility { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static createChatMessage(name, rollMode, chatOptions) { |   static async createChatMessage(name, rollMode, chatOptions) { | ||||||
|     switch (rollMode) { |     switch (rollMode) { | ||||||
|       case "blindroll": // GM only |       case "blindroll": // GM only | ||||||
|         if (!game.user.isGM) { |         if (!game.user.isGM) { | ||||||
| @@ -387,13 +522,13 @@ export class MaleficesUtility { | |||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|     chatOptions.alias = chatOptions.alias || name; |     chatOptions.alias = chatOptions.alias || name; | ||||||
|     return ChatMessage.create(chatOptions); |     return await ChatMessage.create(chatOptions); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static getBasicRollData() { |   static getBasicRollData() { | ||||||
|     let rollData = { |     let rollData = { | ||||||
|       rollId: randomID(16), |       rollId: foundry.utils.randomID(16), | ||||||
|       bonusMalusPerso: 0, |       bonusMalusPerso: 0, | ||||||
|       bonusMalusSituation: 0, |       bonusMalusSituation: 0, | ||||||
|       bonusMalusDef: 0, |       bonusMalusDef: 0, | ||||||
| @@ -413,8 +548,8 @@ export class MaleficesUtility { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static createChatWithRollMode(name, chatOptions) { |   static async createChatWithRollMode(name, chatOptions) { | ||||||
|     return this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions) |     return await this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-archetypes/000041.ldb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-archetypes/000044.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								packs/malefices-archetypes/CURRENT
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | MANIFEST-000042 | ||||||
							
								
								
									
										0
									
								
								packs/malefices-archetypes/LOCK
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								packs/malefices-archetypes/LOG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | |||||||
|  | 2025/09/29-07:31:55.732840 7f68515fa6c0 Recovering log #39 | ||||||
|  | 2025/09/29-07:31:55.762660 7f68515fa6c0 Delete type=3 #36 | ||||||
|  | 2025/09/29-07:31:55.762738 7f68515fa6c0 Delete type=0 #39 | ||||||
|  | 2025/09/29-07:33:20.941480 7f684affd6c0 Level-0 table #45: started | ||||||
|  | 2025/09/29-07:33:20.941516 7f684affd6c0 Level-0 table #45: 0 bytes OK | ||||||
|  | 2025/09/29-07:33:20.968021 7f684affd6c0 Delete type=0 #43 | ||||||
|  | 2025/09/29-07:33:20.991797 7f684affd6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										16
									
								
								packs/malefices-archetypes/LOG.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | |||||||
|  | 2025/06/12-20:31:25.313277 7f13a0ff96c0 Recovering log #35 | ||||||
|  | 2025/06/12-20:31:25.315223 7f13a0ff96c0 Level-0 table #37: started | ||||||
|  | 2025/06/12-20:31:25.319146 7f13a0ff96c0 Level-0 table #37: 50829 bytes OK | ||||||
|  | 2025/06/12-20:31:25.329210 7f13a0ff96c0 Delete type=0 #35 | ||||||
|  | 2025/06/12-20:31:25.329273 7f13a0ff96c0 Delete type=3 #34 | ||||||
|  | 2025/06/12-20:37:12.699768 7f139fbff6c0 Level-0 table #40: started | ||||||
|  | 2025/06/12-20:37:12.699837 7f139fbff6c0 Level-0 table #40: 0 bytes OK | ||||||
|  | 2025/06/12-20:37:12.706246 7f139fbff6c0 Delete type=0 #38 | ||||||
|  | 2025/06/12-20:37:12.737419 7f139fbff6c0 Manual compaction at level-0 from '!items!2HWSdXDSFei9KC6y' @ 72057594037927935 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at '!items!xtYE2kVIfNtrXSoU' @ 92 : 1 | ||||||
|  | 2025/06/12-20:37:12.737429 7f139fbff6c0 Compacting 1@0 + 1@1 files | ||||||
|  | 2025/06/12-20:37:12.742004 7f139fbff6c0 Generated table #41@0: 23 keys, 50829 bytes | ||||||
|  | 2025/06/12-20:37:12.742024 7f139fbff6c0 Compacted 1@0 + 1@1 files => 50829 bytes | ||||||
|  | 2025/06/12-20:37:12.748178 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] | ||||||
|  | 2025/06/12-20:37:12.748270 7f139fbff6c0 Delete type=2 #33 | ||||||
|  | 2025/06/12-20:37:12.748375 7f139fbff6c0 Delete type=2 #37 | ||||||
|  | 2025/06/12-20:37:12.748448 7f139fbff6c0 Manual compaction at level-0 from '!items!xtYE2kVIfNtrXSoU' @ 92 : 1 .. '!items!xtYE2kVIfNtrXSoU' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-archetypes/MANIFEST-000042
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-archetypes/lost/000024.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-archetypes/lost/000025.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-archetypes/lost/MANIFEST-000023
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-armes/000041.ldb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-armes/000044.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								packs/malefices-armes/CURRENT
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | MANIFEST-000042 | ||||||
							
								
								
									
										0
									
								
								packs/malefices-armes/LOCK
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								packs/malefices-armes/LOG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | |||||||
|  | 2025/09/29-07:31:55.700298 7f6850df96c0 Recovering log #39 | ||||||
|  | 2025/09/29-07:31:55.730618 7f6850df96c0 Delete type=3 #36 | ||||||
|  | 2025/09/29-07:31:55.730700 7f6850df96c0 Delete type=0 #39 | ||||||
|  | 2025/09/29-07:33:20.890444 7f684affd6c0 Level-0 table #45: started | ||||||
|  | 2025/09/29-07:33:20.890504 7f684affd6c0 Level-0 table #45: 0 bytes OK | ||||||
|  | 2025/09/29-07:33:20.919482 7f684affd6c0 Delete type=0 #43 | ||||||
|  | 2025/09/29-07:33:20.991768 7f684affd6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										16
									
								
								packs/malefices-armes/LOG.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | |||||||
|  | 2025/06/12-20:31:25.295914 7f13a1ffb6c0 Recovering log #35 | ||||||
|  | 2025/06/12-20:31:25.296128 7f13a1ffb6c0 Level-0 table #37: started | ||||||
|  | 2025/06/12-20:31:25.299700 7f13a1ffb6c0 Level-0 table #37: 2083 bytes OK | ||||||
|  | 2025/06/12-20:31:25.309703 7f13a1ffb6c0 Delete type=0 #35 | ||||||
|  | 2025/06/12-20:31:25.309800 7f13a1ffb6c0 Delete type=3 #34 | ||||||
|  | 2025/06/12-20:37:12.678958 7f139fbff6c0 Level-0 table #40: started | ||||||
|  | 2025/06/12-20:37:12.679060 7f139fbff6c0 Level-0 table #40: 0 bytes OK | ||||||
|  | 2025/06/12-20:37:12.686243 7f139fbff6c0 Delete type=0 #38 | ||||||
|  | 2025/06/12-20:37:12.706447 7f139fbff6c0 Manual compaction at level-0 from '!items!5J6qIaWdnhEGMAXJ' @ 72057594037927935 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at '!items!nkRQU81L1gWOfaeo' @ 36 : 1 | ||||||
|  | 2025/06/12-20:37:12.706466 7f139fbff6c0 Compacting 1@0 + 1@1 files | ||||||
|  | 2025/06/12-20:37:12.710210 7f139fbff6c0 Generated table #41@0: 9 keys, 2083 bytes | ||||||
|  | 2025/06/12-20:37:12.710233 7f139fbff6c0 Compacted 1@0 + 1@1 files => 2083 bytes | ||||||
|  | 2025/06/12-20:37:12.716905 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] | ||||||
|  | 2025/06/12-20:37:12.717210 7f139fbff6c0 Delete type=2 #33 | ||||||
|  | 2025/06/12-20:37:12.717533 7f139fbff6c0 Delete type=2 #37 | ||||||
|  | 2025/06/12-20:37:12.748427 7f139fbff6c0 Manual compaction at level-0 from '!items!nkRQU81L1gWOfaeo' @ 36 : 1 .. '!items!nkRQU81L1gWOfaeo' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-armes/MANIFEST-000042
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-armes/lost/000024.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-armes/lost/000025.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-armes/lost/MANIFEST-000023
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										3
									
								
								packs/malefices-macros.db
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | |||||||
|  | {"name":"Résumé des PJs pour le MJ","type":"chat","scope":"global","author":"R9gIh86vXDB4IFn1","img":"systems/fvtt-malefices/images/icons/resume.webp","command":"/resume","flags":{"core":{"sourceId":"Macro.ulj2PgchTQVE1VV4"}},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.1.1","coreVersion":"10.291","createdTime":1677422022018,"modifiedTime":1677422143283,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"folder":null,"sort":0,"_id":"ESV4er8Hy6liMOC3"} | ||||||
|  | {"name":"Tirage des tarots","type":"chat","scope":"global","author":"R9gIh86vXDB4IFn1","img":"systems/fvtt-malefices/images/icons/tirage.webp","command":"/tirage","flags":{"core":{"sourceId":"Macro.ulj2PgchTQVE1VV4"}},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.1.1","coreVersion":"10.291","createdTime":1677422022018,"modifiedTime":1677422144635,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"folder":null,"sort":0,"_id":"sVKXJsiG9KAaBglV"} | ||||||
|  | {"name":"Tirer une carte","type":"chat","command":"/carte","author":"R9gIh86vXDB4IFn1","img":"systems/fvtt-malefices/images/icons/tirer.webp","scope":"global","flags":{"core":{"sourceId":"Macro.P2dPA3CA5ZjOwDeE"}},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.1.1","coreVersion":"10.291","createdTime":1677421496447,"modifiedTime":1677422146138,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"folder":null,"sort":0,"_id":"zDPgmHiwNxBWhoYz"} | ||||||
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-macros/000041.ldb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-macros/000044.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								packs/malefices-macros/CURRENT
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | MANIFEST-000042 | ||||||
							
								
								
									
										0
									
								
								packs/malefices-macros/LOCK
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								packs/malefices-macros/LOG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | |||||||
|  | 2025/09/29-07:31:55.765046 7f684bfff6c0 Recovering log #39 | ||||||
|  | 2025/09/29-07:31:55.805924 7f684bfff6c0 Delete type=3 #36 | ||||||
|  | 2025/09/29-07:31:55.806008 7f684bfff6c0 Delete type=0 #39 | ||||||
|  | 2025/09/29-07:33:20.968205 7f684affd6c0 Level-0 table #45: started | ||||||
|  | 2025/09/29-07:33:20.968257 7f684affd6c0 Level-0 table #45: 0 bytes OK | ||||||
|  | 2025/09/29-07:33:20.991626 7f684affd6c0 Delete type=0 #43 | ||||||
|  | 2025/09/29-07:33:20.991810 7f684affd6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										16
									
								
								packs/malefices-macros/LOG.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | |||||||
|  | 2025/06/12-20:31:25.333075 7f13a17fa6c0 Recovering log #35 | ||||||
|  | 2025/06/12-20:31:25.333133 7f13a17fa6c0 Level-0 table #37: started | ||||||
|  | 2025/06/12-20:31:25.336454 7f13a17fa6c0 Level-0 table #37: 843 bytes OK | ||||||
|  | 2025/06/12-20:31:25.347582 7f13a17fa6c0 Delete type=0 #35 | ||||||
|  | 2025/06/12-20:31:25.347664 7f13a17fa6c0 Delete type=3 #34 | ||||||
|  | 2025/06/12-20:37:12.686350 7f139fbff6c0 Level-0 table #40: started | ||||||
|  | 2025/06/12-20:37:12.686369 7f139fbff6c0 Level-0 table #40: 0 bytes OK | ||||||
|  | 2025/06/12-20:37:12.693290 7f139fbff6c0 Delete type=0 #38 | ||||||
|  | 2025/06/12-20:37:12.717660 7f139fbff6c0 Manual compaction at level-0 from '!macros!ESV4er8Hy6liMOC3' @ 72057594037927935 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at '!macros!zDPgmHiwNxBWhoYz' @ 12 : 1 | ||||||
|  | 2025/06/12-20:37:12.717670 7f139fbff6c0 Compacting 1@0 + 1@1 files | ||||||
|  | 2025/06/12-20:37:12.720897 7f139fbff6c0 Generated table #41@0: 3 keys, 843 bytes | ||||||
|  | 2025/06/12-20:37:12.720919 7f139fbff6c0 Compacted 1@0 + 1@1 files => 843 bytes | ||||||
|  | 2025/06/12-20:37:12.727004 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] | ||||||
|  | 2025/06/12-20:37:12.727078 7f139fbff6c0 Delete type=2 #33 | ||||||
|  | 2025/06/12-20:37:12.727156 7f139fbff6c0 Delete type=2 #37 | ||||||
|  | 2025/06/12-20:37:12.748434 7f139fbff6c0 Manual compaction at level-0 from '!macros!zDPgmHiwNxBWhoYz' @ 12 : 1 .. '!macros!zDPgmHiwNxBWhoYz' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-macros/MANIFEST-000042
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-macros/lost/000024.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-macros/lost/000025.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-macros/lost/MANIFEST-000023
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -1,22 +1,22 @@ | |||||||
| {"name":"Le Moine","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Moine_600%20dpi.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053851,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"1DRKmbzGzbCRCswc"} | {"name":"Le Moine","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Moine_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":9,"numericvaluedown":14,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"1DRKmbzGzbCRCswc"} | ||||||
| {"name":"La Lune Noire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Lune%20Noire_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053846,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"6jHm4eWelq7eLKwU"} | {"name":"La Lune Noire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Lune%20Noire_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":18,"numericvaluedown":5,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"6jHm4eWelq7eLKwU"} | ||||||
| {"name":"Hippocrate","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Hippocrate_600%20dpi.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053843,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"BCQenQMvFjLKkl56"} | {"name":"Hippocrate","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Hippocrate_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":16,"numericvaluedown":7,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"BCQenQMvFjLKkl56"} | ||||||
| {"name":"Eve","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Eve_600%20dpi.webp","system":{"tarottype":"mineur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053842,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IJaK9oxcsamMs4pw"} | {"name":"Eve","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Eve_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":3,"numericvaluedown":20,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IJaK9oxcsamMs4pw"} | ||||||
| {"name":"Le Sorcier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Sorcier_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053852,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IwsZkMHLKGuCGUf7"} | {"name":"Le Sorcier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Sorcier_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":22,"numericvaluedown":1,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IwsZkMHLKGuCGUf7"} | ||||||
| {"name":"La Mort","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20Mort_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053847,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"MHdmnX0tbbjhPbA0"} | {"name":"La Mort","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20Mort_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":13,"numericvaluedown":10,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"MHdmnX0tbbjhPbA0"} | ||||||
| {"name":"L'Artiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Artiste_600%20dpi.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053845,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"NQBZmrYhEiyNxEo2"} | {"name":"L'Artiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Artiste_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":1,"numericvaluedown":22,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"NQBZmrYhEiyNxEo2"} | ||||||
| {"name":"Le Savetier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Savetier_600%20dpi%20copie.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053852,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"SClVaCgZjZoR1WiD"} | {"name":"Le Savetier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Savetier_600%20dpi%20copie.webp","system":{"tarottype":"metier","numericvalueup":12,"numericvaluedown":11,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"SClVaCgZjZoR1WiD"} | ||||||
| {"name":"La Roue de la Fortune","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20roue%20de%20la%20fortune_600%20dpi.webp","system":{"tarottype":"mineur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053847,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WRILaKwS1cjxZGRk"} | {"name":"La Roue de la Fortune","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20roue%20de%20la%20fortune_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":10,"numericvaluedown":13,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WRILaKwS1cjxZGRk"} | ||||||
| {"name":"L'Alchimiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Alchimiste_600%20dpi.webp","system":{"tarottype":"mineur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053844,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WlsCeal346QfJweB"} | {"name":"L'Alchimiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Alchimiste_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":19,"numericvaluedown":4,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WlsCeal346QfJweB"} | ||||||
| {"name":"L'Archange","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archange_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053844,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"bVvGkOVe3BQeK7HR"} | {"name":"L'Archange","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archange_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":2,"numericvaluedown":21,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"bVvGkOVe3BQeK7HR"} | ||||||
| {"name":"La Chance","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Chance_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053846,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ba7fmG0dYpV2jpIv"} | {"name":"La Chance","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Chance_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":7,"numericvaluedown":16,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ba7fmG0dYpV2jpIv"} | ||||||
| {"name":"Le Vicaire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Vicaire_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053853,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dbc8W1qD0kj5rQ4s"} | {"name":"Le Vicaire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Vicaire_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":5,"numericvaluedown":18,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dbc8W1qD0kj5rQ4s"} | ||||||
| {"name":"Le Juge","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Le%20Juge_600%20dpi.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053849,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dkvHSWzgbOqbykUL"} | {"name":"Le Juge","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Le%20Juge_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":8,"numericvaluedown":15,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dkvHSWzgbOqbykUL"} | ||||||
| {"name":"Le Diable","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Diable_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053848,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"earXcKB3NZ9sM8S7"} | {"name":"Le Diable","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Diable_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":15,"numericvaluedown":8,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"earXcKB3NZ9sM8S7"} | ||||||
| {"name":"Le Centurion","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Centurion_600%20dpi.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053848,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"fIHWGqwcubToEjOK"} | {"name":"Le Centurion","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Centurion_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":11,"numericvaluedown":12,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"fIHWGqwcubToEjOK"} | ||||||
| {"name":"Le Cabaliste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Cabaliste_600%20dpi.webp","system":{"tarottype":"mineur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053847,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"gS7fULIr9lPCl5Vb"} | {"name":"Le Cabaliste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Cabaliste_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":17,"numericvaluedown":6,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"gS7fULIr9lPCl5Vb"} | ||||||
| {"name":"Adam","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Adam_600%20dpi.webp","system":{"tarottype":"mineur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053841,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ooRr6cSNg73cPyaU"} | {"name":"Adam","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Adam_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":4,"numericvaluedown":19,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ooRr6cSNg73cPyaU"} | ||||||
| {"name":"Le Medium","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Medium_600%20dpi.webp","system":{"tarottype":"mineur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053850,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"rOgagyXv5RWxvyBa"} | {"name":"Le Medium","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Medium_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":6,"numericvaluedown":17,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"rOgagyXv5RWxvyBa"} | ||||||
| {"name":"L'Archiviste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archiviste_600%20dpi.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053845,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wHc7WwyWPZIqt219"} | {"name":"L'Archiviste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archiviste_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":14,"numericvaluedown":9,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wHc7WwyWPZIqt219"} | ||||||
| {"name":"Le Laboureur","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Laboureur_600%20dpi.webp","system":{"tarottype":"metier","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053850,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wLFdvRd9eLiCtc7b"} | {"name":"Le Laboureur","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Laboureur_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":21,"numericvaluedown":2,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wLFdvRd9eLiCtc7b"} | ||||||
| {"name":"Le Grand Livre","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Grand%20Livre_600%20dpi.webp","system":{"tarottype":"majeur","isreversed":false,"description":""},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.3","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675372053849,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"zbGGMEQFdwVdlKAf"} | {"name":"Le Grand Livre","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Grand%20Livre_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":20,"numericvaluedown":3,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"zbGGMEQFdwVdlKAf"} | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-tarots/000041.ldb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-tarots/000044.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								packs/malefices-tarots/CURRENT
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | MANIFEST-000042 | ||||||
							
								
								
									
										0
									
								
								packs/malefices-tarots/LOCK
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								packs/malefices-tarots/LOG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | |||||||
|  | 2025/09/29-07:31:55.665720 7f684bfff6c0 Recovering log #39 | ||||||
|  | 2025/09/29-07:31:55.697269 7f684bfff6c0 Delete type=3 #36 | ||||||
|  | 2025/09/29-07:31:55.697384 7f684bfff6c0 Delete type=0 #39 | ||||||
|  | 2025/09/29-07:33:20.919606 7f684affd6c0 Level-0 table #45: started | ||||||
|  | 2025/09/29-07:33:20.919643 7f684affd6c0 Level-0 table #45: 0 bytes OK | ||||||
|  | 2025/09/29-07:33:20.941329 7f684affd6c0 Delete type=0 #43 | ||||||
|  | 2025/09/29-07:33:20.991782 7f684affd6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										16
									
								
								packs/malefices-tarots/LOG.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | |||||||
|  | 2025/06/12-20:31:25.277690 7f13a17fa6c0 Recovering log #35 | ||||||
|  | 2025/06/12-20:31:25.278265 7f13a17fa6c0 Level-0 table #37: started | ||||||
|  | 2025/06/12-20:31:25.282099 7f13a17fa6c0 Level-0 table #37: 4074 bytes OK | ||||||
|  | 2025/06/12-20:31:25.291692 7f13a17fa6c0 Delete type=0 #35 | ||||||
|  | 2025/06/12-20:31:25.291746 7f13a17fa6c0 Delete type=3 #34 | ||||||
|  | 2025/06/12-20:37:12.693368 7f139fbff6c0 Level-0 table #40: started | ||||||
|  | 2025/06/12-20:37:12.693391 7f139fbff6c0 Level-0 table #40: 0 bytes OK | ||||||
|  | 2025/06/12-20:37:12.699567 7f139fbff6c0 Delete type=0 #38 | ||||||
|  | 2025/06/12-20:37:12.727201 7f139fbff6c0 Manual compaction at level-0 from '!items!1DRKmbzGzbCRCswc' @ 72057594037927935 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at '!items!zbGGMEQFdwVdlKAf' @ 88 : 1 | ||||||
|  | 2025/06/12-20:37:12.727206 7f139fbff6c0 Compacting 1@0 + 1@1 files | ||||||
|  | 2025/06/12-20:37:12.730258 7f139fbff6c0 Generated table #41@0: 22 keys, 4074 bytes | ||||||
|  | 2025/06/12-20:37:12.730268 7f139fbff6c0 Compacted 1@0 + 1@1 files => 4074 bytes | ||||||
|  | 2025/06/12-20:37:12.737017 7f139fbff6c0 compacted to: files[ 0 1 0 0 0 0 0 ] | ||||||
|  | 2025/06/12-20:37:12.737151 7f139fbff6c0 Delete type=2 #33 | ||||||
|  | 2025/06/12-20:37:12.737310 7f139fbff6c0 Delete type=2 #37 | ||||||
|  | 2025/06/12-20:37:12.748441 7f139fbff6c0 Manual compaction at level-0 from '!items!zbGGMEQFdwVdlKAf' @ 88 : 1 .. '!items!zbGGMEQFdwVdlKAf' @ 0 : 0; will stop at (end) | ||||||
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-tarots/MANIFEST-000042
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-tarots/lost/000024.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								packs/malefices-tarots/lost/000025.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								packs/malefices-tarots/lost/MANIFEST-000023
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -39,7 +39,7 @@ | |||||||
|  |  | ||||||
| /*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/ | /*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/ | ||||||
| /* Global styles & Font */ | /* Global styles & Font */ | ||||||
| .window-app { | .fvtt-malefices .window-app { | ||||||
| text-align: justify; | text-align: justify; | ||||||
| font-size: 16px; | font-size: 16px; | ||||||
| letter-spacing: 1px; | letter-spacing: 1px; | ||||||
| @@ -49,7 +49,7 @@ | |||||||
| .sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item { | .sheet header.sheet-header h1 input, .window-app .window-header, #actors .directory-list, #navigation #scene-list .scene.nav-item { | ||||||
| font-size: 1.0rem; | font-size: 1.0rem; | ||||||
| } /* For title, sidebar character and scene */ | } /* For title, sidebar character and scene */ | ||||||
| .sheet nav.sheet-tabs { | .fvtt-malefices .sheet nav.sheet-tabs { | ||||||
| font-size: 0.8rem; | font-size: 0.8rem; | ||||||
| } /* For nav and title */ | } /* For nav and title */ | ||||||
| .window-app input, .fvtt-malefices .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle { | .window-app input, .fvtt-malefices .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle { | ||||||
| @@ -235,6 +235,11 @@ table {border: 1px solid #7a7971;} | |||||||
|   object-position: 50% 0; |   object-position: 50% 0; | ||||||
|   border-width: 0px; |   border-width: 0px; | ||||||
| } | } | ||||||
|  | .profile-img-container { | ||||||
|  |   margin-right: 0.2rem; | ||||||
|  |   max-width: 140px; | ||||||
|  |   width: 140px; | ||||||
|  | } | ||||||
|  |  | ||||||
| .button-img { | .button-img { | ||||||
|   vertical-align: baseline; |   vertical-align: baseline; | ||||||
| @@ -396,7 +401,7 @@ li.folder > .folder-header h3 { | |||||||
|  |  | ||||||
| /* ======================================== */ | /* ======================================== */ | ||||||
| /* Sheet  */ | /* Sheet  */ | ||||||
| .window-app.sheet .window-content .sheet-header{ | .fvtt-malefices .window-app.sheet .window-content .sheet-header{ | ||||||
|   color: rgba(19, 18, 18, 0.95); |   color: rgba(19, 18, 18, 0.95); | ||||||
|   background: url("../images/ui/background_01_clear.webp"); |   background: url("../images/ui/background_01_clear.webp"); | ||||||
|   /*background: #494e6b;*/ |   /*background: #494e6b;*/ | ||||||
| @@ -442,7 +447,7 @@ select { | |||||||
|   margin-left: 2px; |   margin-left: 2px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .window-app .window-content, .window-app.sheet .window-content .sheet-body{ | .fvtt-malefices .window-app .window-content, .fvtt-malefices .window-app.sheet .window-content .sheet-body{ | ||||||
|   font-size: 0.8rem; |   font-size: 0.8rem; | ||||||
|   /*background: url("../images/ui/pc_sheet_bg.webp") repeat left top;*/ |   /*background: url("../images/ui/pc_sheet_bg.webp") repeat left top;*/ | ||||||
|   background: url("../images/ui/background_01_clear.webp"); |   background: url("../images/ui/background_01_clear.webp"); | ||||||
| @@ -460,7 +465,7 @@ section.sheet-body{padding: 0.25rem 0.5rem;} | |||||||
|   padding: 0; |   padding: 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| .sheet nav.sheet-tabs { | nav.sheet-tabs { | ||||||
|   font-size: 1.2rem; |   font-size: 1.2rem; | ||||||
|   font-weight: bold; |   font-weight: bold; | ||||||
|   height: 3rem; |   height: 3rem; | ||||||
| @@ -476,11 +481,23 @@ section.sheet-body{padding: 0.25rem 0.5rem;} | |||||||
|   color:beige; |   color:beige; | ||||||
| } | } | ||||||
|  |  | ||||||
| /*  background: rgb(245,245,240) url("../images/ui/fond4.webp") repeat left top;*/ | /* Dice tray specific overrides */ | ||||||
|  | .dice-tray button svg * { | ||||||
|  |   fill: #6d5923 !important; | ||||||
|  | } | ||||||
|  | .dice-tray input[type="text"] { | ||||||
|  |   color: #6d5923 !important; | ||||||
|  | } | ||||||
|  | .dice-tray button { | ||||||
|  |   color: #6d5923 !important; | ||||||
|  | } | ||||||
|  |  | ||||||
| nav.sheet-tabs .item { | nav.sheet-tabs .item { | ||||||
|   position: relative; |   position: relative; | ||||||
|   padding: 0 0.25rem; |   padding: 0 0.25rem; | ||||||
|  |   color:beige; | ||||||
|  |   margin-top: 4px; | ||||||
|  |   margin-bottom: 4px; | ||||||
| } | } | ||||||
|  |  | ||||||
| nav.sheet-tabs .item:after { | nav.sheet-tabs .item:after { | ||||||
| @@ -490,7 +507,7 @@ nav.sheet-tabs .item:after { | |||||||
|   right: 0; |   right: 0; | ||||||
|   height: 2rem; |   height: 2rem; | ||||||
|   width: 1px; |   width: 1px; | ||||||
|   border-right: 1px dashed rgba(52, 52, 52, 0.25); |   /*border-right: 1px dashed rgba(52, 52, 52, 0.25);*/ | ||||||
| } | } | ||||||
|  |  | ||||||
| .sheet .tab[data-tab] { | .sheet .tab[data-tab] { | ||||||
| @@ -754,6 +771,10 @@ ul, li { | |||||||
| #token-hud .status-effects.active{ | #token-hud .status-effects.active{ | ||||||
|   z-index: 2; |   z-index: 2; | ||||||
| } | } | ||||||
|  | .token-sheet .window-content .flexcol .sheet-tabs { | ||||||
|  |   font-size: 0.8rem; | ||||||
|  | } | ||||||
|  |  | ||||||
| /* ======================================== */ | /* ======================================== */ | ||||||
| .item-checkbox { | .item-checkbox { | ||||||
|   height: 25px; |   height: 25px; | ||||||
| @@ -794,6 +815,9 @@ ul, li { | |||||||
|   color: rgba(19, 18, 18, 0.95); |   color: rgba(19, 18, 18, 0.95); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #sidebar .scene { | ||||||
|  |   color: rgba(237, 240, 199, 0.95); | ||||||
|  | } | ||||||
| /*  background: rgb(105,85,65) url("../images/ui/texture_feuille_perso_onglets.webp") no-repeat right bottom;*/ | /*  background: rgb(105,85,65) url("../images/ui/texture_feuille_perso_onglets.webp") no-repeat right bottom;*/ | ||||||
|  |  | ||||||
| #sidebar.collapsed { | #sidebar.collapsed { | ||||||
| @@ -950,8 +974,6 @@ ul, li { | |||||||
| } | } | ||||||
|  |  | ||||||
| #sidebar #sidebar-tabs i{ | #sidebar #sidebar-tabs i{ | ||||||
|   width: 25px; |  | ||||||
|   height: 25px; |  | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   background-position:center; |   background-position:center; | ||||||
|   background-size:cover; |   background-size:cover; | ||||||
| @@ -1237,6 +1259,11 @@ ul, li { | |||||||
|   max-width: 10rem; |   max-width: 10rem; | ||||||
|   min-width: 10rem; |   min-width: 10rem; | ||||||
| } | } | ||||||
|  | .item-name-label-short { | ||||||
|  |   flex-grow:1; | ||||||
|  |   max-width: 4rem; | ||||||
|  |   min-width: 4rem; | ||||||
|  | } | ||||||
| .item-name-label-medium { | .item-name-label-medium { | ||||||
|   margin-top: 4px; |   margin-top: 4px; | ||||||
|   flex-grow:2; |   flex-grow:2; | ||||||
| @@ -1299,3 +1326,17 @@ ul, li { | |||||||
|   max-width: 16px; |   max-width: 16px; | ||||||
|   max-height: 12px; |   max-height: 12px; | ||||||
| } | } | ||||||
|  | .flip-tarot { | ||||||
|  |   transform: scaleY(-1); | ||||||
|  | } | ||||||
|  | .tarot-fixed-width { | ||||||
|  |   width: 140px; | ||||||
|  |   max-width: 140px; | ||||||
|  | } | ||||||
|  | .tarot-title { | ||||||
|  |   text-align: center; | ||||||
|  |   font-weight: bold; | ||||||
|  | } | ||||||
|  | .character-summary-rollable { | ||||||
|  |   text-decoration: underline; | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								system.json
									
									
									
									
									
								
							
							
						
						| @@ -3,8 +3,10 @@ | |||||||
|   "esmodules": [ |   "esmodules": [ | ||||||
|     "modules/malefices-main.js" |     "modules/malefices-main.js" | ||||||
|   ], |   ], | ||||||
|   "gridDistance": 1, |   "grid": { | ||||||
|   "gridUnits": "u", |     "distance": 2, | ||||||
|  |     "units": "m" | ||||||
|  |   }, | ||||||
|   "languages": [ |   "languages": [ | ||||||
|     { |     { | ||||||
|       "lang": "fr", |       "lang": "fr", | ||||||
| @@ -24,36 +26,56 @@ | |||||||
|       "type": "Item", |       "type": "Item", | ||||||
|       "label": "Tarots", |       "label": "Tarots", | ||||||
|       "name": "malefices-tarots", |       "name": "malefices-tarots", | ||||||
|       "path": "packs/malefices-tarots.db", |       "path": "packs/malefices-tarots", | ||||||
|       "system": "fvtt-malefices", |       "system": "fvtt-malefices", | ||||||
|       "private": false, |       "flags": {}, | ||||||
|       "flags": {} |       "ownership": { | ||||||
|  |         "PLAYER": "OBSERVER", | ||||||
|  |         "ASSISTANT": "OWNER" | ||||||
|  |       } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "type": "Item", |       "type": "Item", | ||||||
|       "label": "Armes", |       "label": "Armes", | ||||||
|       "name": "malefices-armes", |       "name": "malefices-armes", | ||||||
|       "path": "packs/malefices-armes.db", |       "path": "packs/malefices-armes", | ||||||
|       "system": "fvtt-malefices", |       "system": "fvtt-malefices", | ||||||
|       "private": false, |       "flags": {}, | ||||||
|       "flags": {} |       "ownership": { | ||||||
|  |         "PLAYER": "OBSERVER", | ||||||
|  |         "ASSISTANT": "OWNER" | ||||||
|  |       } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "type": "Item", |       "type": "Item", | ||||||
|       "label": "Archetypes", |       "label": "Archetypes", | ||||||
|       "name": "malefices-archetypes", |       "name": "malefices-archetypes", | ||||||
|       "path": "packs/malefices-archetypes.db", |       "path": "packs/malefices-archetypes", | ||||||
|       "system": "fvtt-malefices", |       "system": "fvtt-malefices", | ||||||
|       "private": false, |       "flags": {}, | ||||||
|       "flags": {} |       "ownership": { | ||||||
|  |         "PLAYER": "OBSERVER", | ||||||
|  |         "ASSISTANT": "OWNER" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "type": "Macro", | ||||||
|  |       "label": "Macros", | ||||||
|  |       "name": "malefices-macros", | ||||||
|  |       "path": "packs/malefices-macros", | ||||||
|  |       "system": "fvtt-malefices", | ||||||
|  |       "flags": {}, | ||||||
|  |       "ownership": { | ||||||
|  |         "PLAYER": "OBSERVER", | ||||||
|  |         "ASSISTANT": "OWNER" | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   ], |   ], | ||||||
|   "license": "LICENSE.txt", |   "license": "LICENSE.txt", | ||||||
|   "manifest": "https://www.uberwald.me/gitea/public/fvtt-malefices/raw/branch/master/system.json", |   "manifest": "https://www.uberwald.me/gitea/public/fvtt-malefices/raw/branch/master/system.json", | ||||||
|   "compatibility": { |   "compatibility": { | ||||||
|     "minimum": "10", |     "minimum": "13", | ||||||
|     "verified": "10", |     "verified": "13" | ||||||
|     "maximum": "10" |  | ||||||
|   }, |   }, | ||||||
|   "id": "fvtt-malefices", |   "id": "fvtt-malefices", | ||||||
|   "primaryTokenAttribute": "secondary.health", |   "primaryTokenAttribute": "secondary.health", | ||||||
| @@ -64,7 +86,7 @@ | |||||||
|   ], |   ], | ||||||
|   "title": "Maléfices, le Jeu de Rôle", |   "title": "Maléfices, le Jeu de Rôle", | ||||||
|   "url": "https://www.uberwald.me/gitea/public/fvtt-malefices", |   "url": "https://www.uberwald.me/gitea/public/fvtt-malefices", | ||||||
|   "version": "10.0.11", |   "version": "13.0.1", | ||||||
|   "download": "https://www.uberwald.me/gitea/public/fvtt-malefices/archive/fvtt-malefices-v10.0.11.zip", |   "download": "https://www.uberwald.me/gitea/public/fvtt-malefices/archive/fvtt-malefices-v13.0.1.zip", | ||||||
|   "background": "systems/fvtt-malefices/images/ui/malefice_welcome_page.webp" |   "background": "systems/fvtt-malefices/images/ui/malefice_welcome_page.webp" | ||||||
| } | } | ||||||
| @@ -1,8 +1,7 @@ | |||||||
| { | { | ||||||
|   "Actor": { |   "Actor": { | ||||||
|     "types": [ |     "types": [ | ||||||
|       "personnage", |       "personnage" | ||||||
|       "pnj" |  | ||||||
|     ], |     ], | ||||||
|     "templates": { |     "templates": { | ||||||
|       "biodata": { |       "biodata": { | ||||||
| @@ -26,6 +25,7 @@ | |||||||
|           "religion": "", |           "religion": "", | ||||||
|           "fantastique": "", |           "fantastique": "", | ||||||
|           "description": "", |           "description": "", | ||||||
|  |           "notes": "", | ||||||
|           "gmnotes": "" |           "gmnotes": "" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
| @@ -34,6 +34,8 @@ | |||||||
|         "lamesdestin": [], |         "lamesdestin": [], | ||||||
|         "pointdestin": 1, |         "pointdestin": 1, | ||||||
|         "fluide": 5, |         "fluide": 5, | ||||||
|  |         "mpmb": 0, | ||||||
|  |         "mpmn": 0, | ||||||
|         "attributs": { |         "attributs": { | ||||||
|           "constitution": { |           "constitution": { | ||||||
|             "label": "Constitution", |             "label": "Constitution", | ||||||
| @@ -62,25 +64,28 @@ | |||||||
|           }, |           }, | ||||||
|           "perception": { |           "perception": { | ||||||
|             "label": "Perception", |             "label": "Perception", | ||||||
|             "abbrev": "habilite", |             "abbrev": "perception", | ||||||
|             "value": 0, |             "value": 0, | ||||||
|             "max": 0 |             "max": 0 | ||||||
|           }, |           }, | ||||||
|           "spiritualite": { |           "spiritualite": { | ||||||
|             "label": "Spiritualite", |             "label": "Spiritualite", | ||||||
|             "abbrev": "spiritualite", |             "abbrev": "spiritualite", | ||||||
|             "hasmax": true, |             "hasmax": false, | ||||||
|  |             "iscard": true, | ||||||
|             "value": 0, |             "value": 0, | ||||||
|             "max": 0 |             "max": 0 | ||||||
|           }, |           }, | ||||||
|           "rationnalite": { |           "rationnalite": { | ||||||
|             "label": "Rationnalite", |             "label": "Rationnalite", | ||||||
|             "abbrev": "rationnalite", |             "abbrev": "rationnalite", | ||||||
|             "hasmax": true, |             "hasmax": false, | ||||||
|  |             "iscard": true, | ||||||
|             "value": 0, |             "value": 0, | ||||||
|             "max": 0 |             "max": 0 | ||||||
|           } |           } | ||||||
|         } |         }, | ||||||
|  |         "equipementlibre": "" | ||||||
|       }, |       }, | ||||||
|       "npccore": { |       "npccore": { | ||||||
|         "npctype": "", |         "npctype": "", | ||||||
| @@ -99,22 +104,36 @@ | |||||||
|       "arme", |       "arme", | ||||||
|       "equipement", |       "equipement", | ||||||
|       "archetype", |       "archetype", | ||||||
|       "tarot" |       "tarot", | ||||||
|  |       "sortilege", | ||||||
|  |       "elementbio" | ||||||
|     ], |     ], | ||||||
|     "templates": {}, |     "templates": {}, | ||||||
|  |     "elementbio": { | ||||||
|  |       "description": "" | ||||||
|  |     }, | ||||||
|     "equipement": { |     "equipement": { | ||||||
|       "description": "" |       "description": "" | ||||||
|     }, |     }, | ||||||
|     "tarot": { |     "tarot": { | ||||||
|       "tarottype": "", |       "tarottype": "", | ||||||
|       "isreversed": false, |       "numericvalueup": 0, | ||||||
|  |       "numericvaluedown": 0, | ||||||
|  |       "isdualside": false, | ||||||
|  |       "ispositif": true, | ||||||
|  |       "isgm": false, | ||||||
|       "description": "" |       "description": "" | ||||||
|     }, |     }, | ||||||
|     "archetype":  { |     "archetype":  { | ||||||
|       "lametutelaire": "" |       "lametutelaire": "", | ||||||
|  |       "description": "" | ||||||
|  |     }, | ||||||
|  |     "sortilege":  { | ||||||
|  |       "seuil": 0, | ||||||
|  |       "description": "" | ||||||
|     }, |     }, | ||||||
|     "arme": { |     "arme": { | ||||||
|       "armetype": 0, |       "armetype": "", | ||||||
|       "porteecourte": "", |       "porteecourte": "", | ||||||
|       "porteemoyenne": "", |       "porteemoyenne": "", | ||||||
|       "dommagenormale": 0, |       "dommagenormale": 0, | ||||||
|   | |||||||
| @@ -4,7 +4,11 @@ | |||||||
|   <header class="sheet-header"> |   <header class="sheet-header"> | ||||||
|     <div class="header-fields"> |     <div class="header-fields"> | ||||||
|       <div class="flexrow"> |       <div class="flexrow"> | ||||||
|  |  | ||||||
|  |         <div class="profile-img-container"> | ||||||
|           <img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> |           <img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|         <div class="flexcol"> |         <div class="flexcol"> | ||||||
|           <h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> |           <h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> | ||||||
|  |  | ||||||
| @@ -31,7 +35,7 @@ | |||||||
|   {{!-- Sheet Tab Navigation --}} |   {{!-- Sheet Tab Navigation --}} | ||||||
|   <nav class="sheet-tabs tabs" data-group="primary"> |   <nav class="sheet-tabs tabs" data-group="primary"> | ||||||
|     <a class="item" data-tab="main">Principal</a> |     <a class="item" data-tab="main">Principal</a> | ||||||
|     <a class="item" data-tab="equipements">Equipements</a> |     <a class="item" data-tab="equipements">Equipement</a> | ||||||
|     <a class="item" data-tab="biodata">Biographie</a> |     <a class="item" data-tab="biodata">Biographie</a> | ||||||
|     <a class="item" data-tab="notes">Notes</a> |     <a class="item" data-tab="notes">Notes</a> | ||||||
|   </nav> |   </nav> | ||||||
| @@ -53,7 +57,14 @@ | |||||||
|             </li> |             </li> | ||||||
|             {{#each system.attributs as |attr key|}} |             {{#each system.attributs as |attr key|}} | ||||||
|             <li class="item flexrow list-item"> |             <li class="item flexrow list-item"> | ||||||
|               <span class="item-name-label-long"><a class="roll-attribut" data-attr-key="{{key}}">{{attr.label}}<i class="fa-solid fa-dice-d20"></i></a></span> |               <span class="item-name-label-long"> | ||||||
|  |                 <a class="roll-attribut" data-attr-key="{{key}}">{{attr.label}} | ||||||
|  |                 {{#if attr.iscard}} | ||||||
|  |                   <i class="fa-solid fa-cards-blank"></i> | ||||||
|  |                 {{else}} | ||||||
|  |                   <i class="fa-solid fa-dice-d20"></i> | ||||||
|  |                 {{/if}} | ||||||
|  |                 </a></span> | ||||||
|               <input type="text" class="item-field-label-short" name="system.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="Number"/> |               <input type="text" class="item-field-label-short" name="system.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="Number"/> | ||||||
|               {{#if attr.hasmax}} |               {{#if attr.hasmax}} | ||||||
|                 <input type="text" class="item-field-label-short" name="system.attributs.{{key}}.max" value="{{attr.max}}" data-dtype="Number"/> |                 <input type="text" class="item-field-label-short" name="system.attributs.{{key}}.max" value="{{attr.max}}" data-dtype="Number"/> | ||||||
| @@ -73,9 +84,17 @@ | |||||||
|  |  | ||||||
|             {{#if isGM}} |             {{#if isGM}} | ||||||
|             <li class="item flexrow list-item"> |             <li class="item flexrow list-item"> | ||||||
|               <span class="item-field-label-long">Fluide (MJ seulement)</span> |               <span class="item-field-label-long">Fluide (MJ)</span> | ||||||
|               <input type="text" class="item-field-label-short" name="system.fluide" value="{{system.fluide}}" data-dtype="Number"/> |               <input type="text" class="item-field-label-short" name="system.fluide" value="{{system.fluide}}" data-dtype="Number"/> | ||||||
|             </li> |             </li> | ||||||
|  |             <li class="item flexrow list-item"> | ||||||
|  |               <span class="item-field-label-long">MPMB (MJ)</span> | ||||||
|  |               <input type="text" class="item-field-label-short" name="system.mpmb" value="{{system.mpmb}}" data-dtype="Number"/> | ||||||
|  |             </li> | ||||||
|  |             <li class="item flexrow list-item"> | ||||||
|  |               <span class="item-field-label-long">MPMN (MJ)</span> | ||||||
|  |               <input type="text" class="item-field-label-short" name="system.mpmn" value="{{system.mpmn}}" data-dtype="Number"/> | ||||||
|  |             </li> | ||||||
|             {{/if}} |             {{/if}} | ||||||
|  |  | ||||||
|           </ul> |           </ul> | ||||||
| @@ -95,6 +114,32 @@ | |||||||
|             </li> |             </li> | ||||||
|             {{/each}} |             {{/each}} | ||||||
|           </ul> |           </ul> | ||||||
|  |  | ||||||
|  |           <ul class="item-list alternate-list"> | ||||||
|  |             <li class="item flexrow list-item items-title-bg"> | ||||||
|  |               <span class="item-name-label-header"> | ||||||
|  |                 <h3><label class="items-title-text">Elements biographiques</label></h3> | ||||||
|  |               </span> | ||||||
|  |               <div class="item-filler"> </div> | ||||||
|  |               <div class="item-controls item-controls-fixed"> | ||||||
|  |                 <a class="item-control item-add" data-type="elementbio" title="Create Item"><i class="fas fa-plus"></i></a> | ||||||
|  |               </div> | ||||||
|  |             </li> | ||||||
|  |  | ||||||
|  |             {{#each elementsbio as |elem key|}} | ||||||
|  |             <li class="item list-item flexrow list-item-shadow" data-item-id="{{elem._id}}"> | ||||||
|  |               <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" | ||||||
|  |                   src="{{elem.img}}" /></a> | ||||||
|  |               <span class="item-name-label">{{elem.name}}</span> | ||||||
|  |  | ||||||
|  |               <div class="item-filler"> </div> | ||||||
|  |               <div class="item-controls item-controls-fixed"> | ||||||
|  |                 <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> | ||||||
|  |               </div> | ||||||
|  |             </li> | ||||||
|  |             {{/each}} | ||||||
|  |           </ul> | ||||||
|  |  | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|       </div> |       </div> | ||||||
| @@ -104,6 +149,13 @@ | |||||||
|     {{!-- Equipement Tab --}} |     {{!-- Equipement Tab --}} | ||||||
|     <div class="tab equipements" data-group="primary" data-tab="equipements"> |     <div class="tab equipements" data-group="primary" data-tab="equipements"> | ||||||
|  |  | ||||||
|  |       <span class="item-name-label-header items-title-bg"> | ||||||
|  |           <h3><label class="items-title-text">Equipements (saisie libre)</label></h3> | ||||||
|  |       </span> | ||||||
|  |       <div class="form-group small-editor"> | ||||||
|  |         {{editor equipementlibre target="system.equipementlibre" button=true owner=owner editable=editable}} | ||||||
|  |       </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-name-label-header"> |           <span class="item-name-label-header"> | ||||||
| @@ -119,7 +171,7 @@ | |||||||
|             <label class="item-field-label-medium">Critique</label> |             <label class="item-field-label-medium">Critique</label> | ||||||
|           </span> |           </span> | ||||||
|           <div class="item-controls item-controls-fixed"> |           <div class="item-controls item-controls-fixed"> | ||||||
|             <a class="item-control item-add" data-type="weapon" title="Create Item"><i class="fas fa-plus"></i></a> |             <a class="item-control item-add" data-type="arme" title="Créer une arme"><i class="fas fa-plus"></i></a> | ||||||
|           </div> |           </div> | ||||||
|         </li> |         </li> | ||||||
|         {{#each armes as |arme key|}} |         {{#each armes as |arme key|}} | ||||||
| @@ -142,14 +194,14 @@ | |||||||
|       <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-name-label-header"> |           <span class="item-name-label-header"> | ||||||
|             <h3><label class="items-title-text">Equipements</label></h3> |             <h3><label class="items-title-text">Equipements (Items)</label></h3> | ||||||
|           </span> |           </span> | ||||||
|           <span class="item-field-label-long"> |           <span class="item-field-label-long"> | ||||||
|             <label class="short-label">Q.</label> |             <label class="short-label">Q.</label> | ||||||
|           </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="equipment" title="Create Item"><i class="fas fa-plus"></i></a> |             <a class="item-control item-add" data-type="equipement" title="Créer un équipement"><i class="fas fa-plus"></i></a> | ||||||
|           </div> |           </div> | ||||||
|  |  | ||||||
|         </li> |         </li> | ||||||
| @@ -167,30 +219,55 @@ | |||||||
|         {{/each}} |         {{/each}} | ||||||
|       </ul> |       </ul> | ||||||
|  |  | ||||||
|  |       <ul class="item-list alternate-list"> | ||||||
|  |         <li class="item flexrow list-item items-title-bg"> | ||||||
|  |           <span class="item-name-label-header"> | ||||||
|  |             <h3><label class="items-title-text">Sortilèges</label></h3> | ||||||
|  |           </span> | ||||||
|  |           <span class="item-field-label-medium"> | ||||||
|  |             <label class="short-label">Seuil</label> | ||||||
|  |           </span> | ||||||
|  |           <div class="item-filler"> </div> | ||||||
|  |           <div class="item-controls item-controls-fixed"> | ||||||
|  |             <a class="item-control item-add" data-type="sortilege" title="Créer un Sortilège"><i class="fas fa-plus"></i></a> | ||||||
|  |           </div> | ||||||
|  |  | ||||||
|  |         </li> | ||||||
|  |         {{#each sorts as |sort key|}} | ||||||
|  |         <li class="item list-item flexrow list-item-shadow" data-item-id="{{sort._id}}"> | ||||||
|  |           <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" | ||||||
|  |               src="{{sort.img}}" /></a> | ||||||
|  |           <span class="item-name-label">{{sort.name}}</span> | ||||||
|  |           <span class="item-field-label-medium"> | ||||||
|  |             <label class="short-label">{{sort.system.seuil}}</label> | ||||||
|  |           </span> | ||||||
|  |           <div class="item-filler"> </div> | ||||||
|  |           <div class="item-controls item-controls-fixed"> | ||||||
|  |             <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> | ||||||
|  |           </div> | ||||||
|  |         </li> | ||||||
|  |         {{/each}} | ||||||
|  |       </ul> | ||||||
|  |  | ||||||
|       <hr> |       <hr> | ||||||
|  |  | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     {{!-- Biography Tab --}} |     {{!-- Biography Tab --}} | ||||||
|     <div class="tab biodata" data-group="primary" data-tab="biodata"> |     <div class="tab biodata" data-group="primary" data-tab="biodata"> | ||||||
|       <div> |  | ||||||
|         <ul> |  | ||||||
|           <li class="item flexrow" data-item-id="{{archetype._id}}"> |  | ||||||
|             <label class="item-name-label-medium">Archetype : </label> |  | ||||||
|             <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" src="{{archetype.img}}" /></a> |  | ||||||
|             <span class="item-name-label-medium">{{archetype.name}}</span> |  | ||||||
|             <label class="item-name-label-long">Lame tutélaire : </label> |  | ||||||
|             <span class="item-name-label-medium">{{archetype.tarot.name}}</span> |  | ||||||
|             <div class="item-controls item-controls-fixed"> |  | ||||||
|               <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> |  | ||||||
|             </div> |  | ||||||
|           </li> |  | ||||||
|         </ul> |  | ||||||
|       </div> |  | ||||||
|  |  | ||||||
|       <div class="grid grid-2col"> |       <div class="grid grid-2col"> | ||||||
|         <div> |         <div> | ||||||
|           <ul class="item-list alternate-list"> |           <ul class="item-list alternate-list"> | ||||||
|  |             <li class="item flexrow" data-item-id="{{archetype._id}}"> | ||||||
|  |               <label class="item-name-label-medium">Archetype</label> | ||||||
|  |               <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" | ||||||
|  |                   src="{{archetype.img}}" /></a> | ||||||
|  |               <span class="item-name-label-medium">{{archetype.name}}</span> | ||||||
|  |               <div class="item-controls item-controls-fixed"> | ||||||
|  |                 <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> | ||||||
|  |               </div> | ||||||
|  |             </li> | ||||||
|             <li class="item flexrow"> |             <li class="item flexrow"> | ||||||
|               <label class="item-name-label-medium">Lieu de naissance</label> |               <label class="item-name-label-medium">Lieu de naissance</label> | ||||||
|               <input type="text" class="" name="system.biodata.lieunaissance" value="{{system.biodata.lieunaissance}}" |               <input type="text" class="" name="system.biodata.lieunaissance" value="{{system.biodata.lieunaissance}}" | ||||||
| @@ -216,6 +293,10 @@ | |||||||
|         </div> |         </div> | ||||||
|        <div> |        <div> | ||||||
|           <ul> |           <ul> | ||||||
|  |             <li class="item flexrow"> | ||||||
|  |               <label class="item-name-label-medium">Lame tutélaire</label> | ||||||
|  |               <span class="item-name-label-medium">{{archetype.tarot.name}}</span> | ||||||
|  |             </li> | ||||||
|             <li class="item flexrow"> |             <li class="item flexrow"> | ||||||
|               <label class="item-name-label-medium">Résidence</label> |               <label class="item-name-label-medium">Résidence</label> | ||||||
|               <input type="text" class="" name="system.biodata.residence" value="{{system.biodata.residence}}" data-dtype="String" /> |               <input type="text" class="" name="system.biodata.residence" value="{{system.biodata.residence}}" data-dtype="String" /> | ||||||
| @@ -254,8 +335,11 @@ | |||||||
|           <span class="item-name-label-header"> |           <span class="item-name-label-header"> | ||||||
|             <h3><label class="items-title-text">Tarots</label></h3> |             <h3><label class="items-title-text">Tarots</label></h3> | ||||||
|           </span> |           </span> | ||||||
|  |           <span class="item-field-label-medium"> | ||||||
|  |             <label class="item-field-label-medium">Sens</label> | ||||||
|  |           </span> | ||||||
|           <div class="item-controls item-controls-fixed"> |           <div class="item-controls item-controls-fixed"> | ||||||
|             <a class="item-control item-add" data-type="weapon" title="Create Item"><i class="fas fa-plus"></i></a> |             <a class="item-control item-add" data-type="tarot" title="Créer une lame de tarot"><i class="fas fa-plus"></i></a> | ||||||
|           </div> |           </div> | ||||||
|         </li> |         </li> | ||||||
|         {{#each tarots as |tarot key|}} |         {{#each tarots as |tarot key|}} | ||||||
| @@ -263,6 +347,7 @@ | |||||||
|           <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" |           <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" | ||||||
|               src="{{tarot.img}}" /></a> |               src="{{tarot.img}}" /></a> | ||||||
|           <span class="item-name-label">{{tarot.name}}</span> |           <span class="item-name-label">{{tarot.name}}</span> | ||||||
|  |           <span class="item-field-label-medium"><label>{{#if tarot.system.ispositif}}Positif{{else}}Négatif{{/if}}</label></span> | ||||||
|           <div class="item-filler"> </div> |           <div class="item-filler"> </div> | ||||||
|           {{#if @root.isGM}} |           {{#if @root.isGM}} | ||||||
|             <div class="item-controls item-controls-fixed"> |             <div class="item-controls item-controls-fixed"> | ||||||
| @@ -273,6 +358,36 @@ | |||||||
|         {{/each}} |         {{/each}} | ||||||
|       </ul> |       </ul> | ||||||
|  |  | ||||||
|  |       {{#if isGM}} | ||||||
|  |       <ul class="item-list alternate-list"> | ||||||
|  |         <li class="item flexrow list-item items-title-bg"> | ||||||
|  |           <span class="item-name-label-header"> | ||||||
|  |             <h3><label class="items-title-text">Tarot secret(MJ)</label></h3> | ||||||
|  |           </span> | ||||||
|  |           <span class="item-field-label-medium"> | ||||||
|  |             <label class="item-field-label-medium">Sens</label> | ||||||
|  |           </span> | ||||||
|  |           <div class="item-controls item-controls-fixed"> | ||||||
|  |             <a class="item-control item-add" data-type="tarot" title="Créer une lame de Tarot (secret)"><i class="fas fa-plus"></i></a> | ||||||
|  |           </div> | ||||||
|  |         </li> | ||||||
|  |         {{#each tarotsCache as |tarot key|}} | ||||||
|  |         <li class="item flexrow list-item list-item-shadow" data-item-id="{{tarot._id}}"> | ||||||
|  |           <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img" | ||||||
|  |               src="{{tarot.img}}" /></a> | ||||||
|  |           <span class="item-name-label">{{tarot.name}}</span> | ||||||
|  |           <span class="item-field-label-medium"><label>{{#if tarot.system.ispositif}}Positif{{else}}Négatif{{/if}}</label></span> | ||||||
|  |           <div class="item-filler"> </div> | ||||||
|  |           {{#if @root.isGM}} | ||||||
|  |             <div class="item-controls item-controls-fixed"> | ||||||
|  |               <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> | ||||||
|  |             </div> | ||||||
|  |           {{/if}} | ||||||
|  |         </li> | ||||||
|  |         {{/each}} | ||||||
|  |       </ul> | ||||||
|  |       {{/if}} | ||||||
|  |  | ||||||
|   </div> |   </div> | ||||||
|  |  | ||||||
|   <div class="tab notes" data-group="primary" data-tab="notes"> |   <div class="tab notes" data-group="primary" data-tab="notes"> | ||||||
| @@ -281,8 +396,7 @@ | |||||||
|           <h3><label class="items-title-text">Background</label></h3> |           <h3><label class="items-title-text">Background</label></h3> | ||||||
|       </span> |       </span> | ||||||
|       <div class="form-group editor"> |       <div class="form-group editor"> | ||||||
|         {{editor description target="system.biodata.description" button=true owner=owner |         {{editor description target="system.biodata.description" button=true owner=owner editable=editable}} | ||||||
|         editable=editable}} |  | ||||||
|       </div> |       </div> | ||||||
|       <hr> |       <hr> | ||||||
|       <span class="item-name-label-header items-title-bg"> |       <span class="item-name-label-header items-title-bg"> | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								templates/chat/chat-confrontation-result.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,37 @@ | |||||||
|  | <div class="chat-message-header"> | ||||||
|  |   {{#if actorImg}} | ||||||
|  |   <img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" /> | ||||||
|  |   {{/if}} | ||||||
|  |   <h4 class="chat-actor-name">{{alias}}</h4> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  |   <hr> | ||||||
|  |    | ||||||
|  |   {{#if img}} | ||||||
|  |   <div > | ||||||
|  |     <img class="chat-icon" src="{{img}}" alt="{{name}}" /> | ||||||
|  |   </div> | ||||||
|  |   {{/if}} | ||||||
|  |  | ||||||
|  |   <div class="flexcol"> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div> | ||||||
|  |       <ul> | ||||||
|  |         <li>Confrontation de {{attr.label}} : {{attr.value}}  | ||||||
|  |         </li> | ||||||
|  |         <li>Degré de la confrontation: {{confrontationDegre}} </li> | ||||||
|  |         <li>Ajustement spécial : {{confrontationModif}} </li> | ||||||
|  |         <li>Seuil final : {{target}} </li> | ||||||
|  |         <li>Valeur de la carte : {{total}} </li> | ||||||
|  |  | ||||||
|  |         {{#if isSuccess}} | ||||||
|  |           <li><label class="chat-result-text chat-result-success ">Réussite !</label> Votre {{attr.label}} augmente de {{gainAttr}} points.</li> | ||||||
|  |         {{else}} | ||||||
|  |           <li><label class="chat-result-text chat-result-failure ">Echec !</label> Votre {{attr.label}} diminue de {{gainAttr}} points.</li> | ||||||
|  |         {{/if}} | ||||||
|  |  | ||||||
|  |       </ul>   | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |   </div> | ||||||
| @@ -33,25 +33,25 @@ | |||||||
|             <li><label class="chat-result-text chat-result-success ">Réussite Critique !</label></li> |             <li><label class="chat-result-text chat-result-success ">Réussite Critique !</label></li> | ||||||
|             {{#if arme}} |             {{#if arme}} | ||||||
|               {{#if arme.system.dommagecritiquemort}} |               {{#if arme.system.dommagecritiquemort}} | ||||||
|                 <li><label class="chat-result-text chat-result-success">La victime est morte !</label></li> |                 <li><label class="chat-result-success">La victime est morte !</label></li> | ||||||
|               {{else}} |               {{else}} | ||||||
|                 {{#if arme.system.dommagecritiqueko}} |                 {{#if arme.system.dommagecritiqueko}} | ||||||
|                   <li><label class="chat-result-text chat-result-success ">La victime est KO !</label></li> |                   <li><label class="chat-result-text chat-result-success ">La victime est KO !</label></li> | ||||||
|                 {{/if}} |                 {{/if}} | ||||||
|                 <li><label class="chat-result-text chat-result-success ">La victime subit {{arme.system.dommagecritique}} dommages</label></li> |                 <li><label class="chat-result-success ">La victime subit {{arme.system.dommagecritique}} dommages</label></li> | ||||||
|               {{/if}} |               {{/if}} | ||||||
|             {{/if}} |             {{/if}} | ||||||
|           {{else}}   |           {{else}}   | ||||||
|             {{#if isPart}} |             {{#if isPart}} | ||||||
|               <li><label class="chat-result-text chat-result-success ">Réussite Particulière !</label></li> |               <li><label class="chat-result-text chat-result-success ">Réussite Particulière !</label></li> | ||||||
|               {{#if arme}} |               {{#if arme}} | ||||||
|                 <li><label class="chat-result-text chat-result-success ">La victime subit {{arme.system.dommagepart}} dommages</label></li> |                 <li><label class="chat-result-success ">La victime subit {{arme.system.dommagepart}} dommages</label></li> | ||||||
|               {{/if}}         |               {{/if}}         | ||||||
|  |  | ||||||
|             {{else}} |             {{else}} | ||||||
|               <li><label class="chat-result-text chat-result-success ">Succés !</label></li> |               <li><label class="chat-result-text chat-result-success ">Succés !</label></li> | ||||||
|               {{#if arme}} |               {{#if arme}} | ||||||
|                 <li><label class="chat-result-text chat-result-success ">La victime subit {{arme.system.dommagenormale}} dommages</label></li> |                 <li><label class="chat-result-success ">La victime subit {{arme.system.dommagenormale}} dommages</label></li> | ||||||
|               {{/if}}         |               {{/if}}         | ||||||
|             {{/if}}         |             {{/if}}         | ||||||
|           {{/if}} |           {{/if}} | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								templates/chat/display-tarot-card.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | |||||||
|  | </div> | ||||||
|  |     <div class="flexcol"> | ||||||
|  |       <img class="{{#if system.ispositif}} {{else}}flip-tarot{{/if}}" src="{{img}}"> | ||||||
|  |         <span class="tarot-title">{{name}}</span> | ||||||
|  |         {{#if system.isdualside}} | ||||||
|  |           <span class="tarot-title">{{#if system.ispositif}}Positif{{else}}Négatif{{/if}}</span> | ||||||
|  |         {{/if}} | ||||||
|  |         {{#if value}} | ||||||
|  |           <span class="tarot-title">Valeur : {{value}}</span> | ||||||
|  |         {{/if}} | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
							
								
								
									
										4
									
								
								templates/chat/request-tarot-card.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | |||||||
|  |   <div> | ||||||
|  |     <button class="chat-card-button draw-tarot-card">Tirer une carte de Tarot</button> | ||||||
|  |   </div> | ||||||
|  |  | ||||||
							
								
								
									
										86
									
								
								templates/dialogs/character-summary.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,86 @@ | |||||||
|  | <form class="{{cssClass}} flexcol character-summary-container" autocomplete="off"> | ||||||
|  |  | ||||||
|  |   <ol class="items-list"> | ||||||
|  |  | ||||||
|  |     <li class="item flexrow item-header"> | ||||||
|  |       <div class="item-field item-name item-name-label-long">Nom</div> | ||||||
|  |       {{#each config.attributs as |attr key|}} | ||||||
|  |       <div class="item-field  item-name-label-short">{{attr}}</div> | ||||||
|  |       {{/each}} | ||||||
|  |       <div class="item-field item-name-label-short">Destin</div> | ||||||
|  |       <div class="item-field item-name-label-short">Fluide</div> | ||||||
|  |       <div class="item-field item-name-label-short">MPMB</div> | ||||||
|  |       <div class="item-field item-name-label-short">MPMN</div> | ||||||
|  |       </div> | ||||||
|  |     </li> | ||||||
|  |  | ||||||
|  |     {{#each pcs as |pc key|}} | ||||||
|  |     <li class="item flexrow" data-actor-id="{{pc.id}}"> | ||||||
|  |         <div class="item-field item-name item-name-label-long"> | ||||||
|  |           <a class="actor-open character-summary-rollable">{{pc.name}}</a> | ||||||
|  |         </div> | ||||||
|  |         {{#each pc.system.attributs as |attr key|}} | ||||||
|  |         <div class="item-field flex2 item-name-label-short"> | ||||||
|  |           <a class="summary-roll character-summary-rollable" data-type="attribut" data-key="{{key}}">{{attr.value}}</a> | ||||||
|  |         </div> | ||||||
|  |         {{/each}} | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="destin" data-key="pointdestin">{{pc.system.pointdestin}}</a> | ||||||
|  |         </div> | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="fluide" data-key="fluide">{{pc.system.fluide}}</a> | ||||||
|  |         </div> | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="mpmb" data-key="mpmb">{{pc.system.mpmb}}</a> | ||||||
|  |         </div> | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="mpmn" data-key="mpmn">{{pc.system.mpmn}}</a> | ||||||
|  |         </div> | ||||||
|  |         </div> | ||||||
|  |       </li> | ||||||
|  |     {{/each}} | ||||||
|  |  | ||||||
|  |     <li class="item flexrow item-header"> | ||||||
|  |       <div class="item-field item-name item-name-label-long">PNJs</div> | ||||||
|  |       {{#each config.attributs as |attr key|}} | ||||||
|  |       <div class="item-field flex2  item-name-label-short">attr</div> | ||||||
|  |       {{/each}} | ||||||
|  |       <div class="item-field flex2 item-name-label-short">Destin</div> | ||||||
|  |       <div class="item-field flex2 item-name-label-short">Fluide</div> | ||||||
|  |       <div class="item-field flex2 item-name-label-short">MPMB</div> | ||||||
|  |       <div class="item-field flex2 item-name-label-short">MPMN</div> | ||||||
|  |       </div> | ||||||
|  |   </li> | ||||||
|  |  | ||||||
|  |     {{#each npcs as |pc key|}} | ||||||
|  |     <li class="item flexrow" data-actor-id="{{pc.id}}"> | ||||||
|  |         <div class="item-field item-name item-name-label-long"> | ||||||
|  |           <a class="actor-open character-summary-rollable">{{pc.name}}</a> | ||||||
|  |         </div> | ||||||
|  |         {{#each pc.system.attributs as |attr key|}} | ||||||
|  |         <div class="item-field flex2 item-name-label-short"> | ||||||
|  |           <a class="summary-roll character-summary-rollable" data-type="attribute" data-key="{{key}}">{{attr.value}}</a> | ||||||
|  |         </div> | ||||||
|  |         {{/each}} | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="destin" data-key="pointdestin">{{pc.system.pointdestin}}</a> | ||||||
|  |         </div> | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="fluide" data-key="fluide">{{pc.system.fluide}}</a> | ||||||
|  |         </div> | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="mpmb" data-key="mpmb">{{pc.system.mpmb}}</a> | ||||||
|  |         </div> | ||||||
|  |         <div class="item-field flex item-name-label-short"> | ||||||
|  |           <a class="summary-roll" data-type="mpmn" data-key="mpmn">{{pc.system.mpmn}}</a> | ||||||
|  |         </div> | ||||||
|  |         </div> | ||||||
|  |         <div class="item-field flex1 right"> | ||||||
|  |           <a class="item-control actor-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a> | ||||||
|  |         </div> | ||||||
|  |       </li> | ||||||
|  |     {{/each}} | ||||||
|  |      | ||||||
|  |   </ol> | ||||||
|  |  | ||||||
|  | </form> | ||||||
							
								
								
									
										34
									
								
								templates/dialogs/confrontation-dialog.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | |||||||
|  | <form class="skill-roll-dialog"> | ||||||
|  |   <header class="roll-dialog-header"> | ||||||
|  |     {{#if img}} | ||||||
|  |     <img class="actor-icon" src="{{img}}" data-edit="img" title="{{name}}" /> | ||||||
|  |     {{/if}} | ||||||
|  |     <h1 class="dialog-roll-title roll-dialog-header">{{title}}</h1> | ||||||
|  |   </header> | ||||||
|  |  | ||||||
|  |     <div class="flexcol"> | ||||||
|  |        | ||||||
|  |       <div class="flexrow"> | ||||||
|  |         <span class="roll-dialog-label">{{attr.label}} : </span> | ||||||
|  |         <span class="roll-dialog-label"> | ||||||
|  |           {{attr.value}} | ||||||
|  |         </span> | ||||||
|  |       </div> | ||||||
|  |        | ||||||
|  |       <div class="flexrow"> | ||||||
|  |         <span class="roll-dialog-label">Degré de la confrontation : </span> | ||||||
|  |         <select id="confrontationDegre" name="confrontationDegre"> | ||||||
|  |           {{selectOptions config.confrontationDegreOptions selected=confrontationDegre}} | ||||||
|  |         </select>         | ||||||
|  |       </div> | ||||||
|  |  | ||||||
|  |       <div class="flexrow"> | ||||||
|  |         <span class="roll-dialog-label">Modificateur de confrontation : </span> | ||||||
|  |         <select id="confrontationModif" name="confrontationModif"> | ||||||
|  |           {{selectOptions config.confrontationModifOptions selected=confrontationModif}} | ||||||
|  |         </select>         | ||||||
|  |       </div> | ||||||
|  |  | ||||||
|  |   </div> | ||||||
|  |  | ||||||
|  | </form> | ||||||
| @@ -22,57 +22,43 @@ | |||||||
|       </div> |       </div> | ||||||
|       {{/if}} |       {{/if}} | ||||||
|  |  | ||||||
|  |       <div class="flexcol"> | ||||||
|  |         <span class="roll-dialog-label">Rappel des élements biographiques : </span> | ||||||
|  |         <ul class="ul-level1 item-list alternate-list"> | ||||||
|  |           {{#each elementsbio as |elem key|}} | ||||||
|  |             <li class="item flexrow"> | ||||||
|  |               <span class="roll-dialog-label">{{elem.name}}</span> | ||||||
|  |             </li> | ||||||
|  |           {{/each}} | ||||||
|  |         </ul> | ||||||
|  |       </div> | ||||||
|  |  | ||||||
|       <div class="flexrow"> |       <div class="flexrow"> | ||||||
|         <span class="roll-dialog-label">Bonus/Malus biographique : </span> |         <span class="roll-dialog-label">Bonus/Malus biographique : </span> | ||||||
|         <select id="bonusMalusPerso" name="bonusMalusPerso"> |         <select id="bonusMalusPerso" name="bonusMalusPerso"> | ||||||
|           {{#select bonusMalusPerso}}  |           {{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso valueAttr="value" labelAttr="label"}} | ||||||
|             <option value="-3">-3</option> |  | ||||||
|             <option value="-2">-2</option> |  | ||||||
|             <option value="-1">-1</option> |  | ||||||
|             <option value="0">0</option> |  | ||||||
|             <option value="1">+1</option> |  | ||||||
|             <option value="2">+2</option> |  | ||||||
|             <option value="3">+3</option> |  | ||||||
|           {{/select}} |  | ||||||
|         </select> |         </select> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|       <div class="flexrow"> |       <div class="flexrow"> | ||||||
|         <span class="roll-dialog-label">Bonus/Malus de situation : </span> |         <span class="roll-dialog-label">Bonus/Malus de situation : </span> | ||||||
|         <select id="bonusMalusSituation" name="bonusMalusSituation"> |         <select id="bonusMalusSituation" name="bonusMalusSituation"> | ||||||
|           {{#select bonusMalusSituation}}  |           {{selectOptions config.bonusMalusPersoOptions selected=bonusMalusSituation valueAttr="value" labelAttr="label"}} | ||||||
|             <option value="-3">-3</option> |  | ||||||
|             <option value="-2">-2</option> |  | ||||||
|             <option value="-1">-1</option> |  | ||||||
|             <option value="0">0</option> |  | ||||||
|             <option value="1">+1</option> |  | ||||||
|             <option value="2">+2</option> |  | ||||||
|             <option value="3">+3</option> |  | ||||||
|           {{/select}} |  | ||||||
|         </select> |         </select> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|       {{#if arme}} |       {{#if arme}} | ||||||
|       <div class="flexrow"> |       <div class="flexrow"> | ||||||
|         <span class="roll-dialog-label">Défense : </span> |         <span class="roll-dialog-label">Défense : </span> | ||||||
|         <select id="bonusMalusSituation" name="bonusMalusSituation"> |         <select id="bonusMalusDef" name="bonusMalusDef"> | ||||||
|           {{#select bonusMalusSituation}}  |           {{selectOptions config.bonusMalusDefOptions selected=bonusMalusDef valueAttr="value" labelAttr="label"}} | ||||||
|             <option value="-3">-6 (réussite critique)</option> |  | ||||||
|             <option value="-3">-3 (réussite)</option> |  | ||||||
|             <option value="0">0 (echec ou pas d'esquive)</option> |  | ||||||
|             <option value="3">+3 (echec critique)</option> |  | ||||||
|           {{/select}} |  | ||||||
|         </select> |         </select> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|       <div class="flexrow"> |       <div class="flexrow"> | ||||||
|         <span class="roll-dialog-label">Pörtée : </span> |         <span class="roll-dialog-label">Portée : </span> | ||||||
|         <select id="bonusMalusPortee" name="bonusMalusPortee"> |         <select id="bonusMalusPortee" name="bonusMalusPortee"> | ||||||
|           {{#select bonusMalusPortee}}  |           {{selectOptions config.bonusMalusPorteeOptions selected=bonusMalusPortee valueAttr="value" labelAttr="label"}} | ||||||
|             <option value="1">+1 (Portée courte)</option> |  | ||||||
|             <option value="0">0 (Portée moyenne)</option> |  | ||||||
|             <option value="-1">-1 (Portée longue)</option> |  | ||||||
|           {{/select}} |  | ||||||
|         </select> |         </select> | ||||||
|       </div> |       </div> | ||||||
|       {{/if}} |       {{/if}} | ||||||
|   | |||||||
							
								
								
									
										72
									
								
								templates/dialogs/tirage-tarot-dialog.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,72 @@ | |||||||
|  | <form class="skill-roll-dialog"> | ||||||
|  |   <header class="roll-dialog-header"> | ||||||
|  |     <h1 class="dialog-roll-title roll-dialog-header">Joueur : {{user.name}}</h1> | ||||||
|  |   </header> | ||||||
|  |  | ||||||
|  |     <div class="flexcol"> | ||||||
|  |  | ||||||
|  |       {{#if (eq state "select-player")}} | ||||||
|  |       <div class="flexrow"> | ||||||
|  |         <span>Sélectionnez le joueur pour faire le tirage</span> | ||||||
|  |         <select id="playerId" name="playerId"> | ||||||
|  |           {{#select playerId}}  | ||||||
|  |             <option value="none"></option> | ||||||
|  |             {{#each players as |player id|}}  | ||||||
|  |               <option value="{{player._id}}">{{player.name}}</option> | ||||||
|  |             {{/each}} | ||||||
|  |           {{/select}} | ||||||
|  |         </select> | ||||||
|  |       </div>  | ||||||
|  |       {{/if}} | ||||||
|  |  | ||||||
|  |       {{#if (eq state "attribute-to-actor")}} | ||||||
|  |       <div class="flexrow"> | ||||||
|  |         <span>Sélectionnez l'acteur pour lui attribuer les tarots</span> | ||||||
|  |         <select id="actorId" name="actorId"> | ||||||
|  |           {{#select actorId}}  | ||||||
|  |             <option value="none"></option> | ||||||
|  |             {{#each actors as |actor id|}}  | ||||||
|  |               <option value="{{actor._id}}">{{actor.name}}</option> | ||||||
|  |             {{/each}} | ||||||
|  |           {{/select}} | ||||||
|  |         </select> | ||||||
|  |       </div>  | ||||||
|  |       {{/if}} | ||||||
|  |  | ||||||
|  |       <div class="flexcol"> | ||||||
|  |         <span><h2>Main du joueur : </h2></span> | ||||||
|  |         <div class="flexrow"> | ||||||
|  |           {{#each cards as |card index|}}  | ||||||
|  |             <div class="flexcol"> | ||||||
|  |               <div class="tarot-fixed-width flexcol"> | ||||||
|  |                 <img class="tarot-fixed-width {{#if card.system.ispositif}} {{else}}flip-tarot{{/if}}" src="{{card.img}}"> | ||||||
|  |                 <span class="tarot-title">{{card.name}}</span> | ||||||
|  |                 {{#if card.system.isdualside}} | ||||||
|  |                   <span class="tarot-title">{{#if card.system.ispositif}}Positif{{else}}Négatif{{/if}}</span> | ||||||
|  |                 {{/if}} | ||||||
|  |               </div> | ||||||
|  |             </div> | ||||||
|  |           {{/each}} | ||||||
|  |         </div>  | ||||||
|  |  | ||||||
|  |         <hr> | ||||||
|  |         <span><h2>Main secrête : </h2></span> | ||||||
|  |         <div class="flexrow"> | ||||||
|  |           {{#each secretCards as |card index|}}  | ||||||
|  |             <div class="flexcol"> | ||||||
|  |               <div class="tarot-fixed-width  flexcol"> | ||||||
|  |                 <img class="tarot-fixed-width {{#if card.system.ispositif}} {{else}}flip-tarot{{/if}}" src="{{card.img}}"> | ||||||
|  |                 <span class="tarot-title">{{card.name}}</span> | ||||||
|  |                 {{#if card.system.isdualside}} | ||||||
|  |                   <span class="tarot-title">{{#if card.system.ispositif}}Positif{{else}}Négatif{{/if}}</span> | ||||||
|  |                 {{/if}} | ||||||
|  |               </div> | ||||||
|  |             </div> | ||||||
|  |           {{/each}} | ||||||
|  |         </div>  | ||||||
|  |  | ||||||
|  |       </div> | ||||||
|  |  | ||||||
|  |   </div> | ||||||
|  |  | ||||||
|  | </form> | ||||||