Fix group/individual initiative
							parent
							
								
									483cd49f9a
								
							
						
					
					
						commit
						60e61da5c4
					
				|  | @ -86,10 +86,10 @@ Hooks.on("renderSidebarTab", async (object, html) => { | ||||||
|   } |   } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| Hooks.on("preCreateCombatant", (combat, data, options, id) => { | Hooks.on("createCombatant", async (combatant, options, userId) => { | ||||||
|   let init = game.settings.get("acks", "initiative"); |   let init = game.settings.get("acks", "initiative"); | ||||||
|   if (init == "group") { |   if (init == "group") { | ||||||
|     AcksCombat.addCombatant(combat, data, options, id); |     await AcksCombat.addCombatant(combatant, options, userId); | ||||||
|   } |   } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,79 +1,112 @@ | ||||||
| export class AcksCombat { | export class AcksCombat { | ||||||
|   static rollInitiative(combat, data) { |   static async rollInitiative(combat, data) { | ||||||
|     // Check groups
 |     // Initialize groups.
 | ||||||
|     data.combatants = []; |     data.combatants = []; | ||||||
|     let groups = {}; |     let groups = {}; | ||||||
|     combat.data.combatants.forEach((cbt) => { |     combat.data.combatants.forEach((cbt) => { | ||||||
|       groups[cbt.data.flags.acks.group] = { present: true }; |       groups[cbt.data.flags.acks.group] = {present: true}; | ||||||
|       data.combatants.push(cbt); |       data.combatants.push(cbt); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     // Roll init
 |     // Roll initiative for each group.
 | ||||||
|     Object.keys(groups).forEach((group) => { |     for (const group in groups) { | ||||||
|       let roll = new Roll("1d6").roll(); |       const roll = new Roll("1d6"); | ||||||
|       roll.toMessage({ |       await roll.evaluate({async: true}); | ||||||
|         flavor: game.i18n.format('ACKS.roll.initiative', { group: CONFIG["ACKS"].colors[group] }), |       await roll.toMessage({ | ||||||
|  |         flavor: game.i18n.format('ACKS.roll.initiative', { | ||||||
|  |           group: CONFIG["ACKS"].colors[group], | ||||||
|  |         }), | ||||||
|       }); |       }); | ||||||
|       groups[group].initiative = roll.total; |  | ||||||
|     }); |  | ||||||
| 
 | 
 | ||||||
|     // Set init
 |       groups[group].initiative = roll.total; | ||||||
|     for (let i = 0; i < data.combatants.length; ++i) { |     } | ||||||
|       if (!data.combatants[i].actor) { | 
 | ||||||
|  |     // Set the inititative for each group combatant.
 | ||||||
|  |     for (const combatant of data.combatants) { | ||||||
|  |       if (!combatant.actor) { | ||||||
|         return; |         return; | ||||||
|       } |       } | ||||||
|       data.combatants[i].initiative = | 
 | ||||||
|       groups[data.combatants[i].data.flags.acks.group].initiative; |       let initiative = groups[combatant.data.flags.acks.group].initiative; | ||||||
|       if (data.combatants[i].actor.data.data.isSlow) { |       if (combatant.actor.data.data.isSlow) { | ||||||
|         data.combatants[i].initiative -= 1; |         initiative -= 1; | ||||||
|       } |       } | ||||||
|  | 
 | ||||||
|  |       await combatant.update({ | ||||||
|  |         initiative: initiative, | ||||||
|  |       }); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     combat.setupTurns(); |     combat.setupTurns(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static async resetInitiative(combat, data) { |   static async resetInitiative(combat, data) { | ||||||
|     let reroll = game.settings.get("acks", "initiative"); |     const reroll = game.settings.get("acks", "initiativePersistence"); | ||||||
|     if (!["reset", "reroll"].includes(reroll)) { |     if (!["reset", "reroll"].includes(reroll)) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     combat.resetAll(); |     combat.resetAll(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static async individualInitiative(combat, data) { |   static async individualInitiative(combat, data) { | ||||||
|     let updates = []; |     const updates = []; | ||||||
|     let messages = []; |     const messages = []; | ||||||
|     combat.data.combatants.forEach((c, i) => { | 
 | ||||||
|       // This comes from foundry.js, had to remove the update turns thing
 |     let index = 0; | ||||||
|       // Roll initiative
 | 
 | ||||||
|       const cf = combat._getInitiativeFormula(c); |     for (const [id, combatant] of combat.data.combatants.entries()) { | ||||||
|       const roll = combat._getInitiativeRoll(c, cf); |       const roll = combatant.getInitiativeRoll(); | ||||||
|  |       await roll.evaluate({async: true}); | ||||||
|       let value = roll.total; |       let value = roll.total; | ||||||
|       if (combat.settings.skipDefeated && c.defeated) { | 
 | ||||||
|  |       if (combat.settings.skipDefeated && combatant.defeated) { | ||||||
|         value = -790; |         value = -790; | ||||||
|       } |       } | ||||||
|       updates.push({ _id: c._id, initiative: value }); | 
 | ||||||
|  |       updates.push({ | ||||||
|  |         _id: id, | ||||||
|  |         initiative: value, | ||||||
|  |       }); | ||||||
| 
 | 
 | ||||||
|       // Determine the roll mode
 |       // Determine the roll mode
 | ||||||
|       let rollMode = game.settings.get("core", "rollMode"); |       let rollMode = game.settings.get("core", "rollMode"); | ||||||
|       if ((c.token.hidden || c.hidden) && (rollMode === "roll")) rollMode = "gmroll"; |       if ((combatant.token.hidden || combatant.hidden) | ||||||
|  |           && (rollMode === "roll")) { | ||||||
|  |         rollMode = "gmroll"; | ||||||
|  |       } | ||||||
| 
 | 
 | ||||||
|       // Construct chat message data
 |       // Construct chat message data
 | ||||||
|       let messageData = mergeObject({ |       const messageData = mergeObject({ | ||||||
|         speaker: { |         speaker: { | ||||||
|           scene: canvas.scene._id, |           scene: canvas.scene._id, | ||||||
|           actor: c.actor ? c.actor._id : null, |           actor: combatant.actor?.id || null, | ||||||
|           token: c.token._id, |           token: combatant.token.id, | ||||||
|           alias: c.token.name |           alias: combatant.token.name | ||||||
|         }, |         }, | ||||||
|         flavor: game.i18n.format('ACKS.roll.individualInit', { name: c.token.name }) |         flavor: game.i18n.format('ACKS.roll.individualInit', { | ||||||
|  |           name: combatant.token.name, | ||||||
|  |         }), | ||||||
|       }, {}); |       }, {}); | ||||||
|       const chatData = roll.toMessage(messageData, { rollMode, create: false }); |  | ||||||
| 
 | 
 | ||||||
|       if (i > 0) chatData.sound = null;   // Only play 1 sound for the whole set
 |       const chatData = await roll.toMessage(messageData, { | ||||||
|  |         rollMode, | ||||||
|  |         create: false, | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       // Only play one sound for the whole set.
 | ||||||
|  |       if (index > 0) { | ||||||
|  |         chatData.sound = null; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       messages.push(chatData); |       messages.push(chatData); | ||||||
|     }); | 
 | ||||||
|     await combat.updateEmbeddedEntity("Combatant", updates); |       ++index; | ||||||
|     await CONFIG.ChatMessage.entityClass.create(messages); |     } | ||||||
|  | 
 | ||||||
|  |     await combat.updateEmbeddedDocuments("Combatant", updates); | ||||||
|  |     await CONFIG.ChatMessage.documentClass.create(messages); | ||||||
|  | 
 | ||||||
|     data.turn = 0; |     data.turn = 0; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -128,8 +161,8 @@ export class AcksCombat { | ||||||
|       $(ct).find(".roll").remove(); |       $(ct).find(".roll").remove(); | ||||||
| 
 | 
 | ||||||
|       // Get group color
 |       // Get group color
 | ||||||
|       const cmbtant = object.combat.getCombatant(ct.dataset.combatantId); |       const combatant = object.viewed.combatants.get(ct.dataset.combatantId); | ||||||
|       let color = cmbtant.data.flags.acks.group; |       let color = combatant.data.flags.acks?.group; | ||||||
| 
 | 
 | ||||||
|       // Append colored flag
 |       // Append colored flag
 | ||||||
|       let controls = $(ct).find(".combatant-controls"); |       let controls = $(ct).find(".combatant-controls"); | ||||||
|  | @ -137,6 +170,7 @@ export class AcksCombat { | ||||||
|         `<a class='combatant-control flag' style='color:${color}' title="${CONFIG.ACKS.colors[color]}"><i class='fas fa-flag'></i></a>` |         `<a class='combatant-control flag' style='color:${color}' title="${CONFIG.ACKS.colors[color]}"><i class='fas fa-flag'></i></a>` | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
|  | 
 | ||||||
|     AcksCombat.addListeners(html); |     AcksCombat.addListeners(html); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -223,7 +257,11 @@ export class AcksCombat { | ||||||
|       const combatant = game.combat.combatants.get(id); |       const combatant = game.combat.combatants.get(id); | ||||||
|       await combatant.update({ |       await combatant.update({ | ||||||
|         _id: id, |         _id: id, | ||||||
|         flags: { acks: { group: colors[index] } }, |         flags: { | ||||||
|  |           acks: { | ||||||
|  |             group: colors[index], | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -239,10 +277,9 @@ export class AcksCombat { | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static addCombatant(combat, data, options, id) { |   static async addCombatant(combatant, options, userId) { | ||||||
|     let token = canvas.tokens.get(data.tokenId); |  | ||||||
|     let color = "black"; |     let color = "black"; | ||||||
|     switch (token.data.disposition) { |     switch (combatant.token.data.disposition) { | ||||||
|       case -1: |       case -1: | ||||||
|         color = "red"; |         color = "red"; | ||||||
|         break; |         break; | ||||||
|  | @ -253,12 +290,16 @@ export class AcksCombat { | ||||||
|         color = "green"; |         color = "green"; | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|     data.flags = { | 
 | ||||||
|       acks: { |     await combatant.update({ | ||||||
|         group: color, |       flags: { | ||||||
|  |         acks: { | ||||||
|  |           group: color, | ||||||
|  |         }, | ||||||
|       }, |       }, | ||||||
|     }; |     }); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   static activateCombatant(li) { |   static activateCombatant(li) { | ||||||
|     const turn = game.combat.turns.findIndex(turn => turn._id === li.data('combatant-id')); |     const turn = game.combat.turns.findIndex(turn => turn._id === li.data('combatant-id')); | ||||||
|     game.combat.update({turn: turn}) |     game.combat.update({turn: turn}) | ||||||
|  | @ -274,7 +315,7 @@ export class AcksCombat { | ||||||
| 
 | 
 | ||||||
|   static async preUpdateCombat(combat, data, diff, id) { |   static async preUpdateCombat(combat, data, diff, id) { | ||||||
|     let init = game.settings.get("acks", "initiative"); |     let init = game.settings.get("acks", "initiative"); | ||||||
|     let reroll = game.settings.get("acks", "initiative"); |     let reroll = game.settings.get("acks", "initiativePersistence"); | ||||||
|     if (!data.round) { |     if (!data.round) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,18 @@ | ||||||
| export const registerSettings = function () { | export const registerSettings = () => { | ||||||
| 
 |  | ||||||
|   game.settings.register("acks", "initiative", { |   game.settings.register("acks", "initiative", { | ||||||
|  |     name: game.i18n.localize("ACKS.Setting.Initiative"), | ||||||
|  |     hint: game.i18n.localize("ACKS.Setting.InitiativeHint"), | ||||||
|  |     default: "individual", | ||||||
|  |     scope: "world", | ||||||
|  |     type: String, | ||||||
|  |     config: true, | ||||||
|  |     choices: { | ||||||
|  |       individual: "ACKS.Setting.InitiativeIndividual", | ||||||
|  |       group: "ACKS.Setting.InitiativeGroup", | ||||||
|  |     }, | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   game.settings.register("acks", "initiativePersistence", { | ||||||
|     name: game.i18n.localize("ACKS.Setting.RerollInitiative"), |     name: game.i18n.localize("ACKS.Setting.RerollInitiative"), | ||||||
|     hint: game.i18n.localize("ACKS.Setting.RerollInitiativeHint"), |     hint: game.i18n.localize("ACKS.Setting.RerollInitiativeHint"), | ||||||
|     default: "reset", |     default: "reset", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue