Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/OpenRCT2/OpenRCT2/llms.txt

Use this file to discover all available pages before exploring further.

Staff members are employees that maintain and operate the park. Access them using map.getAllEntities('staff').

Staff Types

There are four types of staff:
  • "handyman" - Sweeps litter, mows lawns, waters gardens, empties bins
  • "mechanic" - Inspects and fixes rides
  • "security" - Stops vandals
  • "entertainer" - Entertains guests
const staff = map.getAllEntities('staff');
staff.forEach(member => {
  console.log(`${member.name}: ${member.staffType}`);
});

Base Staff Properties

name
string
Name of the staff member.
member.name = 'Bob the Handyman';
staffType
StaffType
The type of staff member.
console.log(`Type: ${member.staffType}`);
colour
number
Colour of the staff member (0-31). Not applicable to entertainers.
member.colour = 10; // Change uniform color
orders
number
The enabled jobs the staff can do (bitmask).For handymen:
  • 1 (0001): Sweeping
  • 2 (0010): Watering flowers
  • 4 (0100): Empty bins
  • 8 (1000): Mowing
For mechanics:
  • 1 (0001): Inspect rides
  • 2 (0010): Fix rides
member.orders = 15; // Enable all handyman tasks (1+2+4+8)
member.orders = 3;  // Enable both mechanic tasks (1+2)
costume
StaffCostume | string | number
The staff member’s costume. Primarily for entertainers.Available costumes: “panda”, “tiger”, “elephant”, “roman”, “gorilla”, “snowman”, “knight”, “astronaut”, “bandit”, “sheriff”, “pirate”
member.costume = 'panda';
availableCostumes
StaffCostume[]
Array of costumes available to this staff member.
console.log('Available costumes:', member.availableCostumes);

Location

x
number
The x-coordinate in game units.
y
number
The y-coordinate in game units.
z
number
The z-coordinate in game units.
destination
CoordsXY
The staff member’s direct destination.
console.log(`Going to: (${member.destination.x}, ${member.destination.y})`);
direction
Direction
The staff member’s orthogonal direction (0-3).
energy
number
How tired the staff member is (32-128). Lower is more tired.
energyTarget
number
The target energy value.

Patrol Area

patrolArea
PatrolArea
Gets the patrol area for the staff member.
The patrol area object has these methods:

tiles

Gets or sets all individual tiles in the patrol area.
// Get all patrol tiles
const tiles = member.patrolArea.tiles;
console.log(`Patrol area has ${tiles.length} tiles`);

// Set patrol tiles
member.patrolArea.tiles = [
  { x: 32, y: 32 },
  { x: 33, y: 32 },
  { x: 34, y: 32 }
];
Fetching all patrol area tiles can degrade performance for large areas.

clear()

Clears all tiles from the patrol area.
member.patrolArea.clear();

add()

Adds coordinates or a map range to the patrol area.
coords
CoordsXY[] | MapRange
required
Array of coordinates or a map range to add.
// Add individual tiles
member.patrolArea.add([
  { x: 32, y: 32 },
  { x: 33, y: 32 }
]);

// Add a rectangular range
member.patrolArea.add({
  leftTop: { x: 10, y: 10 },
  rightBottom: { x: 20, y: 20 }
});

remove()

Removes coordinates or a map range from the patrol area.
coords
CoordsXY[] | MapRange
required
Array of coordinates or a map range to remove.
member.patrolArea.remove([
  { x: 32, y: 32 }
]);

member.patrolArea.remove({
  leftTop: { x: 10, y: 10 },
  rightBottom: { x: 15, y: 15 }
});

contains()

Checks whether a coordinate is within the patrol area.
coord
CoordsXY
required
The coordinate to check.
if (member.patrolArea.contains({ x: 32, y: 32 })) {
  console.log('Tile is in patrol area');
}

Handyman

Handymen clean and maintain the park.
lawnsMown
number
The number of lawns mown by the handyman.
console.log(`Lawns mown: ${handyman.lawnsMown}`);
gardensWatered
number
The number of gardens watered by the handyman.
console.log(`Gardens watered: ${handyman.gardensWatered}`);
litterSwept
number
The number of litter swept by the handyman.
console.log(`Litter swept: ${handyman.litterSwept}`);
binsEmptied
number
The number of bins emptied by the handyman.
console.log(`Bins emptied: ${handyman.binsEmptied}`);

Mechanic

Mechanics inspect and fix rides.
ridesFixed
number
The number of rides fixed by the mechanic.
console.log(`Rides fixed: ${mechanic.ridesFixed}`);
ridesInspected
number
The number of inspections performed by the mechanic.
console.log(`Inspections: ${mechanic.ridesInspected}`);

Security Guard

