ENH: Targeting
- Fixed Naked AC - Added save to abilities - Added basic targeting support, to be testedmaster
							parent
							
								
									695951ee82
								
							
						
					
					
						commit
						8af8a0f635
					
				|  | @ -418,6 +418,7 @@ export class OseActor extends Actor { | ||||||
|         thac0: thac0, |         thac0: thac0, | ||||||
|         dmg: dmgParts, |         dmg: dmgParts, | ||||||
|         save: attData.roll.save, |         save: attData.roll.save, | ||||||
|  |         target: attData.roll.target | ||||||
|       }, |       }, | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  | @ -576,7 +577,7 @@ export class OseActor extends Actor { | ||||||
|     let AcShield = 0; |     let AcShield = 0; | ||||||
|     let AacShield = 0; |     let AacShield = 0; | ||||||
|     const data = this.data.data; |     const data = this.data.data; | ||||||
|     data.aac.naked = baseAc + data.scores.dex.mod; |     data.aac.naked = baseAac + data.scores.dex.mod; | ||||||
|     data.ac.naked = baseAc - data.scores.dex.mod; |     data.ac.naked = baseAc - data.scores.dex.mod; | ||||||
|     const armors = this.data.items.filter((i) => i.type == "armor"); |     const armors = this.data.items.filter((i) => i.type == "armor"); | ||||||
|     armors.forEach((a) => { |     armors.forEach((a) => { | ||||||
|  | @ -635,9 +636,6 @@ export class OseActor extends Actor { | ||||||
|       data.scores.con.value |       data.scores.con.value | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     data.ac.naked = 9 + data.scores.dex.mod; |  | ||||||
|     data.aac.naked = 10 - data.scores.dex.mod; |  | ||||||
| 
 |  | ||||||
|     const capped = { |     const capped = { | ||||||
|       0: -2, |       0: -2, | ||||||
|       3: -2, |       3: -2, | ||||||
|  |  | ||||||
|  | @ -124,14 +124,25 @@ export class OseDice { | ||||||
|       total: roll.total, |       total: roll.total, | ||||||
|     }; |     }; | ||||||
|     result.target = data.roll.thac0; |     result.target = data.roll.thac0; | ||||||
|  | 
 | ||||||
|  |     const targetAc = data.roll.target ? data.roll.target.actor.data.data.ac.value : 9; | ||||||
|  |     const targetAac = data.roll.target ? data.roll.target.actor.data.data.aac.value : 0; | ||||||
|  |     result.victim = data.roll.target ? data.roll.target.actor.name : null; | ||||||
|  | 
 | ||||||
|     if (game.settings.get("ose", "ascendingAC")) { |     if (game.settings.get("ose", "ascendingAC")) { | ||||||
|  |       if (roll.total < targetAac) { | ||||||
|  |         result.details = game.i18n.format("OSE.messages.AttackFailure", { | ||||||
|  |           bonus: result.target, | ||||||
|  |         }); | ||||||
|  |         return result; | ||||||
|  |       } | ||||||
|       result.details = game.i18n.format("OSE.messages.AttackAscendingSuccess", { |       result.details = game.i18n.format("OSE.messages.AttackAscendingSuccess", { | ||||||
|         result: roll.total, |         result: roll.total, | ||||||
|       }); |       }); | ||||||
|       result.isSuccess = true; |       result.isSuccess = true; | ||||||
|     } else { |     } else { | ||||||
|       // B/X Historic THAC0 Calculation
 |       // B/X Historic THAC0 Calculation
 | ||||||
|       if (result.target - roll.total > 9) { |       if (result.target - roll.total > targetAc) { | ||||||
|         result.details = game.i18n.format("OSE.messages.AttackFailure", { |         result.details = game.i18n.format("OSE.messages.AttackFailure", { | ||||||
|           bonus: result.target, |           bonus: result.target, | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  | @ -66,8 +66,31 @@ export class OseItem extends Item { | ||||||
| 
 | 
 | ||||||
|   rollWeapon(options = {}) { |   rollWeapon(options = {}) { | ||||||
|     let isNPC = this.actor.data.type != "character"; |     let isNPC = this.actor.data.type != "character"; | ||||||
|  |     const targets = 5; | ||||||
|     const data = this.data.data; |     const data = this.data.data; | ||||||
|     let type = isNPC ? "attack" : "melee"; |     let type = isNPC ? "attack" : "melee"; | ||||||
|  |     const rollData = | ||||||
|  |     { | ||||||
|  |       item: this.data, | ||||||
|  |       actor: this.actor.data, | ||||||
|  |       roll: { | ||||||
|  |         save: this.data.data.save, | ||||||
|  |         target: null | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     // rollAttack to target helper
 | ||||||
|  |     const rollAttack = async (type) => { | ||||||
|  |       if (game.user.targets.size > 0) { | ||||||
|  |         for (let t of game.user.targets.values()) { | ||||||
|  |           rollData.roll.target = t; | ||||||
|  |           await this.actor.rollAttack(rollData, { type: type, skipDialog: options.skipDialog }); | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         this.actor.rollAttack(rollData, { type: type, skipDialog: options.skipDialog }); | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     if (data.missile && data.melee && !isNPC) { |     if (data.missile && data.melee && !isNPC) { | ||||||
|       // Dialog
 |       // Dialog
 | ||||||
|       new Dialog({ |       new Dialog({ | ||||||
|  | @ -78,32 +101,14 @@ export class OseItem extends Item { | ||||||
|             icon: '<i class="fas fa-fist-raised"></i>', |             icon: '<i class="fas fa-fist-raised"></i>', | ||||||
|             label: "Melee", |             label: "Melee", | ||||||
|             callback: () => { |             callback: () => { | ||||||
|               this.actor.rollAttack( |               rollAttack("melee"); | ||||||
|                 { |  | ||||||
|                   item: this.data, |  | ||||||
|                   actor: this.actor.data, |  | ||||||
|                   roll: { |  | ||||||
|                     save: this.data.data.save, |  | ||||||
|                   }, |  | ||||||
|                 }, |  | ||||||
|                 { type: "melee", skipDialog: options.skipDialog } |  | ||||||
|               ); |  | ||||||
|             }, |             }, | ||||||
|           }, |           }, | ||||||
|           missile: { |           missile: { | ||||||
|             icon: '<i class="fas fa-bullseye"></i>', |             icon: '<i class="fas fa-bullseye"></i>', | ||||||
|             label: "Missile", |             label: "Missile", | ||||||
|             callback: () => { |             callback: () => { | ||||||
|               this.actor.rollAttack( |               rollAttack("missile"); | ||||||
|                 { |  | ||||||
|                   roll: { |  | ||||||
|                     save: this.data.data.save, |  | ||||||
|                   }, |  | ||||||
|                   actor: this.actor.data, |  | ||||||
|                   item: this.data, |  | ||||||
|                 }, |  | ||||||
|                 { type: "missile", skipDialog: options.skipDialog } |  | ||||||
|               ); |  | ||||||
|             }, |             }, | ||||||
|           }, |           }, | ||||||
|         }, |         }, | ||||||
|  | @ -113,17 +118,7 @@ export class OseItem extends Item { | ||||||
|     } else if (data.missile && !isNPC) { |     } else if (data.missile && !isNPC) { | ||||||
|       type = "missile"; |       type = "missile"; | ||||||
|     } |     } | ||||||
|     this.actor.rollAttack( |     rollAttack(type); | ||||||
|       { |  | ||||||
|         actor: this.actor.data, |  | ||||||
|         item: this.data, |  | ||||||
|         roll: { |  | ||||||
|           save: this.data.data.save, |  | ||||||
|         }, |  | ||||||
|       }, |  | ||||||
|       { type: type, skipDialog: options.skipDialog } |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -216,6 +216,11 @@ | ||||||
|       background-size: cover; |       background-size: cover; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |   .chat-target { | ||||||
|  |     text-align: right; | ||||||
|  |     font-style: italic; | ||||||
|  |     padding: 2px; | ||||||
|  |   } | ||||||
|   .chat-details { |   .chat-details { | ||||||
|     padding: 4px; |     padding: 4px; | ||||||
|     font-size: 13px; |     font-size: 13px; | ||||||
|  |  | ||||||
|  | @ -218,7 +218,8 @@ | ||||||
|       "rollType": "result", |       "rollType": "result", | ||||||
|       "rollTarget": 0, |       "rollTarget": 0, | ||||||
|       "blindroll": false, |       "blindroll": false, | ||||||
|       "description": "" |       "description": "", | ||||||
|  |       "save": "" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -7,6 +7,11 @@ | ||||||
|             </div> |             </div> | ||||||
|             <div class="chat-img" style="background-image:url('{{data.img}}')"></div> |             <div class="chat-img" style="background-image:url('{{data.img}}')"></div> | ||||||
|         </div> |         </div> | ||||||
|  |         {{#if result.victim}} | ||||||
|  |         <div class="chat-target"> | ||||||
|  |             targeting {{result.victim}} | ||||||
|  |         </div> | ||||||
|  |         {{/if}} | ||||||
|         <div class="chat-details"> |         <div class="chat-details"> | ||||||
|             <div class="roll-result">{{{result.details}}}</div> |             <div class="roll-result">{{{result.details}}}</div> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|  | @ -46,6 +46,19 @@ | ||||||
|             <input type="checkbox" name="data.blindroll" value="{{data.blindroll}}" {{checked data.blindroll}}  data-dtype="Number"/> |             <input type="checkbox" name="data.blindroll" value="{{data.blindroll}}" {{checked data.blindroll}}  data-dtype="Number"/> | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|  |         <div class="form-group"> | ||||||
|  |           <label>{{localize 'OSE.spells.Save'}}</label> | ||||||
|  |           <div class="form-fields"> | ||||||
|  |             <select name="data.save"> | ||||||
|  |               {{#select data.save}} | ||||||
|  |               <option value=""></option> | ||||||
|  |               {{#each config.saves_short as |save a|}} | ||||||
|  |               <option value="{{a}}">{{save}}</option> | ||||||
|  |               {{/each}} | ||||||
|  |               {{/select}} | ||||||
|  |             </select> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|       </div> |       </div> | ||||||
|       <div class="description"> |       <div class="description"> | ||||||
|         {{editor content=data.description target="data.description" button=true |         {{editor content=data.description target="data.description" button=true | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue