Merge pull request #27 from thehappyanarchist/THA-Dev
Implemented Morale and Loyalty systems.master
						commit
						84585118d8
					
				
							
								
								
									
										13
									
								
								src/acks.css
								
								
								
								
							
							
						
						
									
										13
									
								
								src/acks.css
								
								
								
								
							|  | @ -701,6 +701,19 @@ | ||||||
|   /*  Item Controls                            */ |   /*  Item Controls                            */ | ||||||
|   /* ----------------------------------------- */ |   /* ----------------------------------------- */ | ||||||
| } | } | ||||||
|  | .acks.sheet.actor.character .sheet-header .header-details .summary .check-field:hover .check { | ||||||
|  |   display: inline; | ||||||
|  | } | ||||||
|  | .acks.sheet.actor.character .sheet-header .header-details .summary .check-field .check { | ||||||
|  |   display: none; | ||||||
|  |   line-height: 35px; | ||||||
|  |   flex: 0 0 20px; | ||||||
|  |   position: absolute; | ||||||
|  |   font-size: 12px; | ||||||
|  | } | ||||||
|  | .acks.sheet.actor.character .sheet-header .header-details .summary .check-field .check:hover { | ||||||
|  |   color: rgba(0, 0, 0, 0.9); | ||||||
|  | } | ||||||
| .acks.sheet.actor.character .sheet-header .xp-bonus { | .acks.sheet.actor.character .sheet-header .xp-bonus { | ||||||
|   top: -15px; |   top: -15px; | ||||||
|   right: 3px; |   right: 3px; | ||||||
|  |  | ||||||
|  | @ -69,8 +69,8 @@ | ||||||
|   "ACKS.Retainer": "Retainer", |   "ACKS.Retainer": "Retainer", | ||||||
|   "ACKS.RetainerWage": "Wage", |   "ACKS.RetainerWage": "Wage", | ||||||
|   "ACKS.RetainerUpkeep": "Upkeep", |   "ACKS.RetainerUpkeep": "Upkeep", | ||||||
|   "ACKS.Loyalty": "Henchmen Morale", |   "ACKS.Loyalty": "Loyalty", | ||||||
|   "ACKS.LoyaltyShort": "MOR", |   "ACKS.LoyaltyShort": "LYL", | ||||||
| 
 | 
 | ||||||
|   "ACKS.scores.str.long": "Strength", |   "ACKS.scores.str.long": "Strength", | ||||||
|   "ACKS.scores.str.short": "STR", |   "ACKS.scores.str.short": "STR", | ||||||
|  | @ -290,5 +290,18 @@ | ||||||
|   "ACKS.reaction.Unfriendly": "{name} is Unfriendly and may attack", |   "ACKS.reaction.Unfriendly": "{name} is Unfriendly and may attack", | ||||||
|   "ACKS.reaction.Neutral": "{name} is Neutral and uncertain", |   "ACKS.reaction.Neutral": "{name} is Neutral and uncertain", | ||||||
|   "ACKS.reaction.Indifferent": "{name} is Indifferent and uninterested", |   "ACKS.reaction.Indifferent": "{name} is Indifferent and uninterested", | ||||||
|   "ACKS.reaction.Friendly": "{name} is Friendly and helpful" |   "ACKS.reaction.Friendly": "{name} is Friendly and helpful", | ||||||
|  |    | ||||||
|  |   "ACKS.loyalty.check": "Henchman Loyalty Check", | ||||||
|  |   "ACKS.loyalty.hostility": "Becomes Hostile", | ||||||
|  |   "ACKS.loyalty.resignation": "Tenders Resignation", | ||||||
|  |   "ACKS.loyalty.grudging": "Grudging Loyalty", | ||||||
|  |   "ACKS.loyalty.loyal": "Loyal", | ||||||
|  |   "ACKS.loyalty.fanatic": "Fanatic Loyalty", | ||||||
|  | 
 | ||||||
|  |   "ACKS.morale.retreat": "Retreat", | ||||||
|  |   "ACKS.morale.fightingWithdrawal": "Fighting Withdrawl", | ||||||
|  |   "ACKS.morale.fight": "Fight On", | ||||||
|  |   "ACKS.morale.advanceAndPursue": "Advance and Pursue", | ||||||
|  |   "ACKS.morale.fightToTheDeath": "Victory or Death" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -140,6 +140,16 @@ export class AcksActorSheetCharacter extends AcksActorSheet { | ||||||
|   activateListeners(html) { |   activateListeners(html) { | ||||||
|     super.activateListeners(html); |     super.activateListeners(html); | ||||||
| 
 | 
 | ||||||
|  |     html.find(".morale-check a").click((ev) => { | ||||||
|  |       let actorObject = this.actor; | ||||||
|  |       actorObject.rollMorale({ event: event }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     html.find(".loyalty-check a").click((ev) => { | ||||||
|  |       let actorObject = this.actor; | ||||||
|  |       actorObject.rollLoyalty({ event: event }); | ||||||
|  |     }); | ||||||
|  |      | ||||||
|     html.find(".ability-score .attribute-name a").click((ev) => { |     html.find(".ability-score .attribute-name a").click((ev) => { | ||||||
|       let actorObject = this.actor; |       let actorObject = this.actor; | ||||||
|       let element = event.currentTarget; |       let element = event.currentTarget; | ||||||
|  |  | ||||||
|  | @ -162,21 +162,40 @@ export class AcksActor extends Actor { | ||||||
| 
 | 
 | ||||||
|   rollMorale(options = {}) { |   rollMorale(options = {}) { | ||||||
|     const rollParts = ["2d6"]; |     const rollParts = ["2d6"]; | ||||||
|  |     rollParts.push(this.data.data.details.morale); | ||||||
| 
 | 
 | ||||||
|     const data = { |     const data = { | ||||||
|       actor: this.data, |       actor: this.data, | ||||||
|       roll: { |       roll: { | ||||||
|         type: "below", |         type: "table", | ||||||
|         target: this.data.data.details.morale, |         table: { | ||||||
|  |           1: game.i18n.format("ACKS.morale.retreat", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           3: game.i18n.format("ACKS.morale.fightingWithdrawal", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           6: game.i18n.format("ACKS.morale.fight", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           9: game.i18n.format("ACKS.morale.advanceAndPursue", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           12: game.i18n.format("ACKS.morale.fightToTheDeath", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |         }, | ||||||
|       }, |       }, | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     let skip = options.event && options.event.ctrlKey; | ||||||
|  | 
 | ||||||
|     // Roll and return
 |     // Roll and return
 | ||||||
|     return AcksDice.Roll({ |     return AcksDice.Roll({ | ||||||
|       event: options.event, |       event: options.event, | ||||||
|       parts: rollParts, |       parts: rollParts, | ||||||
|       data: data, |       data: data, | ||||||
|       skipDialog: true, |       skipDialog: skip, | ||||||
|       speaker: ChatMessage.getSpeaker({ actor: this }), |       speaker: ChatMessage.getSpeaker({ actor: this }), | ||||||
|       flavor: game.i18n.localize("ACKS.roll.morale"), |       flavor: game.i18n.localize("ACKS.roll.morale"), | ||||||
|       title: game.i18n.localize("ACKS.roll.morale"), |       title: game.i18n.localize("ACKS.roll.morale"), | ||||||
|  | @ -184,26 +203,44 @@ export class AcksActor extends Actor { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   rollLoyalty(options = {}) { |   rollLoyalty(options = {}) { | ||||||
|     const label = game.i18n.localize(`ACKS.roll.loyalty`); |  | ||||||
|     const rollParts = ["2d6"]; |     const rollParts = ["2d6"]; | ||||||
|  |     rollParts.push(this.data.data.details.morale); | ||||||
| 
 | 
 | ||||||
|     const data = { |     const data = { | ||||||
|       actor: this.data, |       actor: this.data, | ||||||
|       roll: { |       roll: { | ||||||
|         type: "below", |         type: "table", | ||||||
|         target: this.data.data.retainer.loyalty, |         table: { | ||||||
|  |           1: game.i18n.format("ACKS.loyalty.hostility", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           3: game.i18n.format("ACKS.loyalty.resignation", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           6: game.i18n.format("ACKS.loyalty.grudging", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           9: game.i18n.format("ACKS.loyalty.loyal", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |           12: game.i18n.format("ACKS.loyalty.fanatic", { | ||||||
|  |             name: this.data.name, | ||||||
|  |           }), | ||||||
|  |         }, | ||||||
|       }, |       }, | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     let skip = options.event && options.event.ctrlKey; | ||||||
|  | 
 | ||||||
|     // Roll and return
 |     // Roll and return
 | ||||||
|     return AcksDice.Roll({ |     return AcksDice.Roll({ | ||||||
|       event: options.event, |       event: options.event, | ||||||
|       parts: rollParts, |       parts: rollParts, | ||||||
|       data: data, |       data: data, | ||||||
|       skipDialog: true, |       skipDialog: skip, | ||||||
|       speaker: ChatMessage.getSpeaker({ actor: this }), |       speaker: ChatMessage.getSpeaker({ actor: this }), | ||||||
|       flavor: label, |       flavor: game.i18n.localize("ACKS.loyalty.check"), | ||||||
|       title: label, |       title: game.i18n.localize("ACKS.loyalty.check"), | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -16,7 +16,7 @@ export class AcksDice { | ||||||
|         result.isFailure = true; |         result.isFailure = true; | ||||||
|       } |       } | ||||||
|     } else if (data.roll.type == "below") { |     } else if (data.roll.type == "below") { | ||||||
|       // MORALE
 |       // ?
 | ||||||
|       if (roll.total <= result.target) { |       if (roll.total <= result.target) { | ||||||
|         result.isSuccess = true; |         result.isSuccess = true; | ||||||
|       } else { |       } else { | ||||||
|  | @ -35,7 +35,11 @@ export class AcksDice { | ||||||
|         roll._total = 1; |         roll._total = 1; | ||||||
|       } |       } | ||||||
|     } else if (data.roll.type == "table") { |     } else if (data.roll.type == "table") { | ||||||
|       // Reaction
 |       // Reaction, MORALE
 | ||||||
|  |       // Roll cannot be less than 2 on a 2d6 roll
 | ||||||
|  |       if (roll.total < 2) { | ||||||
|  |         roll._total = 2 | ||||||
|  |       } | ||||||
|       let table = data.roll.table; |       let table = data.roll.table; | ||||||
|       let output = ""; |       let output = ""; | ||||||
|       for (let i = 0; i <= roll.total; i++) { |       for (let i = 0; i <= roll.total; i++) { | ||||||
|  |  | ||||||
|  | @ -157,7 +157,7 @@ | ||||||
|           "d": 0, |           "d": 0, | ||||||
|           "w": 0 |           "w": 0 | ||||||
|         }, |         }, | ||||||
|         "morale": 7 |         "morale": 0 | ||||||
|       }, |       }, | ||||||
|       "attacks": "" |       "attacks": "" | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -57,17 +57,6 @@ | ||||||
|                         data-dtype="Number" /> |                         data-dtype="Number" /> | ||||||
|                 </div> |                 </div> | ||||||
|             </li> |             </li> | ||||||
|             {{#if data.retainer.enabled}} |  | ||||||
|             <li class="attribute ability-score" data-stat="lr"> |  | ||||||
|                 <h4 class="attribute-name box-title" title="{{ localize 'ACKS.Loyalty' }}"> |  | ||||||
|                     <a>{{ localize "ACKS.LoyaltyShort" }}</a> |  | ||||||
|                 </h4> |  | ||||||
|                 <div class="attribute-value"> |  | ||||||
|                     <input name="data.retainer.loyalty" type="text" value="{{data.retainer.loyalty}}" placeholder="0" |  | ||||||
|                         data-dtype="Number" /> |  | ||||||
|                 </div> |  | ||||||
|             </li> |  | ||||||
|             {{/if}} |  | ||||||
|         </ul> |         </ul> | ||||||
|     </div> |     </div> | ||||||
|     {{!-- Resource Tracking --}} |     {{!-- Resource Tracking --}} | ||||||
|  |  | ||||||
|  | @ -22,6 +22,22 @@ | ||||||
|          /> |          /> | ||||||
|       <label>{{localize 'ACKS.details.alignment'}}</label> |       <label>{{localize 'ACKS.details.alignment'}}</label> | ||||||
|     </li> |     </li> | ||||||
|  |     {{#if data.retainer.enabled}} | ||||||
|  |     <li class="flexrow check-field"> | ||||||
|  |       <div class="check morale-check" title="{{localize 'ACKS.roll.morale'}}"><a><i class="fas fa-dice"></i></a></div> | ||||||
|  |       <div> | ||||||
|  |         <input type="text" name="data.details.morale" value="{{data.details.morale}}" /> | ||||||
|  |         <label>{{localize 'ACKS.details.morale'}}</label>   | ||||||
|  |       </div> | ||||||
|  |     </li> | ||||||
|  |     <li class="flex2 check-field" data-stat="lr"> | ||||||
|  |       <div class="check loyalty-check" title="{{localize 'ACKS.loyalty.check'}}"><a><i class="fas fa-dice"></i></a></div> | ||||||
|  |       <div class="attribute-value"> | ||||||
|  |         <input name="data.retainer.loyalty" type="text" value="{{data.retainer.loyalty}}" placeholder="Loyal" data-dtype="String" /> | ||||||
|  |         <label>{{localize 'ACKS.Loyalty'}}</label>   | ||||||
|  |       </div> | ||||||
|  |     </li> | ||||||
|  |     {{/if}} | ||||||
|   </ul> |   </ul> | ||||||
|   <ul class="summary flexrow"> |   <ul class="summary flexrow"> | ||||||
|     <li class="flex3"> |     <li class="flex3"> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue