Skip to main content

API Reference

This document describes the public APIs available for developers who want to interact with the Journeys & Jamborees module.

Accessing the API

The module's API is available through the game modules collection:

const jjApi = game.modules.get('journeys-and-jamborees').api;

Party Actor API

The Party actor extends Foundry's base Actor class with additional methods for party management.

Properties

partyActor.memberStatus

Object mapping character IDs to their status and activities.

// Example structure
{
"characterId123": {
status: "active", // "active", "traveling", or "stayingBehind"
downtimeActivity: "hunting" // Optional downtime activity
}
}

partyActor.activeMembers

Array of character IDs that are currently active.

partyActor.travelingMembers

Array of character IDs that are traveling but not active.

partyActor.stayingBehindMembers

Array of character IDs that are staying behind.

Methods

partyActor.addCharacter(characterId)

Add a character to the party.

Parameters:

  • characterId (string): The ID of the character actor to add

Returns: Promise<Actor>

Example:

const character = game.actors.get("characterId123");
await partyActor.addCharacter(character.id);

partyActor.removeCharacter(characterId)

Remove a character from the party.

Parameters:

  • characterId (string): The ID of the character to remove

Returns: Promise<Actor>

partyActor.setCharacterStatus(characterId, status, downtimeActivity?)

Update a character's status within the party.

Parameters:

  • characterId (string): The character to update
  • status (string): One of "active", "traveling", or "stayingBehind"
  • downtimeActivity (string, optional): Activity if traveling

Returns: Promise<Actor>

partyActor.assignTravelRole(role, characterId)

Assign a character to a travel role.

Parameters:

  • role (string): One of "pathfinder", "lookout", or "quartermaster"
  • characterId (string): The character to assign

Returns: Promise<Actor>

partyActor.removeTravelRole(role)

Remove a character from a travel role.

Parameters:

  • role (string): The role to clear

Returns: Promise<Actor>

partyActor.consumeResources()

Consume daily rations and water based on party size and settings.

Returns: Promise<Object> - Object with consumed amounts

Example:

const consumed = await partyActor.consumeResources();
// { rations: 5, water: 5 }

partyActor.rollPathfinding()

Roll a pathfinding check using the assigned pathfinder's skill.

Returns: Promise<Roll|null>

partyActor.rollRandomEncounter()

Roll for a random encounter based on system settings.

Returns: Promise<Roll>

partyActor.addOwnCharacters(userId)

Add all characters owned by a specific user.

Parameters:

  • userId (string): The user ID

Returns: Promise<Array<string>> - Added character IDs

partyActor.resetPartyData()

Clear all party data (characters, resources, roles).

Returns: Promise<Actor>

Food Gathering API (Dragonbane Only)

Access the food gathering system for Dragonbane games.

const foodGathering = game.modules.get('journeys-and-jamborees').api.foodGathering;

Methods

foodGathering.hunt(actor)

Perform a hunting check.

Parameters:

  • actor (Actor): The character performing the hunt

Returns: Promise<Object>

{
success: true,
rations: 5,
result: "Deer",
description: "You successfully hunted a deer!"
}

foodGathering.fish(actor, hasRod, hasNet)

Perform a fishing check.

Parameters:

  • actor (Actor): The character fishing
  • hasRod (boolean): Whether they have a fishing rod
  • hasNet (boolean): Whether they have a fishing net

Returns: Promise<Object>

foodGathering.forage(actor, season)

Perform a foraging check.

Parameters:

  • actor (Actor): The character foraging
  • season (string): Current season ("spring", "summer", "autumn", "winter")

Returns: Promise<Object>

Dragonbane Roll API

Simplified API for rolling Dragonbane skills programmatically.

const rollApi = game.modules.get('journeys-and-jamborees').api.dragonbaneRoll;

Methods

rollApi.rollSkill(actor, skillName, options?)

Roll a skill check for a Dragonbane character.

Parameters:

  • actor (Actor): The character making the roll
  • skillName (string): Name of the skill
  • options (Object, optional):
    • modifier (number): Bonus/penalty to the roll
    • push (boolean): Whether this is a pushed roll
    • skipDialog (boolean): Skip the roll dialog