Security guards stop vandals.
vandalsStopped
number
The number of vandals stopped by the security guard.
console.log(`Vandals stopped: ${security.vandalsStopped}`);

Animations

availableAnimations
StaffAnimation[]
The animations available to this staff member.
animation
StaffAnimation
The animation the staff member is currently exhibiting. Animations include: “walking”, “watchRide”, “wave”, “staffMower”, “staffSweep”, “staffAnswerCall”, “staffCheckBoard”, “staffFix”, “staffWatering”, “staffEmptyBin”, etc.
animationOffset
number
The frame offset in the current animation.
animationLength
number
The total number of frames in the current animation.

getAnimationSpriteIds()

Gets sprite IDs for a staff animation.
animation
StaffAnimation
required
The animation to get sprites for.
rotation
number
required
The rotation (0-7).
const sprites = member.getAnimationSpriteIds('staffSweep', 0);

getCostumeStrings()

Returns an array of costume strings with inline sprites.
const costumes = member.getCostumeStrings();
console.log('Costumes:', costumes);

Usage Examples

Hire Staff

// Hire a handyman
context.executeAction('staffhire', {
  autoPosition: true,
  staffType: 0, // Handyman
  costumeIndex: 0,
  staffOrders: 15 // All tasks enabled
}, (result) => {
  if (result.error === 0) {
    const staffId = result.peep;
    const staff = map.getEntity(staffId);
    console.log(`Hired ${staff.name}`);
  }
});

// Hire a mechanic
context.executeAction('staffhire', {
  autoPosition: true,
  staffType: 1, // Mechanic
  costumeIndex: 0,
  staffOrders: 3 // Inspect and fix
});

Staff Performance Report

function staffPerformanceReport() {
  const staff = map.getAllEntities('staff');
  
  console.log('=== Staff Performance ===');
  
  staff.forEach(member => {
    console.log(`\n${member.name} (${member.staffType})`);
    
    if (member.staffType === 'handyman') {
      console.log(`  Lawns mown: ${member.lawnsMown}`);
      console.log(`  Gardens watered: ${member.gardensWatered}`);
      console.log(`  Litter swept: ${member.litterSwept}`);
      console.log(`  Bins emptied: ${member.binsEmptied}`);
    } else if (member.staffType === 'mechanic') {
      console.log(`  Rides fixed: ${member.ridesFixed}`);
      console.log(`  Inspections: ${member.ridesInspected}`);
    } else if (member.staffType === 'security') {
      console.log(`  Vandals stopped: ${member.vandalsStopped}`);
    }
  });
}

Set Patrol Areas

function setPatrolArea(staff, area) {
  staff.patrolArea.clear();
  staff.patrolArea.add(area);
  console.log(`Set patrol area for ${staff.name}`);
}

// Set rectangular patrol area
const handyman = map.getAllEntities('staff')
  .find(s => s.staffType === 'handyman');

if (handyman) {
  setPatrolArea(handyman, {
    leftTop: { x: 10, y: 10 },
    rightBottom: { x: 30, y: 30 }
  });
}

Fire Inefficient Staff

function fireInefficientStaff() {
  const staff = map.getAllEntities('staff');
  
  staff.forEach(member => {
    let shouldFire = false;
    
    if (member.staffType === 'handyman') {
      const total = member.lawnsMown + member.gardensWatered + 
                   member.litterSwept + member.binsEmptied;
      if (total < 10) shouldFire = true;
    } else if (member.staffType === 'mechanic') {
      if (member.ridesFixed + member.ridesInspected < 5) {
        shouldFire = true;
      }
    }
    
    if (shouldFire) {
      console.log(`Firing ${member.name} for poor performance`);
      context.executeAction('stafffire', { id: member.id });
    }
  });
}

Change Staff Uniforms

function changeUniformColors() {
  const staff = map.getAllEntities('staff');
  
  staff.forEach(member => {
    if (member.staffType === 'handyman') {
      member.colour = 2; // Green
    } else if (member.staffType === 'mechanic') {
      member.colour = 10; // Blue
    } else if (member.staffType === 'security') {
      member.colour = 0; // Black
    }
  });
}

Auto-Assign Patrol Areas

function autoAssignPatrolAreas() {
  const handymen = map.getAllEntities('staff')
    .filter(s => s.staffType === 'handyman');
  
  const mapSize = map.size;
  const sections = handymen.length;
  const sectionWidth = Math.floor(mapSize.x / sections);
  
  handymen.forEach((handyman, index) => {
    const startX = index * sectionWidth;
    const endX = (index + 1) * sectionWidth - 1;
    
    handyman.patrolArea.clear();
    handyman.patrolArea.add({
      leftTop: { x: startX, y: 0 },
      rightBottom: { x: endX, y: mapSize.y - 1 }
    });
    
    console.log(`${handyman.name} assigned section ${index + 1}`);
  });
}