ENH: Saving throws
							parent
							
								
									cb7fd49d55
								
							
						
					
					
						commit
						816c4d4a36
					
				|  | @ -2,6 +2,13 @@ | |||
|     "OSE.Edit": "Edit", | ||||
|     "OSE.Delete": "Delete", | ||||
|     "OSE.Add": "Add", | ||||
|     "OSE.Cancel": "Cancel", | ||||
|     "OSE.Roll": "Roll", | ||||
| 
 | ||||
|     "OSE.Formula": "Formula", | ||||
|     "OSE.SitMod": "Situational Modifier", | ||||
|     "OSE.RollMod": "Roll Mode", | ||||
|     "OSE.RollExample": "Roll Example", | ||||
| 
 | ||||
|     "OSE.Name": "Name", | ||||
|     "OSE.Class": "Class", | ||||
|  | @ -27,16 +34,17 @@ | |||
|     "OSE.scores.cha.long": "Charisma", | ||||
|     "OSE.scores.cha.short": "CHA", | ||||
| 
 | ||||
|     "OSE.SavingThrow": "Saving Throw", | ||||
|     "OSE.saves.death.short": "D", | ||||
|     "OSE.saves.death.long": "Death, Poison", | ||||
|     "OSE.saves.wands.short": "W", | ||||
|     "OSE.saves.wands.long": "Wand", | ||||
|     "OSE.saves.wand.short": "W", | ||||
|     "OSE.saves.wand.long": "Wand", | ||||
|     "OSE.saves.paralysis.short": "P", | ||||
|     "OSE.saves.paralysis.long": "Paralysis, Petrify", | ||||
|     "OSE.saves.breath.short": "B", | ||||
|     "OSE.saves.breath.long": "Dragon Breath", | ||||
|     "OSE.saves.spells.short": "S", | ||||
|     "OSE.saves.spells.long": "Rod, Staff, Spell", | ||||
|     "OSE.saves.spell.short": "S", | ||||
|     "OSE.saves.spell.long": "Rod, Staff, Spell", | ||||
| 
 | ||||
