fix: correctly calculate tick value when stopping to wait
All checks were successful
ci/woodpecker/pr/checks Pipeline was successful
All checks were successful
ci/woodpecker/pr/checks Pipeline was successful
This commit is contained in:
parent
753b934534
commit
1888518f26
3 changed files with 15 additions and 11 deletions
|
@ -1,7 +1,8 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "es2022",
|
||||
"target": "ES2022"
|
||||
"target": "ES2022",
|
||||
"strict": true
|
||||
},
|
||||
"exclude": ["node_modules", "dist"],
|
||||
"include": ["src", "client", "common"]
|
||||
|
|
|
@ -112,14 +112,16 @@ const CombatantMixin = (BaseCombatant) => {
|
|||
* @param {object} data The data of the creation / update
|
||||
*/
|
||||
async #updateTiebreakerData(data) {
|
||||
if ('initiative' in data) {
|
||||
const waiting = data.flags?.[packageId]?.waiting;
|
||||
if ('initiative' in data || waiting !== undefined) {
|
||||
const newInitiative = data.initiative ?? this.initiative;
|
||||
const combatantsWithSameTickValue =
|
||||
this.parent?.combatants.filter((combatant) => {
|
||||
const otherInitiative =
|
||||
combatant._newInitiative !== undefined ? combatant._newInitiative : combatant.initiative;
|
||||
return otherInitiative === data.initiative;
|
||||
return otherInitiative === newInitiative && combatant !== this;
|
||||
}) ?? [];
|
||||
const tiebreaker = await this.#getTiebreaker(combatantsWithSameTickValue);
|
||||
const tiebreaker = await this.#getTiebreaker(combatantsWithSameTickValue, waiting);
|
||||
foundry.utils.setProperty(data, `flags.${packageId}.tiebreaker`, tiebreaker);
|
||||
this._newInitiative = data.initiative;
|
||||
this._newTiebreaker = tiebreaker;
|
||||
|
@ -129,11 +131,12 @@ const CombatantMixin = (BaseCombatant) => {
|
|||
/**
|
||||
* Get a tiebreaker between this combatant and the given other combatants.
|
||||
* @param {TickwerkCombatant[]} combatants The other combatants among which to find a tiebreaker
|
||||
* @param {boolean | undefined} waiting The change of the waiting state of the combatanmt
|
||||
* @returns {Promise<number>} A promise that resolves to the tiebreaker
|
||||
*/
|
||||
async #getTiebreaker(combatants) {
|
||||
async #getTiebreaker(combatants, waiting) {
|
||||
const getTiebreaker = CONFIG.tickwerk?.getTiebreaker ?? defaultGetTiebreaker;
|
||||
return getTiebreaker(this, combatants);
|
||||
return getTiebreaker(this, combatants, waiting);
|
||||
}
|
||||
|
||||
/** @override */
|
||||
|
@ -179,14 +182,14 @@ const CombatantMixin = (BaseCombatant) => {
|
|||
|
||||
/**
|
||||
* A function to get a tiebreaker for a combatant
|
||||
* @typedef {(combatant: TickwerkCombatant, combatants: TickwerkCombatant[]) => Promise<number>} GetTiebreaker
|
||||
* @typedef {(combatant: TickwerkCombatant, combatants: TickwerkCombatant[], waiting: boolean | undefined) => Promise<number>} GetTiebreaker
|
||||
*/
|
||||
|
||||
/**
|
||||
* Default implementation to get a tiebreaker for a combatant.
|
||||
* @type {GetTiebreaker}
|
||||
*/
|
||||
const defaultGetTiebreaker = async (combatant, combatants) => {
|
||||
export const defaultGetTiebreaker = async (combatant, combatants) => {
|
||||
if (combatants.length === 0) return 0;
|
||||
const tiebreakers = combatants.map((combatant) => {
|
||||
return (
|
||||
|
|
|
@ -14,7 +14,7 @@ export const registerDS4SpecificFunctionality = () => {
|
|||
};
|
||||
|
||||
/** @type {import("../data/documents/combatant").GetTiebreaker} */
|
||||
const getTiebreaker = async (combatant, combatants) => {
|
||||
const getTiebreaker = async (combatant, combatants, waiting) => {
|
||||
if (combatants.length === 0) return 0;
|
||||
|
||||
/** @type {number[]} */
|
||||
|
@ -26,7 +26,7 @@ const getTiebreaker = async (combatant, combatants) => {
|
|||
|
||||
for (const other of combatants) {
|
||||
const tiebreaker = other._newTiebreaker ?? other.getFlag(packageId, 'tiebreaker') ?? 0;
|
||||
if (getInitiative(other) > getInitiative(combatant)) {
|
||||
if (getInitiative(other) > getInitiative(combatant) || waiting === false) {
|
||||
lowerBounds.push(tiebreaker);
|
||||
} else if (getInitiative(other) < getInitiative(combatant)) {
|
||||
upperBounds.push(tiebreaker);
|
||||
|
@ -36,7 +36,7 @@ const getTiebreaker = async (combatant, combatants) => {
|
|||
}
|
||||
|
||||
equals.sort();
|
||||
const positionAmongEquals = Math.floor(twist.random() * (equals.length + 1));
|
||||
const positionAmongEquals = waiting === false ? equals.length + 1 : Math.floor(twist.random() * (equals.length + 2));
|
||||
|
||||
equals.forEach((equal, index) => {
|
||||
if (index < positionAmongEquals) {
|
||||
|
|
Loading…
Reference in a new issue