diff --git a/src/data/documents/combat.ts b/src/data/documents/combat.ts
index 1322917..1ea1e93 100644
--- a/src/data/documents/combat.ts
+++ b/src/data/documents/combat.ts
@@ -3,7 +3,6 @@
// SPDX-License-Identifier: MIT
import { packageId } from '../../constants';
-import { getGame } from '../../helpers';
import type { TickwerkCombatant } from './combatant';
@@ -46,28 +45,7 @@ const CombatMixin = (BaseCombat: typeof Combat) => {
}
override async nextTurn() {
- const game = getGame();
-
- const combatant = this.combatant;
- if (combatant === undefined || combatant.id === null) {
- return this;
- }
-
- const ticks = await Dialog.prompt({
- title: game.i18n.localize('TICKWERK.AdvanceTicks'),
- content: '',
- label: game.i18n.localize('TICKWERK.AdvanceTicks'),
- callback: (html) => {
- const ticks = html[0]?.querySelector('input[name="ticks"]')?.value;
- return ticks !== undefined ? parseInt(ticks) : undefined;
- },
- rejectClose: false,
- });
-
- if (ticks !== undefined && ticks !== null) {
- await combatant.advanceTicks(ticks);
- }
-
+ await this.combatant?.advanceTicksDialog();
return this;
}
diff --git a/src/data/documents/combatant.ts b/src/data/documents/combatant.ts
index f38305d..8e0a9a4 100644
--- a/src/data/documents/combatant.ts
+++ b/src/data/documents/combatant.ts
@@ -4,6 +4,7 @@
import type { CombatantDataConstructorData } from '@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/data/data.mjs/combatantData';
import { packageId } from '../../constants';
+import { getGame } from '../../helpers';
export const registerCombatantFunctionality = () => {
CONFIG.Combatant.documentClass = CombatantMixin(CONFIG.Combatant.documentClass);
@@ -62,6 +63,25 @@ const CombatantMixin = (BaseCombatant: typeof Combatant) => {
}
}
+ async advanceTicksDialog(): Promise {
+ const game = getGame();
+
+ const ticks = await Dialog.prompt({
+ title: game.i18n.localize('TICKWERK.AdvanceTicks'),
+ content: '',
+ label: game.i18n.localize('TICKWERK.AdvanceTicks'),
+ callback: (html) => {
+ const ticks = html[0]?.querySelector('input[name="ticks"]')?.value;
+ return ticks !== undefined ? parseInt(ticks) : undefined;
+ },
+ rejectClose: false,
+ });
+
+ if (ticks !== undefined && ticks !== null) {
+ await this.advanceTicks(ticks);
+ }
+ }
+
/**
* Update tiebreaker data for a given creation or update.
* @param data The data of the creation / update
@@ -91,6 +111,15 @@ const CombatantMixin = (BaseCombatant: typeof Combatant) => {
return getTiebreaker(this, combatants);
}
+ override testUserPermission(
+ user: foundry.documents.BaseUser,
+ permission: keyof typeof foundry.CONST.DOCUMENT_PERMISSION_LEVELS | foundry.CONST.DOCUMENT_PERMISSION_LEVELS,
+ { exact }: { exact?: boolean | undefined } = {},
+ ): boolean {
+ if (user.isGM) return true;
+ return super.testUserPermission(user, permission, { exact });
+ }
+
protected override _getInitiativeFormula(): string {
const getInitiativeFormula = CONFIG.tickwerk?.getInitiativeFormula;
if (getInitiativeFormula) return getInitiativeFormula(this);
diff --git a/src/systems/ds4.ts b/src/systems/ds4.ts
index 7dcbcb5..7846aba 100644
--- a/src/systems/ds4.ts
+++ b/src/systems/ds4.ts
@@ -22,15 +22,9 @@ const getTiebreaker = async (combatant: TickwerkCombatant, combatants: TickwerkC
for (const combatant of ds4combatants) {
const tiebreaker = combatant._newTiebreaker ?? combatant.getFlag(packageId, 'tiebreaker') ?? 0;
- if (
- (combatant.actor?.data.data.combatValues.initiative.total ?? -Infinity) >
- (ds4combatant.actor?.data.data.combatValues.initiative.total ?? -Infinity)
- ) {
+ if (getInitiative(combatant) > getInitiative(ds4combatant)) {
lowerBounds.push(tiebreaker);
- } else if (
- (combatant.actor?.data.data.combatValues.initiative.total ?? -Infinity) <
- (ds4combatant.actor?.data.data.combatValues.initiative.total ?? -Infinity)
- ) {
+ } else if (getInitiative(combatant) < getInitiative(ds4combatant)) {
upperBounds.push(tiebreaker);
} else {
equals.push(tiebreaker);
@@ -74,6 +68,10 @@ const getInitiativeFormula = (combatant: TickwerkCombatant) => {
type DS4TickwerkCombatant = TickwerkCombatant & { actor: (Actor & { data: { data: ActorData } }) | null };
+const getInitiative = (combatant: DS4TickwerkCombatant): number => {
+ return combatant.actor?.data.data.combatValues.initiative.total ?? -Infinity;
+};
+
interface ActorData {
combatValues: {
initiative: {