|     "OSE.Health": "Hit Points", | ||||
|     "OSE.HealthShort": "HP", | ||||
|  |  | |||
|  | @ -8,10 +8,14 @@ export class OseActorSheet extends ActorSheet { | |||
|     /* -------------------------------------------- */ | ||||
|    | ||||
|     activateListeners(html) { | ||||
|       super.activateListeners(html); | ||||
|       html.find('.saving-throw .attribute-name').click(ev => { | ||||
|         console.log('hey'); | ||||
|       html.find('.saving-throw .attribute-name a').click(ev => { | ||||
|         let actorObject = this.actor; | ||||
|         let element = event.currentTarget; | ||||
|         let save = element.parentElement.parentElement.dataset.save; | ||||
|         actorObject.rollSave(save, { event: event }); | ||||
|       }) | ||||
| 
 | ||||
|       super.activateListeners(html); | ||||
|     } | ||||
| 
 | ||||
|     // Override to set resizable initial size
 | ||||
|  |  | |||
|  | @ -1,20 +1,29 @@ | |||
| import { OseDice } from '../dice.js'; | ||||
| 
 | ||||
| export class OseActor extends Actor { | ||||
|   /** | ||||
|    * Extends data from base Actor class | ||||
|    */ | ||||
|   prepareData() { | ||||
|     super.prepareData(); | ||||
|     return this.data; | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
| 
 | ||||
|    /* -------------------------------------------- */ | ||||
|   /*  Socket Listeners and Handlers | ||||
|     /* -------------------------------------------- */ | ||||
| 
 | ||||
|   /** @override */ | ||||
|   async createOwnedItem(itemData, options) { | ||||
|     return super.createOwnedItem(itemData, options); | ||||
|   } | ||||
|   /* -------------------------------------------- */ | ||||
|   /*  Rolls                                       */ | ||||
|   /* -------------------------------------------- */ | ||||
|   rollSave(save, options = {}) { | ||||
|     const label = game.i18n.localize(`OSE.saves.${save}.long`); | ||||
|     const rollParts = ['1d20']; | ||||
| 
 | ||||
|     // Roll and return
 | ||||
|     return OseDice.Roll({ | ||||
|       event: options.event, | ||||
|       parts: rollParts, | ||||
|       data: this.data, | ||||
|       speaker: ChatMessage.getSpeaker({ actor: this }), | ||||
|       flavor: `${label} ${game.i18n.localize('OSE.SavingThrow')}`, | ||||
|       title: `${label} ${game.i18n.localize('OSE.SavingThrow')}`, | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,78 @@ | |||
| export class OseDice { | ||||
|   // eslint-disable-next-line no-unused-vars
 | ||||
|   static async Roll({ | ||||
|     parts = [], | ||||
|     data = {}, | ||||
|     options = {}, | ||||
|     event = null, | ||||
|     speaker = null, | ||||
|     flavor = null, | ||||
|     title = null, | ||||
|     item = false, | ||||
|   } = {}) { | ||||
|     let rollMode = game.settings.get("core", "rollMode"); | ||||
|     let rolled = false; | ||||
|     let filtered = parts.filter(function (el) { | ||||
|       return el != "" && el; | ||||
|     }); | ||||
| 
 | ||||
|     const _roll = (form = null, raise = false) => { | ||||
|       // Optionally include a situational bonus
 | ||||
|       if (form !== null) data["bonus"] = form.bonus.value; | ||||
|       if (data["bonus"]) filtered.push(data["bonus"]); | ||||
| 
 | ||||
|       const roll = new Roll(filtered.join(""), data).roll(); | ||||
|       // Convert the roll to a chat message and return the roll
 | ||||
|       rollMode = form ? form.rollMode.value : rollMode; | ||||
|       roll.toMessage( | ||||
|         { | ||||
|           speaker: speaker, | ||||
|           flavor: flavor, | ||||
|         }, | ||||
|         { rollMode } | ||||
|       ); | ||||
|       rolled = true; | ||||
|       return roll; | ||||
|     }; | ||||
| 
 | ||||
|     const template = "systems/ose/templates/chat/roll-dialog.html"; | ||||
|     let dialogData = { | ||||
|       formula: filtered.join(" "), | ||||
|       data: data, | ||||
|       rollMode: rollMode, | ||||
|       rollModes: CONFIG.Dice.rollModes, | ||||
|     }; | ||||
| 
 | ||||
|     let buttons = { | ||||
|       ok: { | ||||
|         label: game.i18n.localize("OSE.Roll"), | ||||
|         icon: '<i class="fas fa-dice-d20"></i>', | ||||
|         callback: (html) => { | ||||
|           roll = _roll(html[0].children[0]); | ||||
|         }, | ||||
|       }, | ||||
|       cancel: { | ||||
|         icon: '<i class="fas fa-times"></i>', | ||||
|         label: game.i18n.localize("OSE.Cancel"), | ||||
|       }, | ||||
|     }; | ||||
| 
 | ||||
|     if (!item) delete buttons.raise; | ||||
| 
 | ||||
|     const html = await renderTemplate(template, dialogData); | ||||
|     let roll; | ||||
| 
 | ||||
|     //Create Dialog window
 | ||||
|     return new Promise((resolve) => { | ||||
|       new Dialog({ | ||||
|         title: title, | ||||
|         content: html, | ||||
|         buttons: buttons, | ||||
|         default: "ok", | ||||
|         close: () => { | ||||
|             resolve(rolled ? roll : false)     | ||||
|         }, | ||||
|       }).render(true); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|  | @ -120,11 +120,11 @@ | |||
|         "morale": 0 | ||||
|       }, | ||||
|       "saves": { | ||||
|         "D": 10, | ||||
|         "W": 10, | ||||
|         "P": 10, | ||||
|         "B": 10, | ||||
|         "S": 10 | ||||
|         "death": 10, | ||||
|         "wand": 10, | ||||
|         "paralysis": 10, | ||||
|         "breath": 10, | ||||
|         "spell": 10 | ||||
|       }, | ||||
|       "thac0": { | ||||
|         "value": 19, | ||||
|  |  | |||
|  | @ -129,34 +129,34 @@ | |||
|     {{!-- Saving throws --}} | ||||
|     <div class="attribute-group"> | ||||
|         <ul class="attributes"> | ||||
|             <li class="attribute saving-throw"> | ||||
|             <li class="attribute saving-throw" data-save="death"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.death.long' }}"><a>{{ localize "OSE.saves.death.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.d.value" type="text" value="{{data.saves.d.value}}" placeholder="0" | ||||
|                     <input name="data.saves.death.value" type="text" value="{{data.saves.death.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute saving-throw"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.wands.long' }}"><a>{{ localize "OSE.saves.wands.short" }}</a></h4> | ||||
|             <li class="attribute saving-throw" data-save="wand"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.wand.long' }}"><a>{{ localize "OSE.saves.wand.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.w.value" type="text" value="{{data.saves.w.value}}" placeholder="0" | ||||
|                     <input name="data.saves.wand.value" type="text" value="{{data.saves.wand.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute saving-throw"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.paralysis.long' }}"><a>{{ localize "OSE.saves.paralysis.short" }</a></h4> | ||||
|             <li class="attribute saving-throw" data-save="paralysis"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.paralysis.long' }}"><a>{{ localize "OSE.saves.paralysis.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.p.value" type="text" value="{{data.saves.p.value}}" placeholder="0" | ||||
|                     <input name="data.saves.paralysis.value" type="text" value="{{data.saves.paralysis.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute saving-throw"> | ||||
|             <li class="attribute saving-throw" data-save="breath"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.breath.long' }}"><a>{{ localize "OSE.saves.breath.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.b.value" type="text" value="{{data.saves.b.value}}" placeholder="0" | ||||
|                     <input name="data.saves.breath.value" type="text" value="{{data.saves.breath.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute saving-throw"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.spells.long' }}"><a>{{ localize "OSE.saves.spells.short" }}</a></h4> | ||||
|             <li class="attribute saving-throw" data-save="spell"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.spell.long' }}"><a>{{ localize "OSE.saves.spell.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.s.value" type="text" value="{{data.saves.s.value}}" placeholder="0" /> | ||||
|                     <input name="data.saves.spell.value" type="text" value="{{data.saves.spell.value}}" placeholder="0" /> | ||||
|             </li> | ||||
|         </ul> | ||||
|     </div> | ||||
|  |  | |||
|  | @ -112,34 +112,34 @@ | |||
|     {{!-- Saving throws --}} | ||||
|     <div class="attribute-group"> | ||||
|         <ul class="attributes"> | ||||
|             <li class="attribute"> | ||||
|             <li class="attribute saving-throw" data-save="death"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.death.long' }}"><a>{{ localize "OSE.saves.death.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.d.value" type="text" value="{{data.saves.d.value}}" placeholder="0" | ||||
|                     <input name="data.saves.death.value" type="text" value="{{data.saves.death.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.wands.long' }}"><a>{{ localize "OSE.saves.wands.short" }}</a></h4> | ||||
|             <li class="attribute saving-throw" data-save="wand"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.wand.long' }}"><a>{{ localize "OSE.saves.wand.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.w.value" type="text" value="{{data.saves.w.value}}" placeholder="0" | ||||
|                     <input name="data.saves.wand.value" type="text" value="{{data.saves.wand.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|             <li class="attribute saving-throw" data-save="paralysis"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.paralysis.long' }}"><a>{{ localize "OSE.saves.paralysis.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.p.value" type="text" value="{{data.saves.p.value}}" placeholder="0" | ||||
|                     <input name="data.saves.paralysis.value" type="text" value="{{data.saves.paralysis.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|             <li class="attribute saving-throw" data-save="breath"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.breath.long' }}"><a>{{ localize "OSE.saves.breath.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.b.value" type="text" value="{{data.saves.b.value}}" placeholder="0" | ||||
|                     <input name="data.saves.breath.value" type="text" value="{{data.saves.breath.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.spells.long' }}"><a>{{ localize "OSE.saves.spells.short" }}</a></h4> | ||||
|             <li class="attribute saving-throw" data-save="spell"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.spell.long' }}"><a>{{ localize "OSE.saves.spell.short" }}</a></h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.s.value" type="text" value="{{data.saves.s.value}}" placeholder="0" /> | ||||
|                     <input name="data.saves.spell.value" type="text" value="{{data.saves.spell.value}}" placeholder="0" /> | ||||
|             </li> | ||||
|         </ul> | ||||
|     </div> | ||||
|  |  | |||
|  | @ -0,0 +1,20 @@ | |||
| <form> | ||||
|     <div class="form-group"> | ||||
|         <label>{{localize "OSE.Formula"}}</label> | ||||
|         <input type="text" name="formula" value="{{formula}}" disabled /> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|         <label>{{localize "OSE.SitMod"}}</label> | ||||
|         <input type="text" name="bonus" value="" placeholder="{{localize 'OSE.RollExample'}}" /> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|         <label>{{localize "OSE.RollMode"}}</label> | ||||
|         <select name="rollMode"> | ||||
|             {{#select rollMode}} | ||||
|             {{#each rollModes as |label mode|}} | ||||
|             <option value="{{mode}}">{{localize label}}</option> | ||||
|             {{/each}} | ||||
|             {{/select}} | ||||
|         </select> | ||||
|     </div> | ||||
| </form> | ||||
		Loading…
	
		Reference in New Issue