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) | ||||
|  | ||||
| [Vue du système](https://www.lahiette.com/leratierbretonnien/wp-content/uploads/2023/02/malefices_snapshot.webp) | ||||
|  | ||||
| ## EN | ||||
|  | ||||
| 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": { | ||||
|     "TypeCharacter": "Character", | ||||
|     "TypeNpc": "NPC" | ||||
|   "TYPES": { | ||||
|     "Actor": { | ||||
|       "personnage"  : "Personnage" | ||||
|     }, | ||||
|   "ITEM": { | ||||
|     "TypeWeapon": "Weapon", | ||||
|     "TypeShield": "Shield", | ||||
|     "TypeArmor": "Armor", | ||||
|     "TypeSpell": "Spell", | ||||
|     "TypeModule": "Module", | ||||
|     "TypeMoney": "Money", | ||||
|     "TypeEquipment": "Equipment", | ||||
|     "TypeAction": "Action", | ||||
|     "TypeFreeaction": "Free Action", | ||||
|     "TypeReaction": "Reaction", | ||||
|     "TypeStance": "Stance", | ||||
|     "TypeTrait": "Trait", | ||||
|     "TypeCondition": "Condition", | ||||
|     "TypeCraftingskill": "Crafting Skill" | ||||
|     "Item": { | ||||
|       "arme"        : "Arme", | ||||
|       "equipement"  : "Equipement", | ||||
|       "tarot"       : "Tarot", | ||||
|       "elementbio"  : "Elément Biographique", | ||||
|       "archetype"   : "Archetype", | ||||
|       "sortilege"   : "Sortilège" | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -6,16 +6,16 @@ | ||||
| import { MaleficesUtility } from "./malefices-utility.js"; | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| export class MaleficesActorSheet extends ActorSheet { | ||||
| export class MaleficesActorSheet extends foundry.appv1.sheets.ActorSheet { | ||||
|  | ||||
|   /** @override */ | ||||
|   static get defaultOptions() { | ||||
|  | ||||
|     return mergeObject(super.defaultOptions, { | ||||
|       classes: ["fvtt-malefices", "sheet", "actor"], | ||||
|     return foundry.utils.mergeObject(super.defaultOptions, { | ||||
|       classes: ["fvtt-malefices", "sheet", "actor", "malefices-actor-sheet"], | ||||
|       template: "systems/fvtt-malefices/templates/actors/actor-sheet.hbs", | ||||
|       width: 640, | ||||
|       height: 640, | ||||
|       height:680, | ||||
|       tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }], | ||||
|       dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }], | ||||
|       editScore: true | ||||
| @@ -33,14 +33,20 @@ export class MaleficesActorSheet extends ActorSheet { | ||||
|       name: this.actor.name, | ||||
|       editable: this.isEditable, | ||||
|       cssClass: this.isEditable ? "editable" : "locked", | ||||
|       system: duplicate(this.object.system), | ||||
|       system: foundry.utils.duplicate(this.object.system), | ||||
|       limited: this.object.limited, | ||||
|       armes: duplicate(this.actor.getArmes()), | ||||
|       tarots: duplicate(this.actor.getTarots()), | ||||
|       archetype: duplicate(this.actor.getArchetype()), | ||||
|       equipements: duplicate(this.actor.getEquipements()), | ||||
|       subActors: duplicate(this.actor.getSubActors()), | ||||
|       armes: foundry.utils.duplicate(this.actor.getArmes()), | ||||
|       tarots: foundry.utils.duplicate(this.actor.getTarots()), | ||||
|       tarotsCache: foundry.utils.duplicate(this.actor.getHiddenTarots()), | ||||
|       archetype: foundry.utils.duplicate(this.actor.getArchetype()), | ||||
|       equipements: foundry.utils.duplicate(this.actor.getEquipements()), | ||||
|       subActors: foundry.utils.duplicate(this.actor.getSubActors()), | ||||
|       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, | ||||
|       owner: this.document.isOwner, | ||||
|       editScore: this.options.editScore, | ||||
|   | ||||
| @@ -29,7 +29,7 @@ export class MaleficesActor extends Actor { | ||||
|     if (data instanceof Array) { | ||||
|       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) { | ||||
|       let actor = super.create(data, options); | ||||
|       return actor; | ||||
| @@ -86,8 +86,13 @@ export class MaleficesActor extends Actor { | ||||
|     MaleficesUtility.sortArrayObjectsByName(comp) | ||||
|     return comp; | ||||
|   } | ||||
|   getSorts() { | ||||
|     let comp = this.items.filter(item => item.type == 'sortilege'); | ||||
|     MaleficesUtility.sortArrayObjectsByName(comp) | ||||
|     return comp; | ||||
|   } | ||||
|   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) { | ||||
|       comp.tarot = MaleficesUtility.getTarot(comp.system.lametutelaire) | ||||
|     } | ||||
| @@ -95,14 +100,26 @@ export class MaleficesActor extends Actor { | ||||
|     return comp; | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   getElementsBio() { | ||||
|     let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'elementbio') || []) | ||||
|     MaleficesUtility.sortArrayObjectsByName(comp) | ||||
|     return comp; | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   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) | ||||
|     return comp; | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   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) | ||||
|     return comp; | ||||
|   } | ||||
| @@ -110,7 +127,7 @@ export class MaleficesActor extends Actor { | ||||
|   getItemById(id) { | ||||
|     let item = this.items.find(item => item.id == id); | ||||
|     if (item) { | ||||
|       item = duplicate(item) | ||||
|       item = foundry.utils.duplicate(item) | ||||
|     } | ||||
|     return item; | ||||
|   } | ||||
| @@ -156,7 +173,7 @@ export class MaleficesActor extends Actor { | ||||
|  | ||||
|   /* ------------------------------------------- */ | ||||
|   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) { | ||||
|       if (equip1.system.iscontainer) { | ||||
|         equip1.system.contents = [] | ||||
| @@ -212,22 +229,22 @@ export class MaleficesActor extends Actor { | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   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}) | ||||
|     return init + (subvalue / 100) | ||||
|     return init + (subvalue.total / 100) | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   getSubActors() { | ||||
|     let 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; | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   async addSubActor(subActorId) { | ||||
|     let subActors = duplicate(this.system.subactors); | ||||
|     let subActors = foundry.utils.duplicate(this.system.subactors); | ||||
|     subActors.push(subActorId); | ||||
|     await this.update({ 'system.subactors': subActors }); | ||||
|   } | ||||
| @@ -255,7 +272,29 @@ export class MaleficesActor extends Actor { | ||||
|       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) { | ||||
|     let objetQ = this.items.get(objetId) | ||||
| @@ -297,8 +336,12 @@ export class MaleficesActor extends Actor { | ||||
|     rollData.actorId = this.id | ||||
|     rollData.img = this.img | ||||
|     rollData.phyMalus = this.getPhysiqueMalus() | ||||
|     rollData.elementsbio = this.getElementsBio() | ||||
|     rollData.destin = this.system.pointdestin | ||||
|     rollData.isReroll = false | ||||
|     rollData.confrontationDegre = 0 | ||||
|     rollData.confrontationModif = 0 | ||||
|     rollData.config = game.system.malefices.config | ||||
|  | ||||
|     console.log("ROLLDATA", rollData) | ||||
|  | ||||
| @@ -316,7 +359,7 @@ export class MaleficesActor extends Actor { | ||||
|   rollAttribut(attrKey) { | ||||
|     let attr = this.system.attributs[attrKey] | ||||
|     let rollData = this.getCommonRollData() | ||||
|     rollData.attr = duplicate(attr) | ||||
|     rollData.attr = foundry.utils.duplicate(attr) | ||||
|     rollData.mode = "attribut" | ||||
|     rollData.title = attr.label  | ||||
|     rollData.img = this.getAtttributImage(attrKey) | ||||
| @@ -327,12 +370,12 @@ export class MaleficesActor extends Actor { | ||||
|   rollArme(weaponId) { | ||||
|     let arme = this.items.get(weaponId) | ||||
|     if (arme) { | ||||
|       arme = duplicate(arme) | ||||
|       arme = foundry.utils.duplicate(arme) | ||||
|       let rollData = this.getCommonRollData() | ||||
|       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 { | ||||
|         rollData.attr = duplicate(this.system.attributs.habilite) | ||||
|         rollData.attr = foundry.utils.duplicate(this.system.attributs.habilite) | ||||
|       } | ||||
|       rollData.mode = "arme" | ||||
|       rollData.arme = arme | ||||
|   | ||||
| @@ -2,6 +2,8 @@ | ||||
|  | ||||
| import { MaleficesUtility } from "./malefices-utility.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 { | ||||
| @@ -9,8 +11,9 @@ export class MaleficesCommands { | ||||
|   static init() { | ||||
|     if (!game.system.malefices.commands) { | ||||
|       const commands = new MaleficesCommands(); | ||||
|       //crucibleCommands.registerCommand({ path: ["/char"], func: (content, msg, params) => crucibleCommands.createChar(msg), descr: "Create a new character" }); | ||||
|       //crucibleCommands.registerCommand({ path: ["/pool"], func: (content, msg, params) => crucibleCommands.poolRoll(msg), descr: "Generic Roll Window" }); | ||||
|       commands.registerCommand({ path: ["/tirage"], func: (content, msg, params) => MaleficesCommands.createTirage(msg), descr: "Tirage des tarots" }); | ||||
|       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; | ||||
|     } | ||||
|   } | ||||
| @@ -77,7 +80,7 @@ export class MaleficesCommands { | ||||
|     console.log("===> Processing command") | ||||
|     let command = commandsTable[name]; | ||||
|     path = path + name + " "; | ||||
|     if (command && command.subTable) { | ||||
|     if (command?.subTable) { | ||||
|       if (params[0]) { | ||||
|         return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path) | ||||
|       } | ||||
| @@ -86,7 +89,7 @@ export class MaleficesCommands { | ||||
|         return true; | ||||
|       } | ||||
|     } | ||||
|     if (command && command.func) { | ||||
|     if (command?.func) { | ||||
|       const result = command.func(content, msg, params); | ||||
|       if (result == false) { | ||||
|         CrucibleCommands._chatAnswer(msg, command.descr); | ||||
| @@ -103,15 +106,42 @@ export class MaleficesCommands { | ||||
|     ChatMessage.create(msg); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   async poolRoll( msg) { | ||||
|     let rollData = MaleficesUtility.getBasicRollData() | ||||
|     rollData.alias = "Dice Pool Roll",  | ||||
|     rollData.mode  = "generic" | ||||
|     rollData.title = `Dice Pool Roll`; | ||||
|   /* --------------------------------------------- */ | ||||
|   static async createTirage(msg) { | ||||
|     if (game.user.isGM) { | ||||
|       let tirageData = { | ||||
|         state: 'select-player', | ||||
|         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); | ||||
|     rollDialog.render( true ); | ||||
|       let tirageDialog = await MaleficesTirageTarotDialog.create(this, tirageData) | ||||
|       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 = { | ||||
|   attributs: { | ||||
|     "constitution": "Cons", | ||||
|     "physique": "Phy", | ||||
|     "culturegenerale": "CGén", | ||||
|     "habilite": "Hab", | ||||
|     "perception": "Per", | ||||
|     "spiritualite": "Spi", | ||||
|     "rationnalite": "Rat" | ||||
|   }, | ||||
|  | ||||
|   tarotType: { | ||||
|     "majeur": "Arcane Majeur", | ||||
| @@ -18,4 +27,41 @@ export const MALEFICES_CONFIG = { | ||||
|     "epee": "Epée, sabre, javelot, etc", | ||||
|     "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 | ||||
|  * @extends {ItemSheet} | ||||
|  */ | ||||
| export class MaleficesItemSheet extends ItemSheet { | ||||
| export class MaleficesItemSheet extends foundry.appv1.sheets.ItemSheet { | ||||
|  | ||||
|   /** @override */ | ||||
|   static get defaultOptions() { | ||||
|  | ||||
|     return mergeObject(super.defaultOptions, { | ||||
|     return foundry.utils.mergeObject(super.defaultOptions, { | ||||
|       classes: ["fvtt-malefices", "sheet", "item"], | ||||
|       template: "systems/fvtt-malefices/templates/item-sheet.hbs", | ||||
|       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 */ | ||||
|   setPosition(options = {}) { | ||||
| @@ -57,13 +43,13 @@ export class MaleficesItemSheet extends ItemSheet { | ||||
|       name: this.object.name, | ||||
|       editable: this.isEditable, | ||||
|       cssClass: this.isEditable ? "editable" : "locked", | ||||
|       system: duplicate(this.object.system), | ||||
|       config: duplicate(game.system.malefices.config), | ||||
|       system: foundry.utils.duplicate(this.object.system), | ||||
|       config: foundry.utils.duplicate(game.system.malefices.config), | ||||
|       limited: this.object.limited, | ||||
|       options: this.options, | ||||
|       owner: this.document.isOwner, | ||||
|       description: await TextEditor.enrichHTML(this.object.system.description, { async: true }), | ||||
|       notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }), | ||||
|       description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, { async: true }), | ||||
|       notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.notes, { async: true }), | ||||
|       isGM: game.user.isGM | ||||
|     } | ||||
|  | ||||
| @@ -90,7 +76,7 @@ export class MaleficesItemSheet extends ItemSheet { | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   postItem() { | ||||
|     let chatData = duplicate(this.item) | ||||
|     let chatData = foundry.utils.duplicate(this.item) | ||||
|     if (this.actor) { | ||||
|       chatData.actor = { id: this.actor.id }; | ||||
|     } | ||||
|   | ||||
| @@ -1,8 +1,12 @@ | ||||
| import { MaleficesUtility } from "./malefices-utility.js"; | ||||
|  | ||||
| export const defaultItemImg = { | ||||
|   //skill: "systems/fvtt-malefices/images/icons/skill1.webp", | ||||
|   arme: "systems/fvtt-malefices/images/icones/arme.webp" | ||||
|   arme: "systems/fvtt-malefices/images/icons/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 { MaleficesItem } from "./malefices-item.js"; | ||||
| import { MaleficesHotbar } from "./malefices-hotbar.js" | ||||
| import { MaleficesCharacterSummary } from "./malefices-summary-app.js" | ||||
| import { MALEFICES_CONFIG } from "./malefices-config.js" | ||||
| import { ClassCounter} from "https://www.uberwald.me/fvtt_appcount/count-class-ready.js" | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| /*  Foundry VTT Initialization                  */ | ||||
| @@ -56,18 +58,20 @@ Hooks.once("init", async function () { | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   // Register sheet application classes | ||||
|   Actors.unregisterSheet("core", ActorSheet); | ||||
|   Actors.registerSheet("fvtt-malefices", MaleficesActorSheet, { types: ["personnage"], makeDefault: true }); | ||||
|   Actors.registerSheet("fvtt-malefices", MaleficesNPCSheet, { types: ["pnj"], makeDefault: false }); | ||||
|   foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet); | ||||
|   foundry.documents.collections.Actors.registerSheet("fvtt-malefices", MaleficesActorSheet, { types: ["personnage"], makeDefault: true }); | ||||
|   foundry.documents.collections.Actors.registerSheet("fvtt-malefices", MaleficesNPCSheet, { types: ["pnj"], makeDefault: false }); | ||||
|  | ||||
|   Items.unregisterSheet("core", ItemSheet); | ||||
|   Items.registerSheet("fvtt-malefices", MaleficesItemSheet, { makeDefault: true }); | ||||
|   foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet); | ||||
|   foundry.documents.collections.Items.registerSheet("fvtt-malefices", MaleficesItemSheet, { makeDefault: true }); | ||||
|  | ||||
|   MaleficesUtility.init() | ||||
|  | ||||
| }); | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| function welcomeMessage() { | ||||
|   if (game.user.isGM) { | ||||
|     ChatMessage.create({ | ||||
|       user: 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>Maléfices et un jeu de rôle publié par Arkhane Asylum Publishing, tout les droits leur appartiennent.</p> | ||||
|       <p>Système développé par LeRatierBretonnien avec l'aide de la Dame du Lac et Malik, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p> | ||||
|     ` }); | ||||
|       <p>Commandes : /tirage pour le tirage des tarots, /carte pour tirer une simple carte et /resume pour le résumé des PJs (MJ seulement)` }); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| @@ -93,17 +98,14 @@ Hooks.once("ready", function () { | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   // CSS patch for v9 | ||||
|   if (game.version) { | ||||
|     let sidebar = document.getElementById("sidebar"); | ||||
|     sidebar.style.width = "min-content"; | ||||
|   } | ||||
|  | ||||
|   ClassCounter.registerUsageCount(); | ||||
|   welcomeMessage(); | ||||
|   MaleficesUtility.ready() | ||||
|   MaleficesUtility.init() | ||||
|   MaleficesCharacterSummary.ready() | ||||
|  | ||||
| }) | ||||
|  | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| /*  Foundry VTT Initialization                  */ | ||||
| /* -------------------------------------------- */ | ||||
| @@ -111,10 +113,9 @@ Hooks.on("chatMessage", (html, content, msg) => { | ||||
|   if (content[0] == '/') { | ||||
|     let regExp = /(\S+)/g; | ||||
|     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 true; | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -6,12 +6,12 @@ | ||||
| import { MaleficesUtility } from "./malefices-utility.js"; | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| export class MaleficesNPCSheet extends ActorSheet { | ||||
| export class MaleficesNPCSheet extends foundry.appv1.sheets.ActorSheet { | ||||
|  | ||||
|   /** @override */ | ||||
|   static get defaultOptions() { | ||||
|  | ||||
|     return mergeObject(super.defaultOptions, { | ||||
|     return foundry.utils.mergeObject(super.defaultOptions, { | ||||
|       classes: ["Malefices", "sheet", "actor"], | ||||
|       template: "systems/fvtt-malefices/templates/npc-sheet.html", | ||||
|       width: 640, | ||||
| @@ -25,7 +25,7 @@ export class MaleficesNPCSheet extends ActorSheet { | ||||
|   /* -------------------------------------------- */ | ||||
|   async getData() { | ||||
|     const objectData = this.object.system | ||||
|     let actorData = duplicate(objectData) | ||||
|     let actorData = foundry.utils.duplicate(objectData) | ||||
|  | ||||
|     let formData = { | ||||
|       title: this.title, | ||||
| @@ -38,16 +38,16 @@ export class MaleficesNPCSheet extends ActorSheet { | ||||
|       data: actorData, | ||||
|       limited: this.object.limited, | ||||
|       skills: this.actor.getSkills( ), | ||||
|       weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ), | ||||
|       armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())), | ||||
|       shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())), | ||||
|       spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getLore())), | ||||
|       equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ), | ||||
|       equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ), | ||||
|       weapons: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getWeapons()) ), | ||||
|       armors: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getArmors())), | ||||
|       shields: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getShields())), | ||||
|       spells: this.actor.checkAndPrepareEquipments( foundry.utils.duplicate(this.actor.getLore())), | ||||
|       equipments: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquipmentsOnly()) ), | ||||
|       equippedWeapons: this.actor.checkAndPrepareEquipments(foundry.utils.duplicate(this.actor.getEquippedWeapons()) ), | ||||
|       equippedArmor: this.actor.getEquippedArmor(), | ||||
|       equippedShield: this.actor.getEquippedShield(), | ||||
|       subActors: duplicate(this.actor.getSubActors()), | ||||
|       moneys: duplicate(this.actor.getMoneys()), | ||||
|       subActors: foundry.utils.duplicate(this.actor.getSubActors()), | ||||
|       moneys: foundry.utils.duplicate(this.actor.getMoneys()), | ||||
|       encCapacity: this.actor.getEncumbranceCapacity(), | ||||
|       saveRolls: this.actor.getSaveRoll(), | ||||
|       conditions: this.actor.getConditions(), | ||||
|   | ||||
| @@ -5,26 +5,32 @@ export class MaleficesRollDialog extends Dialog { | ||||
|   /* -------------------------------------------- */ | ||||
|   static async create(actor, rollData) { | ||||
|  | ||||
|     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 options = { classes: ["MaleficesDialog"], width: 540, height: 'fit-content', 'z-index': 99999 } | ||||
|     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); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   constructor(actor, rollData, html, options, close = undefined) { | ||||
|     let isCard = rollData?.attr?.iscard | ||||
|     let conf = { | ||||
|       title: (rollData.mode == "skill") ? "Skill" : "Attribute", | ||||
|       title: (isCard) ? "Jet" : "Tirage", | ||||
|       content: html, | ||||
|       buttons: { | ||||
|         roll: { | ||||
|           icon: '<i class="fas fa-check"></i>', | ||||
|           label: "Roll !", | ||||
|           label: (isCard) ? "Tirer une carte" : "Lancer le dé", | ||||
|           callback: () => { this.roll() } | ||||
|         }, | ||||
|         cancel: { | ||||
|           icon: '<i class="fas fa-times"></i>', | ||||
|           label: "Cancel", | ||||
|           label: "Annuler", | ||||
|           callback: () => { this.close() } | ||||
|         } | ||||
|       }, | ||||
| @@ -39,8 +45,13 @@ export class MaleficesRollDialog extends Dialog { | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   roll() { | ||||
|     let isCard = this.rollData?.attr?.iscard | ||||
|     if (isCard) { | ||||
|       MaleficesUtility.tirageConfrontationMalefices(this.rollData) | ||||
|     } else { | ||||
|       MaleficesUtility.rollMalefices(this.rollData) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   async refreshDialog() { | ||||
| @@ -53,7 +64,6 @@ export class MaleficesRollDialog extends Dialog { | ||||
|   activateListeners(html) { | ||||
|     super.activateListeners(html); | ||||
|  | ||||
|     var dialog = this; | ||||
|     function onLoad() { | ||||
|     } | ||||
|     $(function () { onLoad(); }); | ||||
| @@ -70,6 +80,12 @@ export class MaleficesRollDialog extends Dialog { | ||||
|     html.find('#bonusMalusPortee').change((event) => { | ||||
|       this.rollData.bonusMalusPortee = Number(event.currentTarget.value) | ||||
|     }) | ||||
|     html.find('#confrontationDegre').change((event) => { | ||||
|       this.rollData.confrontationDegre = Number(event.currentTarget.value) | ||||
|     }) | ||||
|     html.find('#confrontationModif').change((event) => { | ||||
|       this.rollData.confrontationModif = Number(event.currentTarget.value) | ||||
|     }) | ||||
|  | ||||
|   } | ||||
| } | ||||
							
								
								
									
										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"; | ||||
|  | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| export class MaleficesUtility { | ||||
|  | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static async init() { | ||||
|     Hooks.on('renderChatLog', (log, html, data) => MaleficesUtility.chatListeners(html)); | ||||
|     /*Hooks.on("dropCanvasData", (canvas, data) => { | ||||
|       MaleficesUtility.dropItemOnToken(canvas, data) | ||||
|     });*/ | ||||
|  | ||||
|     this.rollDataStore = {} | ||||
|     this.defenderStore = {} | ||||
|  | ||||
|     MaleficesCommands.init(); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static async ready() { | ||||
|  | ||||
|     Handlebars.registerHelper('count', function (list) { | ||||
|       return list.length; | ||||
| @@ -44,6 +43,26 @@ export class MaleficesUtility { | ||||
|     Handlebars.registerHelper('add', function (a, 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() { | ||||
|     return duplicate(this.tarots) | ||||
|     return foundry.utils.duplicate(this.tarots) | ||||
|   } | ||||
|   static getTarot(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) { | ||||
|     const pack = game.packs.get(compendium) | ||||
| @@ -89,11 +102,19 @@ export class MaleficesUtility { | ||||
|     } | ||||
|     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) { | ||||
|  | ||||
|     html.on("click", '.roll-destin', event => { | ||||
|     $(html).on("click", '.roll-destin', event => { | ||||
|       let messageId = MaleficesUtility.findChatMessageId(event.currentTarget) | ||||
|       let message = game.messages.get(messageId) | ||||
|       let rollData = message.getFlag("world", "rolldata") | ||||
| @@ -102,6 +123,11 @@ export class MaleficesUtility { | ||||
|       rollData.isReroll = true | ||||
|       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-description.hbs' | ||||
|     ] | ||||
|     return loadTemplates(templatePaths); | ||||
|     return foundry.applications.handlebars.loadTemplates(templatePaths); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
| @@ -178,28 +204,17 @@ export class MaleficesUtility { | ||||
|  | ||||
|     let id = rollData.rollId | ||||
|     let oldRollData = this.rollDataStore[id] || {} | ||||
|     let newRollData = mergeObject(oldRollData, rollData) | ||||
|     let newRollData = foundry.utils.mergeObject(oldRollData, rollData) | ||||
|     this.rollDataStore[id] = newRollData | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static async onSocketMesssage(msg) { | ||||
|     console.log("SOCKET MESSAGE", msg.name) | ||||
|     if (msg.name == "msg_update_roll") { | ||||
|       this.updateRollData(msg.data) | ||||
|     if (msg.name == "msg-draw-card") { | ||||
|       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) { | ||||
|  | ||||
| @@ -276,28 +418,15 @@ export class MaleficesUtility { | ||||
|  | ||||
|     // Performs roll | ||||
|     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")) | ||||
|     rollData.roll = myRoll | ||||
|     rollData.roll = foundry.utils.duplicate(myRoll) | ||||
|     rollData.total = myRoll.total | ||||
|  | ||||
|     rollData.isSuccess = false | ||||
|     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 | ||||
|     } | ||||
|     this.computeResults(rollData) | ||||
|  | ||||
|     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) | ||||
|     if (rollData.mode == "initiative") { | ||||
| @@ -331,11 +460,17 @@ export class MaleficesUtility { | ||||
|     switch (rollMode) { | ||||
|       case "blindroll": return this.getUsers(user => user.isGM); | ||||
|       case "gmroll": return this.getWhisperRecipientsAndGMs(name); | ||||
|       case "useronly": return this.getWhisperRecipientsOnly(name); | ||||
|       case "selfroll": return [game.user.id]; | ||||
|     } | ||||
|     return undefined; | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   static getWhisperRecipientsOnly(name) { | ||||
|     let recep1 = ChatMessage.getWhisperRecipients(name) || []; | ||||
|     return recep1 | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   static getWhisperRecipientsAndGMs(name) { | ||||
|     let recep1 = ChatMessage.getWhisperRecipients(name) || []; | ||||
|     return recep1.concat(ChatMessage.getWhisperRecipients('GM')); | ||||
| @@ -343,7 +478,7 @@ export class MaleficesUtility { | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static blindMessageToGM(chatOptions) { | ||||
|     let chatGM = duplicate(chatOptions); | ||||
|     let chatGM = foundry.utils.duplicate(chatOptions); | ||||
|     chatGM.whisper = this.getUsers(user => user.isGM); | ||||
|     chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content; | ||||
|     console.log("blindMessageToGM", chatGM); | ||||
| @@ -369,7 +504,7 @@ export class MaleficesUtility { | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static createChatMessage(name, rollMode, chatOptions) { | ||||
|   static async createChatMessage(name, rollMode, chatOptions) { | ||||
|     switch (rollMode) { | ||||
|       case "blindroll": // GM only | ||||
|         if (!game.user.isGM) { | ||||
| @@ -387,13 +522,13 @@ export class MaleficesUtility { | ||||
|         break; | ||||
|     } | ||||
|     chatOptions.alias = chatOptions.alias || name; | ||||
|     return ChatMessage.create(chatOptions); | ||||
|     return await ChatMessage.create(chatOptions); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static getBasicRollData() { | ||||
|     let rollData = { | ||||
|       rollId: randomID(16), | ||||
|       rollId: foundry.utils.randomID(16), | ||||
|       bonusMalusPerso: 0, | ||||
|       bonusMalusSituation: 0, | ||||
|       bonusMalusDef: 0, | ||||
| @@ -413,8 +548,8 @@ export class MaleficesUtility { | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static createChatWithRollMode(name, chatOptions) { | ||||
|     return this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions) | ||||
|   static async createChatWithRollMode(name, 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":"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":"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":"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":"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":"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":"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":"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":"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":"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'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":"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":"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 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 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 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 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":"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":"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":"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":"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 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 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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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");*/ | ||||
| /* Global styles & Font */ | ||||
| .window-app { | ||||
| .fvtt-malefices .window-app { | ||||
| text-align: justify; | ||||
| font-size: 16px; | ||||
| 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 { | ||||
| font-size: 1.0rem; | ||||
| } /* For title, sidebar character and scene */ | ||||
| .sheet nav.sheet-tabs { | ||||
| .fvtt-malefices .sheet nav.sheet-tabs { | ||||
| font-size: 0.8rem; | ||||
| } /* For nav and title */ | ||||
| .window-app input, .fvtt-malefices .item-form, .sheet header.sheet-header .flex-group-center.flex-compteurs, .sheet header.sheet-header .flex-group-center.flex-fatigue, select, button, .item-checkbox, #sidebar, #players, #navigation #nav-toggle { | ||||
| @@ -235,6 +235,11 @@ table {border: 1px solid #7a7971;} | ||||
|   object-position: 50% 0; | ||||
|   border-width: 0px; | ||||
| } | ||||
| .profile-img-container { | ||||
|   margin-right: 0.2rem; | ||||
|   max-width: 140px; | ||||
|   width: 140px; | ||||
| } | ||||
|  | ||||
| .button-img { | ||||
|   vertical-align: baseline; | ||||
| @@ -396,7 +401,7 @@ li.folder > .folder-header h3 { | ||||
|  | ||||
| /* ======================================== */ | ||||
| /* Sheet  */ | ||||
| .window-app.sheet .window-content .sheet-header{ | ||||
| .fvtt-malefices .window-app.sheet .window-content .sheet-header{ | ||||
|   color: rgba(19, 18, 18, 0.95); | ||||
|   background: url("../images/ui/background_01_clear.webp"); | ||||
|   /*background: #494e6b;*/ | ||||
| @@ -442,7 +447,7 @@ select { | ||||
|   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; | ||||
|   /*background: url("../images/ui/pc_sheet_bg.webp") repeat left top;*/ | ||||
|   background: url("../images/ui/background_01_clear.webp"); | ||||
| @@ -460,7 +465,7 @@ section.sheet-body{padding: 0.25rem 0.5rem;} | ||||
|   padding: 0; | ||||
| } | ||||
|  | ||||
| .sheet nav.sheet-tabs { | ||||
| nav.sheet-tabs { | ||||
|   font-size: 1.2rem; | ||||
|   font-weight: bold; | ||||
|   height: 3rem; | ||||
| @@ -476,11 +481,23 @@ section.sheet-body{padding: 0.25rem 0.5rem;} | ||||
|   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 { | ||||
|   position: relative; | ||||
|   padding: 0 0.25rem; | ||||
|   color:beige; | ||||
|   margin-top: 4px; | ||||
|   margin-bottom: 4px; | ||||
| } | ||||
|  | ||||
| nav.sheet-tabs .item:after { | ||||
| @@ -490,7 +507,7 @@ nav.sheet-tabs .item:after { | ||||
|   right: 0; | ||||
|   height: 2rem; | ||||
|   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] { | ||||
| @@ -754,6 +771,10 @@ ul, li { | ||||
| #token-hud .status-effects.active{ | ||||
|   z-index: 2; | ||||
| } | ||||
| .token-sheet .window-content .flexcol .sheet-tabs { | ||||
|   font-size: 0.8rem; | ||||
| } | ||||
|  | ||||
| /* ======================================== */ | ||||
| .item-checkbox { | ||||
|   height: 25px; | ||||
| @@ -794,6 +815,9 @@ ul, li { | ||||
|   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;*/ | ||||
|  | ||||
| #sidebar.collapsed { | ||||
| @@ -950,8 +974,6 @@ ul, li { | ||||
| } | ||||
|  | ||||
| #sidebar #sidebar-tabs i{ | ||||
|   width: 25px; | ||||
|   height: 25px; | ||||
|   display: inline-block; | ||||
|   background-position:center; | ||||
|   background-size:cover; | ||||
| @@ -1237,6 +1259,11 @@ ul, li { | ||||
|   max-width: 10rem; | ||||
|   min-width: 10rem; | ||||
| } | ||||
| .item-name-label-short { | ||||
|   flex-grow:1; | ||||
|   max-width: 4rem; | ||||
|   min-width: 4rem; | ||||
| } | ||||
| .item-name-label-medium { | ||||
|   margin-top: 4px; | ||||
|   flex-grow:2; | ||||
| @@ -1299,3 +1326,17 @@ ul, li { | ||||
|   max-width: 16px; | ||||
|   max-height: 12px; | ||||
| } | ||||
| .flip-tarot { | ||||
|   transform: scaleY(-1); | ||||
| } | ||||
| .tarot-fixed-width { | ||||
|   width: 140px; | ||||
|   max-width: 140px; | ||||
| } | ||||
| .tarot-title { | ||||
|   text-align: center; | ||||
|   font-weight: bold; | ||||
| } | ||||
| .character-summary-rollable { | ||||
|   text-decoration: underline; | ||||
| } | ||||
|   | ||||
							
								
								
									
										54
									
								
								system.json
									
									
									
									
									
								
							
							
						
						| @@ -3,8 +3,10 @@ | ||||
|   "esmodules": [ | ||||
|     "modules/malefices-main.js" | ||||
|   ], | ||||
|   "gridDistance": 1, | ||||
|   "gridUnits": "u", | ||||
|   "grid": { | ||||
|     "distance": 2, | ||||
|     "units": "m" | ||||
|   }, | ||||
|   "languages": [ | ||||
|     { | ||||
|       "lang": "fr", | ||||
| @@ -24,36 +26,56 @@ | ||||
|       "type": "Item", | ||||
|       "label": "Tarots", | ||||
|       "name": "malefices-tarots", | ||||
|       "path": "packs/malefices-tarots.db", | ||||
|       "path": "packs/malefices-tarots", | ||||
|       "system": "fvtt-malefices", | ||||
|       "private": false, | ||||
|       "flags": {} | ||||
|       "flags": {}, | ||||
|       "ownership": { | ||||
|         "PLAYER": "OBSERVER", | ||||
|         "ASSISTANT": "OWNER" | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "type": "Item", | ||||
|       "label": "Armes", | ||||
|       "name": "malefices-armes", | ||||
|       "path": "packs/malefices-armes.db", | ||||
|       "path": "packs/malefices-armes", | ||||
|       "system": "fvtt-malefices", | ||||
|       "private": false, | ||||
|       "flags": {} | ||||
|       "flags": {}, | ||||
|       "ownership": { | ||||
|         "PLAYER": "OBSERVER", | ||||
|         "ASSISTANT": "OWNER" | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "type": "Item", | ||||
|       "label": "Archetypes", | ||||
|       "name": "malefices-archetypes", | ||||
|       "path": "packs/malefices-archetypes.db", | ||||
|       "path": "packs/malefices-archetypes", | ||||
|       "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", | ||||
|   "manifest": "https://www.uberwald.me/gitea/public/fvtt-malefices/raw/branch/master/system.json", | ||||
|   "compatibility": { | ||||
|     "minimum": "10", | ||||
|     "verified": "10", | ||||
|     "maximum": "10" | ||||
|     "minimum": "13", | ||||
|     "verified": "13" | ||||
|   }, | ||||
|   "id": "fvtt-malefices", | ||||
|   "primaryTokenAttribute": "secondary.health", | ||||
| @@ -64,7 +86,7 @@ | ||||
|   ], | ||||
|   "title": "Maléfices, le Jeu de Rôle", | ||||
|   "url": "https://www.uberwald.me/gitea/public/fvtt-malefices", | ||||
|   "version": "10.0.11", | ||||
|   "download": "https://www.uberwald.me/gitea/public/fvtt-malefices/archive/fvtt-malefices-v10.0.11.zip", | ||||
|   "version": "13.0.1", | ||||
|   "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" | ||||
| } | ||||
| @@ -1,8 +1,7 @@ | ||||
| { | ||||
|   "Actor": { | ||||
|     "types": [ | ||||
|       "personnage", | ||||
|       "pnj" | ||||
|       "personnage" | ||||
|     ], | ||||
|     "templates": { | ||||
|       "biodata": { | ||||
| @@ -26,6 +25,7 @@ | ||||
|           "religion": "", | ||||
|           "fantastique": "", | ||||
|           "description": "", | ||||
|           "notes": "", | ||||
|           "gmnotes": "" | ||||
|         } | ||||
|       }, | ||||
| @@ -34,6 +34,8 @@ | ||||
|         "lamesdestin": [], | ||||
|         "pointdestin": 1, | ||||
|         "fluide": 5, | ||||
|         "mpmb": 0, | ||||
|         "mpmn": 0, | ||||
|         "attributs": { | ||||
|           "constitution": { | ||||
|             "label": "Constitution", | ||||
| @@ -62,25 +64,28 @@ | ||||
|           }, | ||||
|           "perception": { | ||||
|             "label": "Perception", | ||||
|             "abbrev": "habilite", | ||||
|             "abbrev": "perception", | ||||
|             "value": 0, | ||||
|             "max": 0 | ||||
|           }, | ||||
|           "spiritualite": { | ||||
|             "label": "Spiritualite", | ||||
|             "abbrev": "spiritualite", | ||||
|             "hasmax": true, | ||||
|             "hasmax": false, | ||||
|             "iscard": true, | ||||
|             "value": 0, | ||||
|             "max": 0 | ||||
|           }, | ||||
|           "rationnalite": { | ||||
|             "label": "Rationnalite", | ||||
|             "abbrev": "rationnalite", | ||||
|             "hasmax": true, | ||||
|             "hasmax": false, | ||||
|             "iscard": true, | ||||
|             "value": 0, | ||||
|             "max": 0 | ||||
|           } | ||||
|         } | ||||
|         }, | ||||
|         "equipementlibre": "" | ||||
|       }, | ||||
|       "npccore": { | ||||
|         "npctype": "", | ||||
| @@ -99,22 +104,36 @@ | ||||
|       "arme", | ||||
|       "equipement", | ||||
|       "archetype", | ||||
|       "tarot" | ||||
|       "tarot", | ||||
|       "sortilege", | ||||
|       "elementbio" | ||||
|     ], | ||||
|     "templates": {}, | ||||
|     "elementbio": { | ||||
|       "description": "" | ||||
|     }, | ||||
|     "equipement": { | ||||
|       "description": "" | ||||
|     }, | ||||
|     "tarot": { | ||||
|       "tarottype": "", | ||||
|       "isreversed": false, | ||||
|       "numericvalueup": 0, | ||||
|       "numericvaluedown": 0, | ||||
|       "isdualside": false, | ||||
|       "ispositif": true, | ||||
|       "isgm": false, | ||||
|       "description": "" | ||||
|     }, | ||||
|     "archetype":  { | ||||
|       "lametutelaire": "" | ||||
|       "lametutelaire": "", | ||||
|       "description": "" | ||||
|     }, | ||||
|     "sortilege":  { | ||||
|       "seuil": 0, | ||||
|       "description": "" | ||||
|     }, | ||||
|     "arme": { | ||||
|       "armetype": 0, | ||||
|       "armetype": "", | ||||
|       "porteecourte": "", | ||||
|       "porteemoyenne": "", | ||||
|       "dommagenormale": 0, | ||||
|   | ||||
| @@ -4,7 +4,11 @@ | ||||
|   <header class="sheet-header"> | ||||
|     <div class="header-fields"> | ||||
|       <div class="flexrow"> | ||||
|  | ||||
|         <div class="profile-img-container"> | ||||
|           <img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> | ||||
|         </div> | ||||
|  | ||||
|         <div class="flexcol"> | ||||
|           <h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> | ||||
|  | ||||
| @@ -31,7 +35,7 @@ | ||||
|   {{!-- Sheet Tab Navigation --}} | ||||
|   <nav class="sheet-tabs tabs" data-group="primary"> | ||||
|     <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="notes">Notes</a> | ||||
|   </nav> | ||||
| @@ -53,7 +57,14 @@ | ||||
|             </li> | ||||
|             {{#each system.attributs as |attr key|}} | ||||
|             <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"/> | ||||
|               {{#if attr.hasmax}} | ||||
|                 <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}} | ||||
|             <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"/> | ||||
|             </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}} | ||||
|  | ||||
|           </ul> | ||||
| @@ -95,6 +114,32 @@ | ||||
|             </li> | ||||
|             {{/each}} | ||||
|           </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> | ||||
| @@ -104,6 +149,13 @@ | ||||
|     {{!-- Equipement Tab --}} | ||||
|     <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"> | ||||
|         <li class="item flexrow list-item items-title-bg"> | ||||
|           <span class="item-name-label-header"> | ||||
| @@ -119,7 +171,7 @@ | ||||
|             <label class="item-field-label-medium">Critique</label> | ||||
|           </span> | ||||
|           <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> | ||||
|         </li> | ||||
|         {{#each armes as |arme key|}} | ||||
| @@ -142,14 +194,14 @@ | ||||
|       <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">Equipements</label></h3> | ||||
|             <h3><label class="items-title-text">Equipements (Items)</label></h3> | ||||
|           </span> | ||||
|           <span class="item-field-label-long"> | ||||
|             <label class="short-label">Q.</label> | ||||
|           </span> | ||||
|           <div class="item-filler"> </div> | ||||
|           <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> | ||||
|  | ||||
|         </li> | ||||
| @@ -167,30 +219,55 @@ | ||||
|         {{/each}} | ||||
|       </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> | ||||
|  | ||||
|     </div> | ||||
|  | ||||
|     {{!-- Biography Tab --}} | ||||
|     <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> | ||||
|           <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"> | ||||
|               <label class="item-name-label-medium">Lieu de naissance</label> | ||||
|               <input type="text" class="" name="system.biodata.lieunaissance" value="{{system.biodata.lieunaissance}}" | ||||
| @@ -216,6 +293,10 @@ | ||||
|         </div> | ||||
|        <div> | ||||
|           <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"> | ||||
|               <label class="item-name-label-medium">Résidence</label> | ||||
|               <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"> | ||||
|             <h3><label class="items-title-text">Tarots</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="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> | ||||
|         </li> | ||||
|         {{#each tarots as |tarot key|}} | ||||
| @@ -263,6 +347,7 @@ | ||||
|           <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"> | ||||
| @@ -273,6 +358,36 @@ | ||||
|         {{/each}} | ||||
|       </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 class="tab notes" data-group="primary" data-tab="notes"> | ||||
| @@ -281,8 +396,7 @@ | ||||
|           <h3><label class="items-title-text">Background</label></h3> | ||||
|       </span> | ||||
|       <div class="form-group editor"> | ||||
|         {{editor description target="system.biodata.description" button=true owner=owner | ||||
|         editable=editable}} | ||||
|         {{editor description target="system.biodata.description" button=true owner=owner editable=editable}} | ||||
|       </div> | ||||
|       <hr> | ||||
|       <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> | ||||
|             {{#if arme}} | ||||
|               {{#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}} | ||||
|                 {{#if arme.system.dommagecritiqueko}} | ||||
|                   <li><label class="chat-result-text chat-result-success ">La victime est KO !</label></li> | ||||
|                 {{/if}} | ||||
|                 <li><label class="chat-result-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}} | ||||
|           {{else}}   | ||||
|             {{#if isPart}} | ||||
|               <li><label class="chat-result-text chat-result-success ">Réussite Particulière !</label></li> | ||||
|               {{#if arme}} | ||||
|                 <li><label class="chat-result-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}}         | ||||
|  | ||||
|             {{else}} | ||||
|               <li><label class="chat-result-text chat-result-success ">Succés !</label></li> | ||||
|               {{#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}} | ||||
|   | ||||
							
								
								
									
										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> | ||||
|       {{/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"> | ||||
|         <span class="roll-dialog-label">Bonus/Malus biographique : </span> | ||||
|         <select id="bonusMalusPerso" name="bonusMalusPerso"> | ||||
|           {{#select bonusMalusPerso}}  | ||||
|             <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}} | ||||
|           {{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso valueAttr="value" labelAttr="label"}} | ||||
|         </select> | ||||
|       </div> | ||||
|  | ||||
|       <div class="flexrow"> | ||||
|         <span class="roll-dialog-label">Bonus/Malus de situation : </span> | ||||
|         <select id="bonusMalusSituation" name="bonusMalusSituation"> | ||||
|           {{#select bonusMalusSituation}}  | ||||
|             <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}} | ||||
|           {{selectOptions config.bonusMalusPersoOptions selected=bonusMalusSituation valueAttr="value" labelAttr="label"}} | ||||
|         </select> | ||||
|       </div> | ||||
|  | ||||
|       {{#if arme}} | ||||
|       <div class="flexrow"> | ||||
|         <span class="roll-dialog-label">Défense : </span> | ||||
|         <select id="bonusMalusSituation" name="bonusMalusSituation"> | ||||
|           {{#select bonusMalusSituation}}  | ||||
|             <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 id="bonusMalusDef" name="bonusMalusDef"> | ||||
|           {{selectOptions config.bonusMalusDefOptions selected=bonusMalusDef valueAttr="value" labelAttr="label"}} | ||||
|         </select> | ||||
|       </div> | ||||
|  | ||||
|       <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 bonusMalusPortee}}  | ||||
|             <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}} | ||||
|           {{selectOptions config.bonusMalusPorteeOptions selected=bonusMalusPortee valueAttr="value" labelAttr="label"}} | ||||
|         </select> | ||||
|       </div> | ||||
|       {{/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> | ||||