Merge branch 'development' into 'master'
Development See merge request mesfoliesludiques/foundryvtt-ose!1master
						commit
						b40858aba1
					
				
							
								
								
									
										10
									
								
								README.md
								
								
								
								
							
							
						
						
									
										10
									
								
								README.md
								
								
								
								
							|  | @ -1 +1,9 @@ | |||
| ### Old School Essentials System for Foundry VTT | ||||
| # Old School Essentials System for Foundry VTT | ||||
| 
 | ||||
| ## License | ||||
| Old-School Essentials is a trademark of Necrotic Gnome.  | ||||
| This Foundry VTT system requires Old-School Essentials Core Rules and does not contain any copyrighted material. | ||||
| 
 | ||||
| ## Contributions | ||||
| This system is currently under heavy development. | ||||
| Feel free to grab a TO DO issue from the gitlab board. You can then do a merge request on the `development` branch. | ||||
|  | @ -1,6 +1,7 @@ | |||
| { | ||||
|     "OSE.Edit": "Edit", | ||||
|     "OSE.Delete": "Delete", | ||||
|     "OSE.Add": "Add", | ||||
| 
 | ||||
|     "OSE.Name": "Name", | ||||
|     "OSE.Class": "Class", | ||||
|  | @ -8,6 +9,10 @@ | |||
|     "OSE.Alignment": "Alignment", | ||||
|     "OSE.Level": "Level", | ||||
|     "OSE.Experience": "Experience", | ||||
|     "OSE.Treasure": "Treasure type", | ||||
|     "OSE.Size": "Size", | ||||
|     "OSE.Morale": "Morale", | ||||
|     "OSE.Appearing": "NA", | ||||
| 
 | ||||
|     "OSE.scores.str.long": "Strength", | ||||
|     "OSE.scores.str.short": "STR", | ||||
|  | @ -23,18 +28,31 @@ | |||
|     "OSE.scores.cha.short": "CHA", | ||||
| 
 | ||||
|     "OSE.saves.death.short": "D", | ||||
|     "OSE.saves.death.long": "Death", | ||||
|     "OSE.saves.wands.short": "W", | ||||
|     "OSE.saves.wands.long": "Wands", | ||||
|     "OSE.saves.paralysis.short": "P", | ||||
|     "OSE.saves.paralysis.long": "Paralysis", | ||||
|     "OSE.saves.breath.short": "B", | ||||
|     "OSE.saves.breath.long": "Breath", | ||||
|     "OSE.saves.spells.short": "S", | ||||
|     "OSE.saves.spells.long": "Spells", | ||||
| 
 | ||||
|     "OSE.Health": "Hit Points", | ||||
|     "OSE.HealthShort": "HP", | ||||
|     "OSE.HitDice": "Hit Dice", | ||||
|     "OSE.HitDiceShort": "HD", | ||||
|     "OSE.Movement": "Movement", | ||||
|     "OSE.MovementShort": "MOV", | ||||
|     "OSE.SpecialMovement": "Special Movement", | ||||
|     "OSE.ArmorClass": "Armor Class", | ||||
|     "OSE.ArmorClassShort": "AC", | ||||
|     "OSE.SpellDC": "DC", | ||||
|     "OSE.Thac0": "THAC0", | ||||
|     "OSE.Initiative": "Initiative", | ||||
|     "OSE.InitiativeShort": "INIT", | ||||
|     "OSE.Attacks": "Attacks Usable per Round", | ||||
|     "OSE.AttacksShort": "ATT", | ||||
| 
 | ||||
|      | ||||
|     "OSE.category.attributes": "Attributes", | ||||
|  | @ -42,5 +60,6 @@ | |||
|     "OSE.category.spells": "Spells", | ||||
|     "OSE.category.notes": "Notes", | ||||
|      | ||||
|     "OSE.panel.abilities": "Abilities" | ||||
|     "OSE.panel.abilities": "Abilities", | ||||
|     "OSE.panel.equipment": "Equipment" | ||||
| } | ||||
|  | @ -1,2 +1,65 @@ | |||
| { | ||||
|     "OSE.Edit": "Modifier", | ||||
|     "OSE.Delete": "Supprimer", | ||||
|     "OSE.Add": "Ajouter", | ||||
| 
 | ||||
|     "OSE.Name": "Nom", | ||||
|     "OSE.Class": "Classe", | ||||
|     "OSE.Title": "Titre", | ||||
|     "OSE.Alignment": "Alignement", | ||||
|     "OSE.Level": "Niveau", | ||||
|     "OSE.Experience": "Expérience", | ||||
|     "OSE.Treasure": "Butin", | ||||
|     "OSE.Size": "Taille", | ||||
|     "OSE.Morale": "Moral", | ||||
|     "OSE.Appearing": "NA", | ||||
| 
 | ||||
|     "OSE.scores.str.long": "Force", | ||||
|     "OSE.scores.str.short": "FOR", | ||||
|     "OSE.scores.wis.long": "Sagesse", | ||||
|     "OSE.scores.wis.short": "SAG", | ||||
|     "OSE.scores.int.long": "Intelligence", | ||||
|     "OSE.scores.int.short": "INT", | ||||
|     "OSE.scores.dex.long": "Dextérité", | ||||
|     "OSE.scores.dex.short": "DEX", | ||||
|     "OSE.scores.con.long": "Constitution", | ||||
|     "OSE.scores.con.short": "CON", | ||||
|     "OSE.scores.cha.long": "Charisme", | ||||
|     "OSE.scores.cha.short": "CHA", | ||||
| 
 | ||||
|     "OSE.saves.death.short": "D", | ||||
|     "OSE.saves.death.long": "Mort", | ||||
|     "OSE.saves.wands.short": "W", | ||||
|     "OSE.saves.wands.long": "Baguettes", | ||||
|     "OSE.saves.paralysis.short": "P", | ||||
|     "OSE.saves.paralysis.long": "Paralysie", | ||||
|     "OSE.saves.breath.short": "B", | ||||
|     "OSE.saves.breath.long": "Souffle", | ||||
|     "OSE.saves.spells.short": "S", | ||||
|     "OSE.saves.spells.long": "Sorts", | ||||
| 
 | ||||
|     "OSE.Health": "Points de Vie", | ||||
|     "OSE.HealthShort": "PV", | ||||
|     "OSE.HitDice": "Dés de Vie", | ||||
|     "OSE.HitDiceShort": "DV", | ||||
|     "OSE.Movement": "Mouvement", | ||||
|     "OSE.MovementShort": "MOUV", | ||||
|     "OSE.SpecialMovement": "Mouvement Spécial", | ||||
|     "OSE.ArmorClass": "Classe d'Armure", | ||||
|     "OSE.ArmorClassShort": "CA", | ||||
|     "OSE.SpellDC": "DF", | ||||
|     "OSE.Thac0": "THAC0", | ||||
|     "OSE.Initiative": "Initiative", | ||||
|     "OSE.InitiativeShort": "INIT", | ||||
|     "OSE.Attacks": "Attaques par Round", | ||||
|     "OSE.AttacksShort": "ATT", | ||||
| 
 | ||||
|      | ||||
|     "OSE.category.attributes": "Attributs", | ||||
|     "OSE.category.inventory": "Inventaire", | ||||
|     "OSE.category.spells": "Sorts", | ||||
|     "OSE.category.notes": "Notes", | ||||
|      | ||||
|     "OSE.panel.abilities": "Aptitudes", | ||||
|     "OSE.panel.equipment": "Equipement" | ||||
| } | ||||
|  | @ -33,6 +33,20 @@ export class OseActorSheetCharacter extends ActorSheet { | |||
| 
 | ||||
|   /* -------------------------------------------- */ | ||||
| 
 | ||||
|   // Override to set resizable initial size
 | ||||
|   async _renderInner(...args) { | ||||
|     const html = await super._renderInner(...args); | ||||
|     this.form = html[0]; | ||||
| 
 | ||||
|     // Resize resizable classes
 | ||||
|     let resizable = html.find('.resizable'); | ||||
|     resizable.each((_, el) => { | ||||
|       let heightDelta = this.position.height - (this.options.height); | ||||
|       el.style.height = `${heightDelta + parseInt(el.dataset.baseSize)}px`; | ||||
|     }); | ||||
|     return html; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Prepare data for rendering the Actor sheet | ||||
|    * The prepared data object contains both the actor data as well as additional sheet options | ||||
|  | @ -94,12 +108,6 @@ export class OseActorSheetCharacter extends ActorSheet { | |||
|     li.toggleClass("expanded"); | ||||
|   } | ||||
| 
 | ||||
|   _onRollAttribute(event) { | ||||
|     event.preventDefault(); | ||||
|     let attribute = event.currentTarget.dataset.attribute; | ||||
|     this.actor.rollAttribute(attribute, { event: event }); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Activate event listeners using the prepared sheet HTML | ||||
|    * @param html {HTML}   The prepared HTML object ready to be rendered into the DOM | ||||
|  | @ -141,4 +149,14 @@ export class OseActorSheetCharacter extends ActorSheet { | |||
|     // Handle default listeners last so system listeners are triggered first
 | ||||
|     super.activateListeners(html); | ||||
|   } | ||||
| 
 | ||||
|   async _onResize(event) { | ||||
|     super._onResize(event); | ||||
|     let html = $(event.path); | ||||
|     let resizable = html.find('.resizable'); | ||||
|     resizable.each((_, el) => { | ||||
|       let heightDelta = this.position.height - (this.options.height); | ||||
|       el.style.height = `${heightDelta + parseInt(el.dataset.baseSize)}px`; | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -17,65 +17,4 @@ export class OseActor extends Actor { | |||
|   /* -------------------------------------------- */ | ||||
|   /*  Rolls                                       */ | ||||
|   /* -------------------------------------------- */ | ||||
|    | ||||
|   rollAttribute(attributeId, options = {}) { | ||||
|     const label = CONFIG.MAJI.attributes[attributeId]; | ||||
| 
 | ||||
|     const abl = this.data.data.attributes[attributeId]; | ||||
|     let parts = []; | ||||
|     if (abl.value <= 4) { | ||||
|       parts.push("2d4"); | ||||
|     } else if (abl.value <= 7) { | ||||
|       parts.push("2d6"); | ||||
|     } else { | ||||
|       parts.push("2d8"); | ||||
|     } | ||||
|     let rollMode = game.settings.get("core", "rollMode"); | ||||
|     let roll = new Roll(parts.join(" + "), {}).roll(); | ||||
|     roll.toMessage( | ||||
|       { | ||||
|         speaker: ChatMessage.getSpeaker({ actor: this }), | ||||
|         flavor: `${label} Attribute Test`, | ||||
|       }, | ||||
|       { rollMode } | ||||
|     ); | ||||
|     return roll; | ||||
|   } | ||||
| 
 | ||||
|   rollInit(monsterId, options = {}) { | ||||
|     let monster = game.actors.get(monsterId); | ||||
|     let speed = monster.data.data.attributes.speed.value + monster.data.data.attributes.speed.mod; | ||||
|     if (!game.combats.active) return; | ||||
|     let combatant = game.combats.active.getCombatant(this.actor); | ||||
|     console.log(combatant); | ||||
|   } | ||||
| 
 | ||||
|   static async applyDamage(roll, options = {}) { | ||||
|     let value = Math.floor(parseFloat(roll.find(".dice-total").text())); | ||||
|     const promises = []; | ||||
|     for (let t of canvas.tokens.controlled) { | ||||
|       let a = t.actor, | ||||
|         hp = a.data.data.hp; | ||||
|       let delta = 0; | ||||
|       if (a.data.type == "monster") { | ||||
|         if (options.vulnerable) { | ||||
|           delta -= value + a.data.data.affinity.value; | ||||
|         } else if (options.resistant) { | ||||
|           delta -= Math.max(0, value - a.data.data.resistance.value); | ||||
|         } else if (options.healing) { | ||||
|           delta += value; | ||||
|         } else { | ||||
|           delta -= value; | ||||
|         } | ||||
|       } else { | ||||
|         delta -= options.healing ? -value : value; | ||||
|       } | ||||
|       promises.push( | ||||
|         t.actor.update({ | ||||
|           "data.hp.value": Math.clamped(hp.value + delta, 0, hp.max), | ||||
|         }) | ||||
|       ); | ||||
|     } | ||||
|     return Promise.all(promises); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -18,14 +18,14 @@ export class OseActorSheetMonster extends ActorSheet { | |||
|     return mergeObject(super.defaultOptions, { | ||||
|       classes: ["ose", "sheet", "monster", "actor"], | ||||
|       template: "systems/ose/templates/actors/monster-sheet.html", | ||||
|       width: 520, | ||||
|       height: 580, | ||||
|       resizable: false, | ||||
|       width: 450, | ||||
|       height: 560, | ||||
|       resizable: true, | ||||
|       tabs: [ | ||||
|         { | ||||
|           navSelector: ".tabs", | ||||
|           contentSelector: ".sheet-body", | ||||
|           initial: "notes", | ||||
|           initial: "attributes", | ||||
|         }, | ||||
|       ], | ||||
|     }); | ||||
|  | @ -33,16 +33,36 @@ export class OseActorSheetMonster extends ActorSheet { | |||
| 
 | ||||
|   /* -------------------------------------------- */ | ||||
| 
 | ||||
|   // Override to set resizable initial size
 | ||||
|   async _renderInner(...args) { | ||||
|     const html = await super._renderInner(...args); | ||||
|     this.form = html[0]; | ||||
| 
 | ||||
|     // Resize resizable classes
 | ||||
|     let resizable = html.find('.resizable'); | ||||
|     if (resizable.length == 0) { | ||||
|       return; | ||||
|     } | ||||
|     resizable.each((_, el) => { | ||||
|       let heightDelta = this.position.height - (this.options.height); | ||||
|       el.style.height = `${heightDelta + parseInt(el.dataset.baseSize)}px`; | ||||
|     }); | ||||
|     return html; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Prepare data for rendering the Actor sheet | ||||
|    * The prepared data object contains both the actor data as well as additional sheet options | ||||
|    */ | ||||
|   getData() { | ||||
|     const data = super.getData(); | ||||
|      | ||||
|     data.config = CONFIG.OSE; | ||||
| 
 | ||||
|     // Prepare owned items
 | ||||
|     this._prepareItems(data); | ||||
| 
 | ||||
|     // DEBUG
 | ||||
|     return data; | ||||
|   } | ||||
| 
 | ||||
|  | @ -51,31 +71,40 @@ export class OseActorSheetMonster extends ActorSheet { | |||
|    * @private | ||||
|    */ | ||||
|   _prepareItems(data) { | ||||
|     // Partition items by category
 | ||||
|     let [inventory, abilities, spells] = data.items.reduce( | ||||
|       (arr, item) => { | ||||
|         // Classify items into types
 | ||||
|         if (item.type === "item") arr[0].push(item); | ||||
|         if (item.type === "ability") arr[1].push(item); | ||||
|         else if (item.type === "spell") arr[2].push(item); | ||||
|         return arr; | ||||
|       }, | ||||
|       [[], [], [], []] | ||||
|     ); | ||||
| 
 | ||||
|     // Assign and return
 | ||||
|     data.inventory = inventory; | ||||
|     data.spells = spells; | ||||
|     data.abilities = abilities; | ||||
|   } | ||||
|    | ||||
| 
 | ||||
|   _onItemSummary(event) { | ||||
|     event.preventDefault(); | ||||
|     let li = $(event.currentTarget).parents(".item-entry"), | ||||
|       expanded = !li.children(".collapsible").hasClass("collapsed"); | ||||
|     li = $(li); | ||||
|     let ol = li.children(".collapsible"); | ||||
|     let icon = li.find("i.fas"); | ||||
| 
 | ||||
|     // Collapse the Playlist
 | ||||
|     if (expanded) { | ||||
|       ol.slideUp(200, () => { | ||||
|         ol.addClass("collapsed"); | ||||
|         icon.removeClass("fa-angle-up").addClass("fa-angle-down"); | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
|     // Expand the Playlist
 | ||||
|     else { | ||||
|       ol.slideDown(200, () => { | ||||
|         ol.removeClass("collapsed"); | ||||
|         icon.removeClass("fa-angle-down").addClass("fa-angle-up"); | ||||
|       }); | ||||
|     let li = $(event.currentTarget).parents(".item"), | ||||
|         item = this.actor.getOwnedItem(li.data("item-id")), | ||||
|         description = TextEditor.enrichHTML(item.data.data.description); | ||||
|     // Toggle summary
 | ||||
|     if ( li.hasClass("expanded") ) { | ||||
|       let summary = li.parents('.item-entry').children(".item-summary"); | ||||
|       summary.slideUp(200, () => summary.remove()); | ||||
|     } else { | ||||
|       let div = $(`<div class="item-summary">${description}</div>`); | ||||
|       li.parents('.item-entry').append(div.hide()); | ||||
|       div.slideDown(200); | ||||
|     } | ||||
|     li.toggleClass("expanded"); | ||||
|   } | ||||
| 
 | ||||
|   /* -------------------------------------------- */ | ||||
|  | @ -122,4 +151,14 @@ export class OseActorSheetMonster extends ActorSheet { | |||
|     // Handle default listeners last so system listeners are triggered first
 | ||||
|     super.activateListeners(html); | ||||
|   } | ||||
| 
 | ||||
|   async _onResize(event) { | ||||
|     super._onResize(event); | ||||
|     let html = $(event.path); | ||||
|     let resizable = html.find('.resizable'); | ||||
|     resizable.each((_, el) => { | ||||
|       let heightDelta = this.position.height - (this.options.height); | ||||
|       el.style.height = `${heightDelta + parseInt(el.dataset.baseSize)}px`; | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -8,6 +8,31 @@ | |||
|     padding: 0; | ||||
|   } | ||||
| 
 | ||||
|   .panel { | ||||
|     border: 1px solid $colorDark; | ||||
|     .panel-title { | ||||
|       color: whitesmoke; | ||||
|       background: $colorDark; | ||||
|       line-height: 14px; | ||||
|       height: 20px; | ||||
|       text-align: center; | ||||
|       margin: 0; | ||||
|       padding: 4px; | ||||
|       display: flex; | ||||
|       h4 { | ||||
|         flex: 1; | ||||
|       } | ||||
|       .item-controls { | ||||
|         font-size: 12px; | ||||
|         flex: 0 0 18px; | ||||
|       } | ||||
|     } | ||||
|     .panel-content { | ||||
|       margin: 0; | ||||
|       padding: 0; | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   /* Header Summary Details */ | ||||
|   .header-details { | ||||
|     h1 { | ||||
|  | @ -75,6 +100,7 @@ | |||
|         .attribute-name { | ||||
|           color: whitesmoke; | ||||
|           padding: 2px; | ||||
|           margin: 0; | ||||
|           background: $colorDark; | ||||
|           text-align: center; | ||||
|         } | ||||
|  | @ -85,6 +111,22 @@ | |||
|         } | ||||
|       } | ||||
|     } | ||||
|     .attribute-group { | ||||
|       .attributes { | ||||
|         .attribute { | ||||
|           display: flex; | ||||
|           flex-direction: row; | ||||
|           .attribute-name { | ||||
|             width: 40px; | ||||
|             margin: 0; | ||||
|             line-height: 28px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     .editor { | ||||
|       height: 300px; | ||||
|     } | ||||
|     .inventory { | ||||
|       .item-entry { | ||||
|         padding: 0; | ||||
|  | @ -93,10 +135,13 @@ | |||
|         .item { | ||||
|           .item-image { | ||||
|             flex: 0 0 24px; | ||||
|             height: 24px; | ||||
|             background-size: cover; | ||||
|           } | ||||
|           .item-name { | ||||
|             line-height: 24px; | ||||
|             height: 24px; | ||||
|             overflow: hidden; | ||||
|             h4 { | ||||
|               text-indent: 4px; | ||||
|               margin: 0; | ||||
|  | @ -123,13 +168,13 @@ | |||
|               } | ||||
|             } | ||||
|           } | ||||
|           &:nth-child(odd) { | ||||
|             background: rgba(0, 0, 0, 0.1); | ||||
|           } | ||||
|         } | ||||
|         .item-summary { | ||||
|           font-size: 12px; | ||||
|           padding: 4px; | ||||
|           padding: 0 4px; | ||||
|         } | ||||
|         &:nth-child(odd) { | ||||
|           background: rgba(0, 0, 0, 0.1); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  |  | |||
|  | @ -18,40 +18,8 @@ | |||
|   /*  Sheet Body                               */ | ||||
|   /* ----------------------------------------- */ | ||||
|   .sheet-body { | ||||
|     .attribute-group { | ||||
|       .attributes { | ||||
|         .attribute { | ||||
|           display: flex; | ||||
|           flex-direction: row; | ||||
|           .attribute-name { | ||||
|             width: 40px; | ||||
|             margin: 0; | ||||
|             line-height: 28px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     .editor { | ||||
|       height: 300px; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   .panel { | ||||
|     border: 1px solid $colorDark; | ||||
|     .panel-title { | ||||
|       color: whitesmoke; | ||||
|       background: $colorDark; | ||||
|       line-height: 14px; | ||||
|       height: 20px; | ||||
|       text-align: center; | ||||
|       margin: 0; | ||||
|       padding: 4px; | ||||
|     } | ||||
|     .panel-content { | ||||
|       margin: 0; | ||||
|       padding: 0; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   .abilities { | ||||
|     .panel-content { | ||||
|  |  | |||
|  | @ -33,4 +33,8 @@ | |||
|   a:hover { | ||||
|     text-shadow: none; | ||||
|   } | ||||
| 
 | ||||
|   .resizable { | ||||
|     overflow: auto; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,21 @@ | |||
| .ose.actor.monster { | ||||
|     min-height: 565px; | ||||
|     min-width: 460px; | ||||
|   .sheet-body { | ||||
|     .editor { | ||||
|       height: 300px; | ||||
|     } | ||||
|   } | ||||
|   .abilities { | ||||
|     .panel-content { | ||||
|       height: 230px; | ||||
|       overflow: auto;   | ||||
|     } | ||||
|   } | ||||
|   .attribute-row { | ||||
|       padding: 2px; | ||||
|       .abilities { | ||||
|           margin: 2px; | ||||
|       } | ||||
|   } | ||||
| } | ||||
|  | @ -2,7 +2,7 @@ | |||
|   "name": "ose", | ||||
|   "title": "Old-School Essentials", | ||||
|   "description": "Play OSR modules with Old-School Essentials on Foundry VTT", | ||||
|   "version": 0.1, | ||||
|   "version": 0.2, | ||||
|   "minimumCoreVersion": "0.6.2", | ||||
|   "compatibleCoreVersion": "0.6.4", | ||||
|   "templateVersion": 2, | ||||
|  |  | |||
|  | @ -74,7 +74,7 @@ | |||
|         "value": 0, | ||||
|         "mod": 0 | ||||
|       }, | ||||
|       "thaco": { | ||||
|       "thac0": { | ||||
|         "value": 19, | ||||
|         "mod": 0 | ||||
|       }, | ||||
|  | @ -101,6 +101,8 @@ | |||
|         "alignment": "", | ||||
|         "xp": 0, | ||||
|         "treasure": "", | ||||
|         "size": "", | ||||
|         "appearing": "", | ||||
|         "morale": 0 | ||||
|       }, | ||||
|       "saves": { | ||||
|  | @ -110,7 +112,7 @@ | |||
|         "B": 10, | ||||
|         "S": 10 | ||||
|       }, | ||||
|       "thaco": { | ||||
|       "thac0": { | ||||
|         "value": 19, | ||||
|         "mod": 0 | ||||
|       }, | ||||
|  | @ -123,9 +125,35 @@ | |||
|         "value": 0, | ||||
|         "mod": 0 | ||||
|       }, | ||||
|       "attacks": { | ||||
|         "value": 1 | ||||
|       }, | ||||
|       "movement": { | ||||
|         "base": 0, | ||||
|         "encounter": 0 | ||||
|       }, | ||||
|       "spells": { | ||||
|         "dc": 0, | ||||
|         "lvl1": { | ||||
|           "value": 0, | ||||
|           "max": 0 | ||||
|         }, | ||||
|         "lvl2": { | ||||
|           "value": 0, | ||||
|           "max": 0 | ||||
|         }, | ||||
|         "lvl3": { | ||||
|           "value": 0, | ||||
|           "max": 0 | ||||
|         }, | ||||
|         "lvl4": { | ||||
|           "value": 0, | ||||
|           "max": 0 | ||||
|         }, | ||||
|         "lvl5": { | ||||
|           "value": 0, | ||||
|           "max": 0 | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|  |  | |||
|  | @ -22,11 +22,7 @@ | |||
|   {{! Sheet Body }} | ||||
|   <section class="sheet-body"> | ||||
|     {{! Attributes Tab }} | ||||
|     <div | ||||
|       class="tab" | ||||
|       data-group="primary" | ||||
|       data-tab="attributes" | ||||
|     > | ||||
|     <div class="tab" data-group="primary" data-tab="attributes"> | ||||
|       {{> "systems/ose/templates/actors/partials/character-attributes-tab.html"}} | ||||
|     </div> | ||||
|     <div class="tab" data-group="primary" data-tab="inventory"> | ||||
|  | @ -40,4 +36,4 @@ | |||
|       button=true owner=owner editable=editable}} | ||||
|     </div> | ||||
|   </section> | ||||
| </form> | ||||
| </form> | ||||
|  | @ -0,0 +1,33 @@ | |||
| <form class="{{cssClass}}" autocomplete="off"> | ||||
|   {{! Sheet Header }} | ||||
|   <header class="sheet-header flexrow"> | ||||
|     {{> "systems/ose/templates/actors/partials/monster-header.html"}} | ||||
|   </header> | ||||
| 
 | ||||
|   {{! Sheet Tab Navigation }} | ||||
|   <nav class="sheet-tabs tabs flexrow" data-group="primary"> | ||||
|     <a class="item" data-tab="attributes"> | ||||
|       {{localize "OSE.category.attributes"}} | ||||
|     </a> | ||||
|     <a class="item" data-tab="spells"> | ||||
|       {{localize "OSE.category.spells"}} | ||||
|     </a> | ||||
|     <a class="item" data-tab="notes"> | ||||
|       {{localize "OSE.category.notes"}} | ||||
|     </a> | ||||
|   </nav> | ||||
|   {{! Sheet Body }} | ||||
|   <section class="sheet-body"> | ||||
|     {{! Attributes Tab }} | ||||
|     <div class="tab" data-group="primary" data-tab="attributes"> | ||||
|       {{> "systems/ose/templates/actors/partials/monster-attributes-tab.html"}} | ||||
|     </div> | ||||
|     <div class="tab" data-group="primary" data-tab="spells"> | ||||
|       {{> "systems/ose/templates/actors/partials/character-spells-tab.html"}} | ||||
|     </div> | ||||
|     <div class="tab" data-group="primary" data-tab="notes"> | ||||
|       {{editor content=data.details.biography target="data.details.biography" | ||||
|       button=true owner=owner editable=editable}} | ||||
|     </div> | ||||
|   </section> | ||||
| </form> | ||||
|  | @ -1,7 +1,7 @@ | |||
| <section class="flexrow"> | ||||
|     <ul class="attributes flexrow"> | ||||
|         <li class="attribute health"> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.Health" }}</h4> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.HealthShort" }}</h4> | ||||
|             <div class="attribute-value multiple"> | ||||
|                 <input name="data.hp.value" type="text" value="{{data.hp.value}}" data-dtype="Number" | ||||
|                     placeholder="10" /> | ||||
|  | @ -10,21 +10,28 @@ | |||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.ArmorClass" }}</h4> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.ArmorClassShort" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.ac.value" type="text" value="{{data.ac.value}}" data-dtype="Number" | ||||
|                     placeholder="10" data-dtype="Number" /> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.Initiative" }}</h4> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.Thac0" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.thac0.value" type="text" value="{{data.thac0.value}}" placeholder="0" | ||||
|                     data-dtype="Number" /> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.InitiativeShort" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.initiative.value" type="text" value="{{data.initiative.value}}" | ||||
|                     placeholder="0" data-dtype="Number" /> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.Movement" }}</h4> | ||||
|             <h4 class="attribute-name box-title">{{ localize "OSE.MovementShort" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.movement.value" type="text" value="{{data.movement.value}}" | ||||
|                     placeholder="0" data-dtype="Number" /> | ||||
|  | @ -37,41 +44,48 @@ | |||
|     <div class="attribute-group"> | ||||
|         <ul class="attributes"> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.scores.str.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.scores.str.long' }}">{{ localize "OSE.scores.str.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.scores.str.value" type="text" value="{{data.scores.str.value}}" placeholder="0"  data-dtype="Number"/> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.scores.int.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.scores.int.long' }}">{{ localize "OSE.scores.int.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.scores.int.value" type="text" value="{{data.scores.int.value}}" placeholder="0"  data-dtype="Number"/> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.scores.wis.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.scores.wis.long' }}">{{ localize "OSE.scores.wis.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.scores.wis.value" type="text" value="{{data.scores.wis.value}}" placeholder="0"  data-dtype="Number"/> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.scores.dex.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.scores.dex.long' }}">{{ localize "OSE.scores.dex.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.scores.dex.value" type="text" value="{{data.scores.dex.value}}" placeholder="0"  data-dtype="Number"/> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.scores.con.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.scores.con.long' }}">{{ localize "OSE.scores.con.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.scores.con.value" type="text" value="{{data.scores.con.value}}" placeholder="0"  data-dtype="Number"/> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.scores.cha.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.scores.cha.long' }}">{{ localize "OSE.scores.cha.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.scores.cha.value" type="text" value="{{data.scores.cha.value}}" placeholder="0"  data-dtype="Number"/> | ||||
|             </li> | ||||
|         </ul> | ||||
|     </div> | ||||
|     {{!-- Skills and abilities --}} | ||||
|     <div class="flex3 panel abilities"> | ||||
|         <h4 class="panel-title">{{localize 'OSE.panel.abilities'}}</h4> | ||||
|         <ul class="panel-content inventory"> | ||||
|     <div class="flex3 panel abilities resizable" data-base-size="250"> | ||||
|         <div class="panel-title"> | ||||
|             <h4>{{localize 'OSE.panel.abilities'}}</h4> | ||||
|             <div class="item-controls"> | ||||
|                 {{#if owner}} | ||||
|                 <a class="item-control item-create" title='{{localize "OSE.Add"}}' data-type="ability"><i class="fas fa-plus"></i></a> | ||||
|                 {{/if}} | ||||
|             </div> | ||||
|         </div> | ||||
|         <ul class="panel-content inventory resizable" data-base-size="225"> | ||||
|             <div class=""> | ||||
|                 {{#each abilities as |item|}} | ||||
|                 <li class="item-entry"> | ||||
|  | @ -100,27 +114,31 @@ | |||
|     <div class="attribute-group"> | ||||
|         <ul class="attributes"> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.saves.death.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.death.long' }}">{{ localize "OSE.saves.death.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.d.value" type="text" value="{{data.saves.d.value}}" placeholder="0" data-dtype="Number"/> | ||||
|                     <input name="data.saves.d.value" type="text" value="{{data.saves.d.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.saves.wands.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.wands.long' }}">{{ localize "OSE.saves.wands.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.w.value" type="text" value="{{data.saves.w.value}}" placeholder="0" data-dtype="Number" /> | ||||
|                     <input name="data.saves.w.value" type="text" value="{{data.saves.w.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.saves.paralysis.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.paralysis.long' }}">{{ localize "OSE.saves.paralysis.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.p.value" type="text" value="{{data.saves.p.value}}" placeholder="0" data-dtype="Number" /> | ||||
|                     <input name="data.saves.p.value" type="text" value="{{data.saves.p.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.saves.breath.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.breath.long' }}">{{ localize "OSE.saves.breath.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.b.value" type="text" value="{{data.saves.b.value}}" placeholder="0" data-dtype="Number" /> | ||||
|                     <input name="data.saves.b.value" type="text" value="{{data.saves.b.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title">{{ localize "OSE.saves.spells.short" }}</h4> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.spells.long' }}">{{ localize "OSE.saves.spells.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.s.value" type="text" value="{{data.saves.s.value}}" placeholder="0" /> | ||||
|             </li> | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| <section class="inventory"> | ||||
| <section class="inventory resizable" data-base-size="320"> | ||||
|   <div class=""> | ||||
|     {{#each inventory as |item|}} | ||||
|     <li class="item-entry"> | ||||
|  |  | |||
|  | @ -57,8 +57,13 @@ | |||
| <section class="panel inventory"> | ||||
|   <div class="panel-title"> | ||||
|     <h4>{{localize 'OSE.category.spells'}}</h4> | ||||
|       <div class="item-controls"> | ||||
|           {{#if owner}} | ||||
|           <a class="item-control item-create" title='{{localize "OSE.Add"}}' data-type="spell"><i class="fas fa-plus"></i></a> | ||||
|           {{/if}} | ||||
|       </div> | ||||
|   </div> | ||||
|   <div class="panel-content"> | ||||
|   <div class="panel-content resizable" data-base-size="230"> | ||||
|     {{#each spells as |item|}} | ||||
|     <li class="item-entry"> | ||||
|       <div class="item flexrow" data-item-id="{{item._id}}"> | ||||
|  |  | |||
|  | @ -0,0 +1,146 @@ | |||
| <section class="flexrow"> | ||||
|     <ul class="attributes flexrow"> | ||||
|         <li class="attribute health"> | ||||
|             <h4 class="attribute-name box-title" title="{{localize 'OSE.Health'}}">{{ localize "OSE.HealthShort" }}</h4> | ||||
|             <div class="attribute-value multiple"> | ||||
|                 <input name="data.hp.value" type="text" value="{{data.hp.value}}" data-dtype="Number" | ||||
|                     placeholder="10" /> | ||||
|                 <span class="sep"> / </span> | ||||
|                 <input name="data.hp.max" type="text" value="{{data.hp.max}}" data-dtype="Number" placeholder="10" /> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title" title="{{localize 'OSE.ArmorClass'}}">{{ localize "OSE.ArmorClassShort" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.ac.value" type="text" value="{{data.ac.value}}" data-dtype="Number" placeholder="10" | ||||
|                     data-dtype="Number" /> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title" title="{{localize 'OSE.Thac0'}}">{{ localize "OSE.Thac0" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.thac0.value" type="text" value="{{data.thac0.value}}" placeholder="0" | ||||
|                     data-dtype="Number" /> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title" title="{{localize 'OSE.Attacks'}}">{{ localize "OSE.AttacksShort" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.att.value" type="text" value="{{data.att.value}}" placeholder="0" | ||||
|                     data-dtype="Number" /> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="attribute"> | ||||
|             <h4 class="attribute-name box-title" title="{{localize 'OSE.Movement'}}">{{ localize "OSE.MovementShort" }}</h4> | ||||
|             <div class="attribute-value"> | ||||
|                 <input name="data.movement.value" type="text" value="{{data.movement.value}}" placeholder="0" | ||||
|                     data-dtype="Number" /> | ||||
|             </div> | ||||
|         </li> | ||||
| </section> | ||||
| <section class="flexrow attribute-row"> | ||||
|     {{!-- Skills and abilities --}} | ||||
|     <div class="flex3 panel abilities"> | ||||
|         <div class="panel-title"> | ||||
|             <h4>{{localize 'OSE.panel.abilities'}}</h4> | ||||
|             <div class="item-controls"> | ||||
|                 {{#if owner}} | ||||
|                 <a class="item-control item-create" title='{{localize "OSE.Add"}}' data-type="ability"><i class="fas fa-plus"></i></a> | ||||
|                 {{/if}} | ||||
|             </div> | ||||
|         </div> | ||||
|         <ul class="panel-content inventory resizable" data-base-size="220"> | ||||
|             <div class=""> | ||||
|                 {{#each abilities as |item|}} | ||||
|                 <li class="item-entry"> | ||||
|                     <div class="item flexrow" data-item-id="{{item._id}}"> | ||||
|                         <div class="item-name flexrow"> | ||||
|                             <div class="item-image" style="background-image: url({{item.img}})"></div> | ||||
|                             <h4 title="{{item.name}}"> | ||||
|                                 {{item.name~}} | ||||
|                             </h4> | ||||
|                         </div> | ||||
|                         <div class="item-controls"> | ||||
|                             {{#if ../owner}} | ||||
|                             <a class="item-control item-edit" title='{{localize "Ose.Edit"}}'><i | ||||
|                                     class="fas fa-edit"></i></a> | ||||
|                             <a class="item-control item-delete" title='{{localize "Ose.Delete"}}'><i | ||||
|                                     class="fas fa-trash"></i></a> | ||||
|                             {{/if}} | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </li> | ||||
|                 {{/each}} | ||||
|             </div> | ||||
|         </ul> | ||||
|     </div> | ||||
|     {{!-- Equipment --}} | ||||
|     <div class="flex3 panel abilities"> | ||||
|         <div class="panel-title"> | ||||
|             <h4>{{localize 'OSE.panel.equipment'}}</h4> | ||||
|             <div class="item-controls"> | ||||
|                 {{#if owner}} | ||||
|                 <a class="item-control item-create" title='{{localize "OSE.Add"}}' data-type="item"><i class="fas fa-plus"></i></a> | ||||
|                 {{/if}} | ||||
|             </div> | ||||
|         </div> | ||||
|         <ul class="panel-content inventory resizable" data-base-size="220"> | ||||
|             <div class=""> | ||||
|                 {{#each inventory as |item|}} | ||||
|                 <li class="item-entry"> | ||||
|                     <div class="item flexrow" data-item-id="{{item._id}}"> | ||||
|                         <div class="item-name flexrow"> | ||||
|                             <div class="item-image" style="background-image: url({{item.img}})"></div> | ||||
|                             <h4 title="{{item.name}}"> | ||||
|                                 {{item.name~}} | ||||
|                             </h4> | ||||
|                         </div> | ||||
|                         <div class="item-controls"> | ||||
|                             {{#if ../owner}} | ||||
|                             <a class="item-control item-edit" title='{{localize "Ose.Edit"}}'><i | ||||
|                                     class="fas fa-edit"></i></a> | ||||
|                             <a class="item-control item-delete" title='{{localize "Ose.Delete"}}'><i | ||||
|                                     class="fas fa-trash"></i></a> | ||||
|                             {{/if}} | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </li> | ||||
|                 {{/each}} | ||||
|             </div> | ||||
|         </ul> | ||||
|     </div> | ||||
|     {{!-- Saving throws --}} | ||||
|     <div class="attribute-group"> | ||||
|         <ul class="attributes"> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.death.long' }}">{{ localize "OSE.saves.death.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.d.value" type="text" value="{{data.saves.d.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.wands.long' }}">{{ localize "OSE.saves.wands.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.w.value" type="text" value="{{data.saves.w.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.paralysis.long' }}">{{ localize "OSE.saves.paralysis.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.p.value" type="text" value="{{data.saves.p.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.breath.long' }}">{{ localize "OSE.saves.breath.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.b.value" type="text" value="{{data.saves.b.value}}" placeholder="0" | ||||
|                         data-dtype="Number" /> | ||||
|             </li> | ||||
|             <li class="attribute"> | ||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.spells.long' }}">{{ localize "OSE.saves.spells.short" }}</h4> | ||||
|                 <div class="attribute-value"> | ||||
|                     <input name="data.saves.s.value" type="text" value="{{data.saves.s.value}}" placeholder="0" /> | ||||
|             </li> | ||||
|         </ul> | ||||
|     </div> | ||||
| </section> | ||||
|  | @ -0,0 +1,40 @@ | |||
| <img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" /> | ||||
| <section class="header-details flexrow"> | ||||
|   <h1 class="charname"> | ||||
|     <input name="name" type="text" value="{{actor.name}}" placeholder="{{localize 'OSE.Name'}}" /> | ||||
|   </h1> | ||||
|   <ul class="summary flexrow"> | ||||
|     <li class="flex2"> | ||||
|       <input type="text" name="data.details.alignment" value="{{data.details.alignment}}" | ||||
|         placeholder="{{ localize 'OSE.Alignment' }}" /> | ||||
|       <label>{{localize 'OSE.Alignment'}}</label> | ||||
|     </li> | ||||
|     <li class="flex2"> | ||||
|       <input type="text" name="data.details.treasure" value="{{data.details.treasure}}" | ||||
|         placeholder="{{ localize 'OSE.Treasure' }}" /> | ||||
|       <label>{{localize 'OSE.Treasure'}}</label> | ||||
|     </li> | ||||
|     <li> | ||||
|       <input type="text" name="data.details.appearing" value="{{data.details.appearing}}" | ||||
|         placeholder="{{ localize 'OSE.Appearing' }}" /> | ||||
|       <label>{{localize 'OSE.Appearing'}}</label> | ||||
|     </li> | ||||
|   </ul> | ||||
|   <ul class="summary flexrow"> | ||||
|     <li class="flex2"> | ||||
|       <input type="text" name="data.details.size" value="{{data.details.size}}" | ||||
|         placeholder="{{ localize 'OSE.Size' }}" /> | ||||
|       <label>{{localize 'OSE.Size'}}</label> | ||||
|     </li> | ||||
|     <li class="flex2"> | ||||
|       <input type="text" name="data.details.xp" value="{{data.details.xp}}" | ||||
|         placeholder="{{ localize 'OSE.Experience' }}" /> | ||||
|       <label>{{localize 'OSE.Experience'}}</label> | ||||
|     </li> | ||||
|     <li> | ||||
|       <input type="text" name="data.details.morale" value="{{data.details.morale}}" | ||||
|         placeholder="{{ localize 'OSE.Morale' }}" /> | ||||
|       <label>{{localize 'OSE.Morale'}}</label> | ||||
|     </li> | ||||
|   </ul> | ||||
| </section> | ||||
		Loading…
	
		Reference in New Issue