résolution de souci de dépendance circulaire causée par RdDCombat
		
			
				
	
	
		
			137 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { ACTOR_TYPES } from "../constants.js"
 | |
| import { Misc } from "../misc.js"
 | |
| import { RdDSheetUtility } from "../rdd-sheet-utility.js"
 | |
| import { RdDUtility } from "../rdd-utility.js"
 | |
| 
 | |
| /**
 | |
|  * TODO:
 | |
|  * options.editable ?
 | |
|  * 
 | |
|  */
 | |
| const _SPACEHOLDER = { placeholder: true }
 | |
| 
 | |
| const _VENDRE = {
 | |
|   code: 'item-vendre', label: 'Vendre ou donner', icon: it => 'fa-solid fa-comments-dollar',
 | |
|   filter: it => Misc.toInt(it.system.quantite) > 0,
 | |
|   action: (item, actor) => item.proposerVente()
 | |
| }
 | |
| const _ACHETER = {
 | |
|   code: 'item-acheter', label: 'Acheter', icon: it => 'fa-regular fa-coins',
 | |
|   filter: it => Misc.toInt(it.system.quantite) > 0 && it.parent?.type == ACTOR_TYPES.commerce,
 | |
|   action: (item, actor) => actor.vente(item)
 | |
| }
 | |
| const _MONTRER = {
 | |
|   code: 'item-montrer', label: 'Montrer', icon: it => 'fa-solid fa-comment',
 | |
|   allowLimited: true,
 | |
|   action: (item, actor) => item.postItemToChat()
 | |
| }
 | |
| const _SPLIT = {
 | |
|   code: 'item-split', label: 'Séparer le goupe', icon: it => 'fa-solid fa-unlink',
 | |
|   filter: it => Misc.toInt(it.system.quantite) > 1 && it.parent?.type != ACTOR_TYPES.commerce,
 | |
|   action: (item, actor) => RdDSheetUtility.splitItem(item, actor)
 | |
| }
 | |
| 
 | |
| const _EDIT = {
 | |
|   code: 'item-edit', label: 'Editer', icon: it => 'fa-solid fa-edit',
 | |
|   action: (item, actor) => item.sheet.render(true)
 | |
| }
 | |
| const _DELETE = {
 | |
|   code: 'item-delete', label: 'Supprimer', icon: it => 'fa-solid fa-trash',
 | |
|   optionsFilter: options => options.isOwner,
 | |
|   action: (item, actor) => RdDUtility.confirmActorItemDelete(item, actor)
 | |
| }
 | |
| const _EQUIPER = {
 | |
|   code: 'item-equip', label: 'Equiper', icon: it => it.system.equipe ? 'fa-solid fa-hand-rock' : 'fa-regular fa-hand-paper',
 | |
|   filter: it => !it.estContenu && it.isEquipable(),
 | |
|   action: (item, actor) => actor.equiperObjet(item)
 | |
| }
 | |
| 
 | |
| const _CUISINER = {
 | |
|   code: 'item-cuisiner', label: 'Cuisiner', icon: it => 'fa-solid fa-utensils',
 | |
|   filter: it => it.getUtilisation() == 'cuisine' && it.system.sust > 0,
 | |
|   action: (item, actor) => actor.preparerNourriture(item)
 | |
| }
 | |
| const _MANGER_CRU = {
 | |
|   code: 'item-manger-cru', label: 'Manger cru', icon: it => 'fa-solid fa-drumstick-bite',
 | |
|   filter: it => it.getUtilisation() == 'cuisine' && it.system.sust > 0,
 | |
|   action: (item, actor) => actor.mangerNourriture(item)
 | |
| }
 | |
| const _MANGER = {
 | |
|   code: 'item-manger', label: 'Manger', icon: it => 'fa-solid fa-utensils',
 | |
|   filter: it => !(it.system.boisson),
 | |
|   action: (item, actor) => actor.mangerNourriture(item)
 | |
| }
 | |
| const _BOIRE = {
 | |
|   code: 'item-boire', label: 'Boire', icon: it => 'fa-solid fa-glass-water',
 | |
|   filter: it => it.system.boisson,
 | |
|   action: (item, actor) => actor.mangerNourriture(item)
 | |
| }
 | |
| const _DECOCTION = {
 | |
|   code: 'item-decoction', label: 'Décoction', icon: it => 'fa-solid fa-flask-vial',
 | |
|   action: (item, actor) => actor.fabriquerDecoctionHerbe(item)
 | |
| }
 | |
| const _OUVRIR = {
 | |
|   code: 'item-edit', label: 'Ouvrir', icon: it => 'fa-solid fa-eye',
 | |
|   action: (item, actor) => item.sheet.render(true)
 | |
| }
 | |
| 
 | |
| const _LIRE = {
 | |
|   code: 'item-lire', label: 'Lire', icon: it => 'fa-solid fa-book-open',
 | |
|   action: (item, actor) => actor.actionLire(item)
 | |
| }
 | |
| 
 | |
| const _REFOULER = {
 | |
|   code: 'item-refouler', label: 'Refouler', icon: it => 'fa-solid fa-burst',
 | |
|   filter: it => it.system.refoulement > 0,
 | |
|   action: (item, actor) => actor.actionRefoulement(item)
 | |
| }
 | |
| 
 | |
| const _SORT_RESERVE = {
 | |
|   code: 'item-sortreserve-add', label: 'Ajouter en réserve', icon: it => 'fa-solid fa-sparkles',
 | |
|   filter: it => game.user.isGM && !it.system.isrituel,
 | |
|   action: (item, actor) => actor.addSortReserve(item)
 | |
| }
 | |
| 
 | |
| export const COMMON_ACTIONS = [_EQUIPER]
 | |
| export const DEFAULT_ACTIONS = [_ACHETER, _SPACEHOLDER, _SPLIT, _VENDRE, _MONTRER, _EDIT, _DELETE]
 | |
| 
 | |
| export const ITEM_ACTIONS = {
 | |
|   faune: [_CUISINER, _MANGER_CRU],
 | |
|   ingredient: [_CUISINER, _MANGER_CRU],
 | |
|   conteneur: [_OUVRIR],
 | |
|   herbe: [_DECOCTION, _CUISINER, _MANGER_CRU],
 | |
|   livre: [_LIRE],
 | |
|   nourritureboisson: [_MANGER, _BOIRE],
 | |
|   ombre: [_REFOULER],
 | |
|   plante: [_CUISINER, _MANGER_CRU],
 | |
|   queue: [_REFOULER],
 | |
|   sort: [_SORT_RESERVE]
 | |
| }
 | |
| 
 | |
| export class ItemAction {
 | |
| 
 | |
|   static applies(action, item, options) {
 | |
|     return action && item
 | |
|       && item.isActionAllowed(action.code)
 | |
|       && (!action.filter || action.filter(item))
 | |
|       && (action.allowLimited || options.editable)
 | |
|       && (!action.optionsFilter || action.optionsFilter(options))
 | |
|   }
 | |
| 
 | |
|   static icon(action, item) {
 | |
|     if (action && action.icon) {
 | |
|       return action.icon(item)
 | |
|     }
 | |
|     return undefined
 | |
|   }
 | |
| 
 | |
|   static async onActionItem(event, actor, options) {
 | |
|     const code = $(event.currentTarget).data('code')
 | |
|     const item = RdDSheetUtility.getItem(event, actor)
 | |
|     const action = item?.itemActions().find(it => it.code == code)
 | |
|     if (action && ItemAction.applies(action, item, options)) {
 | |
|       await action.action(item, actor)
 | |
|     }
 | |
|   }
 | |
| }
 |