ENH: Automatic movement
							parent
							
								
									afef38bce6
								
							
						
					
					
						commit
						afa1cd6c77
					
				|  | @ -131,6 +131,9 @@ | |||
|     "OSE.Setting.EncumbranceHint": "Choose the way encumbrance is calculated", | ||||
|     "OSE.Setting.EncumbranceBasic": "Basic", | ||||
|     "OSE.Setting.EncumbranceDetailed": "Detailed", | ||||
|     "OSE.Setting.MovementAuto": "Calculate Movement", | ||||
|     "OSE.Setting.SignificantTreasure": "Significant Treasure Weight", | ||||
|     "OSE.Setting.SignificantTreasureHint": "Weight at which treasure will reduce the movement, only useful for basic encumbrance", | ||||
| 
 | ||||
|     "OSE.items.Equip": "Equip", | ||||
|     "OSE.items.Unequip": "Unequip", | ||||
|  |  | |||
|  | @ -49,58 +49,104 @@ export class OseActorSheetCharacter extends OseActorSheet { | |||
| 
 | ||||
|     // Compute treasure
 | ||||
|     let total = 0; | ||||
|     data.owned.items.forEach(item => { | ||||
|     data.owned.items.forEach((item) => { | ||||
|       if (item.data.treasure) { | ||||
|         total += item.data.quantity.value * item.data.cost; | ||||
|       }  | ||||
|       } | ||||
|     }); | ||||
|     data.treasure = total; | ||||
| 
 | ||||
|     let basic = game.settings.get('ose', 'encumbranceOption') == 'basic'; | ||||
|     data.config.encumbrance = game.settings.get("ose", "encumbranceOption"); | ||||
|     let basic = data.config.encumbrance == "basic"; | ||||
|     // Compute encumbrance
 | ||||
|     let totalWeight = 0; | ||||
|     Object.values(data.owned).forEach(cat => { | ||||
|       cat.forEach(item => { | ||||
|         if (item.type == 'item' && (!basic || item.data.treasure)) { | ||||
|     Object.values(data.owned).forEach((cat) => { | ||||
|       cat.forEach((item) => { | ||||
|         if (item.type == "item" && (!basic || item.data.treasure)) { | ||||
|           totalWeight += item.data.quantity.value * item.data.weight; | ||||
|         } | ||||
|         else if (!basic) { | ||||
|         } else if (!basic) { | ||||
|           totalWeight += item.data.weight; | ||||
|         } | ||||
|       }) | ||||
|       }); | ||||
|     }); | ||||
|     data.encumbrance = { | ||||
|       pct: Math.clamped(100 * parseFloat(totalWeight) / data.data.encumbrance.max, 0, 100), | ||||
|       pct: Math.clamped( | ||||
|         (100 * parseFloat(totalWeight)) / data.data.encumbrance.max, | ||||
|         0, | ||||
|         100 | ||||
|       ), | ||||
|       max: data.data.encumbrance.max, | ||||
|       encumbered: totalWeight > data.data.encumbrance.max, | ||||
|       value: totalWeight | ||||
|       value: totalWeight, | ||||
|     }; | ||||
| 
 | ||||
|     if (data.data.config.movementAuto) { | ||||
|       this._calculateMovement(data, totalWeight); | ||||
|     } | ||||
| 
 | ||||
|     // Compute AC
 | ||||
|     if (data.config.ascendingAC) { | ||||
|       let baseAc = 10; | ||||
|       data.owned.armors.forEach(a => { | ||||
|       data.owned.armors.forEach((a) => { | ||||
|         if (a.data.equipped) { | ||||
|           baseAc += a.data.aac.value;  | ||||
|           baseAc += a.data.aac.value; | ||||
|         } | ||||
|       }) | ||||
|       }); | ||||
|       data.data.aac.value = baseAc + data.data.scores.dex.mod; | ||||
| 
 | ||||
|     } else { | ||||
|       let baseAc = 9; | ||||
|       let shield = 0; | ||||
|       data.owned.armors.forEach(a => { | ||||
|         if (a.data.equipped && a.data.type != 'shield') { | ||||
|       data.owned.armors.forEach((a) => { | ||||
|         if (a.data.equipped && a.data.type != "shield") { | ||||
|           baseAc = a.data.ac.value; | ||||
|         } else if (a.data.equipped && a.data.type == 'shield') { | ||||
|           shield = a.data.ac.value;  | ||||
|         } else if (a.data.equipped && a.data.type == "shield") { | ||||
|           shield = a.data.ac.value; | ||||
|         } | ||||
|       }) | ||||
|       }); | ||||
|       data.data.ac.value = baseAc - data.data.scores.dex.mod - shield; | ||||
|     } | ||||
|     return data; | ||||
|   } | ||||
| 
 | ||||
|   _calculateMovement(data, weight) { | ||||
|     if (data.config.encumbrance == "detailed") { | ||||
|       if (weight > 800) { | ||||
|         data.data.movement.base = 30; | ||||
|       } else if (weight > 600) { | ||||
|         data.data.movement.base = 60; | ||||
|       } else if (weight > 400) { | ||||
|         data.data.movement.base = 90; | ||||
|       } else { | ||||
|         data.data.movement.base = 120; | ||||
|       } | ||||
|     } else if (data.config.encumbrance == "basic") { | ||||
|       let heaviest = 0; | ||||
|       data.owned.armors.forEach((a) => { | ||||
|         if (a.data.equipped) { | ||||
|           if (a.data.type == "light" && heaviest == 0) { | ||||
|             heaviest = 1; | ||||
|           } else if (a.data.type == "heavy") { | ||||
|             heaviest = 2; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
|       switch (heaviest) { | ||||
|         case 0: | ||||
|           data.data.movement.base = 120; | ||||
|           break; | ||||
|         case 1: | ||||
|           data.data.movement.base = 90; | ||||
|           break; | ||||
|         case 2: | ||||
|           data.data.movement.base = 60; | ||||
|           break; | ||||
|       } | ||||
|       if (weight > game.settings.get("ose", "significantTreasure")) { | ||||
|         data.data.movement.base -= 30; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /* -------------------------------------------- */ | ||||
| 
 | ||||
|   async _onQtChange(event) { | ||||
|  | @ -176,29 +222,33 @@ export class OseActorSheetCharacter extends OseActorSheet { | |||
|       actorObject.rollExploration(expl, { event: event }); | ||||
|     }); | ||||
| 
 | ||||
|     html.find(".ability-score .attribute-mod a").click(ev => { | ||||
|       let box = $(event.currentTarget.parentElement.parentElement.parentElement); | ||||
|       box.children('.attribute-bonuses').slideDown(200); | ||||
|     }) | ||||
|     html.find(".ability-score .attribute-mod a").click((ev) => { | ||||
|       let box = $( | ||||
|         event.currentTarget.parentElement.parentElement.parentElement | ||||
|       ); | ||||
|       box.children(".attribute-bonuses").slideDown(200); | ||||
|     }); | ||||
| 
 | ||||
|     html.find(".ability-score .attribute-bonuses a").click(ev => { | ||||
|     html.find(".ability-score .attribute-bonuses a").click((ev) => { | ||||
|       $(event.currentTarget.parentElement.parentElement).slideUp(200); | ||||
|     }) | ||||
|     }); | ||||
| 
 | ||||
|     html.find(".inventory .item-titles .item-caret").click(ev => { | ||||
|       let items = $(event.currentTarget.parentElement.parentElement).children('.item-list'); | ||||
|       if (items.css('display') == "none") { | ||||
|         let el = $(event.currentTarget).find('.fas.fa-caret-right'); | ||||
|         el.removeClass('fa-caret-right'); | ||||
|         el.addClass('fa-caret-down'); | ||||
|     html.find(".inventory .item-titles .item-caret").click((ev) => { | ||||
|       let items = $(event.currentTarget.parentElement.parentElement).children( | ||||
|         ".item-list" | ||||
|       ); | ||||
|       if (items.css("display") == "none") { | ||||
|         let el = $(event.currentTarget).find(".fas.fa-caret-right"); | ||||
|         el.removeClass("fa-caret-right"); | ||||
|         el.addClass("fa-caret-down"); | ||||
|         items.slideDown(200); | ||||
|       } else { | ||||
|         let el = $(event.currentTarget).find('.fas.fa-caret-down'); | ||||
|         el.removeClass('fa-caret-down'); | ||||
|         el.addClass('fa-caret-right'); | ||||
|         let el = $(event.currentTarget).find(".fas.fa-caret-down"); | ||||
|         el.removeClass("fa-caret-down"); | ||||
|         el.addClass("fa-caret-right"); | ||||
|         items.slideUp(200); | ||||
|       } | ||||
|     }) | ||||
|     }); | ||||
| 
 | ||||
|     // Handle default listeners last so system listeners are triggered first
 | ||||
|     super.activateListeners(html); | ||||
|  |  | |||
|  | @ -48,4 +48,13 @@ export const registerSettings = function () { | |||
|       detailed: "OSE.Setting.EncumbranceDetailed", | ||||
|     }, | ||||
|   }); | ||||
| 
 | ||||
|   game.settings.register("ose", "significantTreasure", { | ||||
|     name: game.i18n.localize("OSE.Setting.SignificantTreasure"), | ||||
|     hint: game.i18n.localize("OSE.Setting.SignificantTreasureHint"), | ||||
|     default: 800, | ||||
|     scope: "world", | ||||
|     type: Number, | ||||
|     config: true, | ||||
|   }); | ||||
| }; | ||||
|  |  | |||
|  | @ -79,6 +79,9 @@ | |||
|     }, | ||||
|     "character": { | ||||
|       "templates": ["common", "spellcaster"], | ||||
|       "config": { | ||||
|         "movementAuto": true | ||||
|       }, | ||||
|       "details": { | ||||
|         "biography": "", | ||||
|         "class": "", | ||||
|  |  | |||
|  | @ -83,6 +83,18 @@ | |||
|         /> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|       <label for="movementAuto">{{localize "OSE.Setting.MovementAuto"}}</label> | ||||
|       <div class="form-fields"> | ||||
|         <input | ||||
|           type="checkbox" | ||||
|           name="data.config.movementAuto" | ||||
|           id="movementAuto" | ||||
|           {{checked | ||||
|           data.config.movementAuto}} | ||||
|         /> | ||||
|       </div> | ||||
|     </div> | ||||
|     {{/if}} | ||||
|     <footer class="sheet-footer"> | ||||
|       <button type="submit"> | ||||
|  |  | |||
|  | @ -49,9 +49,6 @@ | |||
|             </h4> | ||||
|           </a> | ||||
|         </div> | ||||
|         <div class="field-long"> | ||||
|           {{item.data.roll}} | ||||
|         </div> | ||||
|         <div class="item-controls"> | ||||
|           {{#if ../owner}} | ||||
|           <a class="item-control item-show" title='{{localize "OSE.Show"}}'><i class="fas fa-eye"></i></a> | ||||
|  |  | |||
|  | @ -210,7 +210,7 @@ | |||
|                         {{ localize "OSE.MovementExplorationShort" }}</h4> | ||||
|                     <div class="attribute-value flexrow"> | ||||
|                         <input name="data.movement.base" type="text" value="{{data.movement.base}}" placeholder="0" | ||||
|                             data-dtype="Number" /> | ||||
|                             data-dtype="Number" {{#if data.config.movementAuto}}disabled{{/if}}/> | ||||
|                     </div> | ||||
|                 </li> | ||||
|                 <li class="attribute attribute-secondaries"> | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
|         <h3 class="item-name"><a>{{item.name}}</a></h3> | ||||
|     </header> | ||||
| 
 | ||||
|     <div class="card-content" style="display:none;"> | ||||
|     <div class="card-content"> | ||||
|         {{{data.description}}} | ||||
|     </div> | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue