forked from public/foundryvtt-reve-de-dragon
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| const demiReveStatusEffect = { id: 'demi-reve', rdd: true, label: 'Demi-rêve', icon: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg' };
 | |
| const rddStatusEffects = [
 | |
|   { id: 'sonne', rdd: true, label: 'Sonné', icon: 'icons/svg/stoned.svg' },
 | |
|   demiReveStatusEffect
 | |
| ];
 | |
| const statusDemiSurprise = new Set(['sonne', 'prone', 'restrain']);
 | |
| const statusSurpriseTotale = new Set(['unconscious', 'blind', 'dead']);
 | |
| 
 | |
| export class StatusEffects {
 | |
|   static onReady() {
 | |
|     StatusEffects.setCoreStatusId([demiReveStatusEffect]);
 | |
|     StatusEffects.setCoreStatusId(rddStatusEffects);
 | |
|     StatusEffects.setMandatoryRdd();
 | |
|     const defaultUseStatusEffect = CONFIG.statusEffects.map(it => it.id).join();
 | |
|     game.settings.register("foundryvtt-reve-de-dragon", "use-status-effects", {
 | |
|       name: "use-status-effects",
 | |
|       scope: "world",
 | |
|       config: false,
 | |
|       default: defaultUseStatusEffect,
 | |
|       type: String
 | |
|     });
 | |
| 
 | |
|     game.settings.registerMenu("foundryvtt-reve-de-dragon", "select-status-effect", {
 | |
|       name: "Choisir les effets disponibles",
 | |
|       label: "Choix des effets",
 | |
|       hint: "Ouvre la fenêtre de sélection des effets/status appliqués aux acteurs",
 | |
|       icon: "fas fa-bars",
 | |
|       type: StatusEffectsSettings,
 | |
|       restricted: true
 | |
|     });
 | |
|     CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects);
 | |
|     
 | |
|     StatusEffects._setUseStatusEffects(StatusEffects._getUseStatusEffects());
 | |
|     console.log('statusEffects', CONFIG.statusEffects);
 | |
|   }
 | |
| 
 | |
|   static valeurSurprise(effect, isCombat) {
 | |
|     const id = StatusEffects.statusId(effect);
 | |
|     if (statusSurpriseTotale.has(id)) {
 | |
|       return 2;
 | |
|     }
 | |
|     return statusDemiSurprise.has(id) || (isCombat && id == demiReveStatusEffect.id) ? 1 : 0;
 | |
|   }
 | |
| 
 | |
|   static statusId(effectData) {
 | |
|     return effectData.flags?.core?.statusId ?? effectData["flags.core.statusId"];
 | |
|   }
 | |
| 
 | |
|   static setCoreStatusId(list) {
 | |
|     list.forEach(it => {
 | |
|       it.flags = { core: { statusId: it.id } };
 | |
|       it["flags.core.statusId"] = it.id;
 | |
|     });
 | |
|   }
 | |
|   static setMandatoryRdd() {
 | |
|     CONFIG.statusEffects.filter(it => statusDemiSurprise.has(it.id) || statusSurpriseTotale.has(it.id))
 | |
|       .forEach(it => it.rdd = true);
 | |
|   }
 | |
| 
 | |
|   static _getUseStatusEffects() {
 | |
|     const setting = game.settings.get("foundryvtt-reve-de-dragon", "use-status-effects");
 | |
|     return setting ? new Set(setting.split(',')) : new Set();
 | |
|   }
 | |
| 
 | |
|   static _setUseStatusEffects(useStatusEffects) {
 | |
|     if (game.user.isGM) {
 | |
|       game.settings.set("foundryvtt-reve-de-dragon", "use-status-effects", StatusEffects._toSetting(useStatusEffects));
 | |
|     }
 | |
| 
 | |
|     for (let effect of CONFIG.RDD.allEffects) {
 | |
|       effect.active = effect.rdd || useStatusEffects.has(effect.id);
 | |
|     }
 | |
|     CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active);
 | |
|   }
 | |
| 
 | |
|   static _toSetting(useStatusEffects) {
 | |
|     return Array.from(useStatusEffects).join();
 | |
|   }
 | |
| 
 | |
|   static demiReve() {
 | |
|     return demiReveStatusEffect;
 | |
|   }
 | |
| }
 | |
| 
 | |
| class StatusEffectsSettings extends FormApplication {
 | |
|   constructor(...args) {
 | |
|     super(...args);
 | |
|   }
 | |
| 
 | |
|   static get defaultOptions() {
 | |
|     const options = super.defaultOptions;
 | |
|     mergeObject(options, {
 | |
|       id: "status-effects-settings",
 | |
|       template: "systems/foundryvtt-reve-de-dragon/templates/status-effects-settings.html",
 | |
|       height: "800",
 | |
|       width: 350,
 | |
|       minimizable: false,
 | |
|       closeOnSubmit: true,
 | |
|       title: "Choix des status/effets"
 | |
|     });
 | |
|     return options;
 | |
|   }
 | |
| 
 | |
|   getData() {
 | |
|     let formData = super.getData();
 | |
|     formData.effects = CONFIG.RDD.allEffects;
 | |
|     return formData;
 | |
|   }
 | |
| 
 | |
|   activateListeners(html) {
 | |
|     html.find(".select-effect").click((event) => {
 | |
|       let id = event.currentTarget.attributes.name?.value;
 | |
|       if (id) {
 | |
|         let selected = StatusEffects._getUseStatusEffects();
 | |
|         let isChecked = event.currentTarget.checked;
 | |
|         if (isChecked) {
 | |
|           selected.add(id);
 | |
|         }
 | |
|         else {
 | |
|           selected.delete(id);
 | |
|         }
 | |
|         StatusEffects._setUseStatusEffects(selected);
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   async _updateObject(event, formData) {
 | |
|     this.close();
 | |
|   }
 | |
| }
 | |
| 
 |