Movement & Navigation

Elevator / Lift

Structured approach to elevator / lift that balances depth with accessibility, creating satisfying player experiences.

Low complexity
4 examples
3 patterns

Overview

The elevator / lift mechanic provides a framework that provides meaningful choices and consequences for player actions. Designers must carefully balance the system's depth against its learning curve, ensuring that new players can engage while experienced players find room for mastery. The key to successful implementation lies in clear communication of rules, fair outcomes, and satisfying feedback for player actions.

Game Examples

Asymmetric Games

Asymmetric Games use this mechanic where players interact with NPCs to achieve mastery over the system. The mechanic respects player time and investment, resulting in meaningful player agency.

Fishing Games

Fishing Games use this mechanic where players time their actions precisely to survive increasingly difficult challenges. The learning curve is steep but rewarding, resulting in exploration incentives.

Card Games

Card Games use this mechanic where players weigh competing priorities to complete objectives efficiently. Accessibility options allow different skill levels to participate, resulting in long-term engagement.

Party Games

Party Games use this mechanic where players explore the environment to reach the highest tier. The system tracks multiple variables simultaneously, resulting in social interaction.

Pros & Cons

Advantages

  • Provides long-term collection objectives for dedicated players
  • Provides long-term engagement for dedicated players
  • Easy to understand but difficult to master
  • Creates satisfying audio loops

Disadvantages

  • Requires extensive QA testing to avoid edge cases
  • May create a knowledge wall for new players
  • May reduce game balance if implemented poorly
  • Risk of analysis paralysis in multiplayer contexts
  • Can create exploitation if not carefully balanced

Implementation Patterns

Camera Controller

Data-driven implementation that loads elevator / lift configuration from external definitions.

class ElevatorLiftProcessor {
  coords = { x: 0, y: 0 };
  velocity = 5.0;
  state = "standing";

  update(input: Input, dt: number) {
    const speed = this.getSpeed();
    this.coords.x += input.x * speed * dt;
    this.coords.y += input.y * speed * dt;
  }

  getSpeed() {
    switch (this.state) {
      case "sprinting": return this.velocity * 1.5;
      case "crouching": return this.velocity * 0.4;
      case "swimming": return this.velocity * 0.8;
      default: return this.velocity;
    }
  }
}

Input Handler

Core implementation pattern for handling elevator / lift logic with clean state management.

class ElevatorLiftManager {
  pos = { x: 0, y: 0 };
  moveSpeed = 8.0;
  phase = "standing";

  update(input: Input, dt: number) {
    const speed = this.getSpeed();
    this.pos.x += input.x * speed * dt;
    this.pos.y += input.y * speed * dt;
  }

  getSpeed() {
    switch (this.phase) {
      case "sprinting": return this.moveSpeed * 2.0;
      case "crouching": return this.moveSpeed * 0.4;
      case "swimming": return this.moveSpeed * 0.6;
      default: return this.moveSpeed;
    }
  }
}

Collision Detector

Data-driven implementation that loads elevator / lift configuration from external definitions.

class ElevatorLiftManager {
  coords = { x: 0, y: 0 };
  speed = 5.0;
  mode = "walking";

  update(input: Input, dt: number) {
    const speed = this.getSpeed();
    this.coords.x += input.x * speed * dt;
    this.coords.y += input.y * speed * dt;
  }

  getSpeed() {
    switch (this.mode) {
      case "sprinting": return this.speed * 1.8;
      case "crouching": return this.speed * 0.5;
      case "swimming": return this.speed * 0.6;
      default: return this.speed;
    }
  }
}