Teleport / Blink
Design pattern addressing teleport / blink, defining how this system creates engagement and supports the overall game experience.
Overview
As a core game system, teleport / blink balances complexity with accessibility to engage diverse audiences. Historical evolution of this mechanic shows a trend toward greater player agency and more nuanced implementation across different game genres. Modern implementations often combine this mechanic with procedural elements to increase variety and replayability.
Game Examples
Simulation Games
Simulation Games use this mechanic where players plan their approach to survive increasingly difficult challenges. Each decision has cascading consequences, resulting in risk-reward tension.
Social Deduction Games
Social Deduction Games use this mechanic where players learn through failure to discover hidden content. The system rewards both skill and knowledge, resulting in personal achievement.
Metroidvanias
Metroidvanias use this mechanic where players solve environmental puzzles to achieve mastery over the system. The mechanic integrates seamlessly with other systems, resulting in personal achievement.
Pros & Cons
Advantages
- Reduces monotony while maintaining challenge
- Provides clear numerical feedback on player actions
- Creates satisfying visual loops
- Encourages exploratory playstyles and experimentation
- Creates meaningful social decisions for players
Disadvantages
- Can become overpowered in the late game
- Increases CPU requirements significantly
- Risk of exploitation in multiplayer contexts
- Can create griefing if not carefully balanced
- Requires significant balance data to implement well
Implementation Patterns
Collision Detector
Data-driven implementation that loads teleport / blink configuration from external definitions.
class TeleportBlinkController {
pos = { x: 0, y: 0 };
baseSpeed = 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.baseSpeed * 1.5;
case "crouching": return this.baseSpeed * 0.5;
case "swimming": return this.baseSpeed * 0.7;
default: return this.baseSpeed;
}
}
}