Social & Multiplayer

Raid Lockout

Implementation of raid lockout that defines how players interact with this aspect of the game, including feedback and progression.

Low complexity
3 examples
1 patterns

Overview

This mechanic, commonly known as raid lockout, defines how players interact with this aspect of the game world. When well-implemented, this mechanic creates a satisfying feedback loop that keeps players engaged and motivated to continue playing. Understanding the design principles behind this mechanic helps developers create more engaging and balanced game experiences.

Game Examples

Deck Builders

Deck Builders use this mechanic where players prioritize targets to progress through the content. The mechanic integrates seamlessly with other systems, resulting in competitive depth.

Puzzle Games

Puzzle Games use this mechanic where players manage resources carefully to overcome specific obstacles. Each decision has cascading consequences, resulting in risk-reward tension.

First-Person Shooters

First-Person Shooters use this mechanic where players explore the environment to progress through the content. Emergent gameplay arises from simple rules, resulting in personal achievement.

Pros & Cons

Advantages

  • Integrates naturally with social systems
  • Enables social player expression
  • Adds accessibility without excessive complexity
  • Balances narrative against narrative effectively
  • Provides long-term collection objectives for dedicated players

Disadvantages

  • May overwhelm casual players with too many options
  • Increases memory requirements significantly
  • Can create tedious when RNG is unfavorable

Implementation Patterns

Group Resolver

Optimized pattern for raid lockout that minimizes per-frame computation cost.

class RaidLockoutHandler {
  members: Map<string, { role: string; joinedAt: Date }> = new Map();

  add(playerId: string, role = "member") {
    if (this.members.size >= 5) return false;
    this.members.set(playerId, { role, joinedAt: new Date() });
    this.broadcast(`${playerId} joined as ${role}`);
    return true;
  }

  remove(playerId: string) {
    this.members.delete(playerId);
    this.broadcast(`${playerId} left`);
  }

  hasPermission(playerId: string, action: string) {
    const member = this.members.get(playerId);
    if (!member) return false;
    return PERMISSIONS[member.role]?.includes(action) ?? false;
  }
}