Returns: Promise<Roll>

Example:

const roll = await rollApi.rollSkill(actor, "BUSHCRAFT", {
modifier: 2,
skipDialog: true
});

Events

The module dispatches several custom events through Foundry's hooks system.

jj.partyMemberAdded

Fired when a character is added to a party.

Parameters:

  • party (Actor): The party actor
  • characterId (string): The added character's ID

jj.partyMemberRemoved

Fired when a character is removed from a party.

Parameters:

  • party (Actor): The party actor
  • characterId (string): The removed character's ID

jj.partyStatusChanged

Fired when a character's status changes.

Parameters:

  • party (Actor): The party actor
  • characterId (string): The character whose status changed
  • newStatus (string): The new status
  • oldStatus (string): The previous status

jj.resourcesConsumed

Fired when party resources are consumed.

Parameters:

  • party (Actor): The party actor
  • consumed (Object): Object with rations and water consumed

System Configuration API

Access system-specific configuration.

const config = game.modules.get('journeys-and-jamborees').api.systemConfig;

Methods

config.getSystemConfig(systemId)

Get configuration for a specific system.

Parameters:

  • systemId (string): The system ID (e.g., "dnd5e")

Returns: Object with system configuration

config.getCurrentSystemConfig()

Get configuration for the currently active system.

Returns: Object with system configuration

Example Usage

Creating a Party and Adding Members

// Create a new party
const partyData = {
name: "The Brave Adventurers",
type: "journeys-and-jamborees.party"
};
const party = await Actor.create(partyData);

// Add all player characters
const players = game.users.filter(u => !u.isGM);
for (const player of players) {
const characterIds = await party.addOwnCharacters(player.id);
console.log(`Added ${characterIds.length} characters for ${player.name}`);
}

// Assign travel roles
const pathfinder = game.actors.getName("Aragorn");
await party.assignTravelRole("pathfinder", pathfinder.id);

Handling Daily Travel

// Morning routine
async function morningRoutine(party) {
// Roll for weather
const weather = await party.rollWeather();

// Pathfinding check
const pathfindingRoll = await party.rollPathfinding();

// Check for encounters
const encounterRoll = await party.rollRandomEncounter();

// Update distance traveled
const currentDistance = party.system.journey.distanceTraveled;
const dailyMovement = party.system.movement.daily;
await party.update({
"system.journey.distanceTraveled": currentDistance + dailyMovement
});
}

// Evening routine
async function eveningRoutine(party) {
// Make camp
await party.update({ "system.travelStatus": "camping" });

// Consume resources
const consumed = await party.consumeResources();

// Food gathering (Dragonbane only)
if (game.system.id === "dragonbane") {
const foodApi = game.modules.get('journeys-and-jamborees').api.foodGathering;

for (const characterId of party.travelingMembers) {
const character = game.actors.get(characterId);
const activity = party.system.memberStatus[characterId].downtimeActivity;

if (activity === "hunting") {
const result = await foodApi.hunt(character);
if (result.success) {
await party.update({
"system.resources.rations": party.system.resources.rations + result.rations
});
}
}
}
}
}

Listening to Party Events

// Monitor party changes
Hooks.on("jj.partyMemberAdded", (party, characterId) => {
const character = game.actors.get(characterId);
ui.notifications.info(`${character.name} joined ${party.name}!`);
});

Hooks.on("jj.resourcesConsumed", (party, consumed) => {
if (party.system.resources.rations < party.activeMembers.length) {
ui.notifications.warn(`${party.name} is running low on food!`);
}
});

Best Practices

  1. Always check if the API exists before using it:

    const module = game.modules.get('journeys-and-jamborees');
    if (module?.api) {
    // Use the API
    }
  2. Handle system-specific features gracefully:

    if (game.system.id === "dragonbane" && module.api.foodGathering) {
    // Use food gathering
    }
  3. Use async/await for all API methods as they return promises

  4. Listen to hooks instead of polling for changes

  5. Respect permissions - the API enforces the same permission rules as the UI