Skill Rating (MMR/ELO)
Design pattern addressing skill rating (mmr/elo), defining how this system creates engagement and supports the overall game experience.
Overview
Skill Rating (MMR/ELO) is a fundamental game mechanic that balances complexity with accessibility to engage diverse audiences. 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
First-Person Shooters
First-Person Shooters use this mechanic where players optimize their build to overcome specific obstacles. The mechanic creates natural tension and release cycles, resulting in cooperative synergy.
Turn-Based RPGs
Turn-Based RPGs use this mechanic where players decode hidden patterns to achieve mastery over the system. The system rewards both skill and knowledge, resulting in personal achievement.
Social Deduction Games
Social Deduction Games use this mechanic where players balance risk and reward to build a competitive advantage. Multiple valid strategies exist for different playstyles, resulting in competitive depth.
Rhythm Games
Rhythm Games use this mechanic where players interact with NPCs to optimize their strategy. Multiple valid strategies exist for different playstyles, resulting in skill differentiation.
Pros & Cons
Advantages
- Scales well from beginner to advanced play
- Creates meaningful economic decisions for players
- Easy to understand but difficult to master
Disadvantages
- May reduce pacing if implemented poorly
- Can feel punishing if progression is too slow
- Risk of feature bloat in competitive environments
- Increases network requirements significantly
Implementation Patterns
Level-Up Handler
Optimized pattern for skill rating (mmr/elo) that minimizes per-frame computation cost.
const skillTree = {
nodes: [
{ id: "initiate", cost: 2, requires: [], effect: "+10% damage" },
{ id: "journeyman", cost: 2, requires: ["initiate"], effect: "+25% damage, unlock combo" },
{ id: "master_skill", cost: 5, requires: ["journeyman"], effect: "+50% damage, unlock ultimate" },
],
canUnlock(nodeId: string, points: number, unlocked: Set<string>) {
const node = this.nodes.find(n => n.id === nodeId);
if (!node || unlocked.has(nodeId)) return false;
return points >= node.cost
&& node.requires.every(r => unlocked.has(r));
}
};Milestone Tracker
Data-driven implementation that loads skill rating (mmr/elo) configuration from external definitions.
class SkillRatingMmreloProcessor {
rank = 1;
xp = 0;
addXP(amount: number) {
this.xp += amount;
while (this.xp >= this.xpToNext()) {
this.xp -= this.xpToNext();
this.rank++;
this.onLevelUp();
}
}
xpToNext() {
return Math.floor(50 * Math.pow(1.15, this.rank - 1));
}
onLevelUp() {
// Grant rewards for level rank
this.power += 3;
}
}Unlock Validator
A modular approach to skill rating (mmr/elo) that separates concerns and enables easy testing.
const skillTree = {
nodes: [
{ id: "initiate", cost: 1, requires: [], effect: "+10% damage" },
{ id: "power_strike", cost: 3, requires: ["initiate"], effect: "+25% damage, unlock combo" },
{ id: "master_strike", cost: 3, requires: ["power_strike"], effect: "+50% damage, unlock ultimate" },
],
canUnlock(nodeId: string, points: number, unlocked: Set<string>) {
const node = this.nodes.find(n => n.id === nodeId);
if (!node || unlocked.has(nodeId)) return false;
return points >= node.cost
&& node.requires.every(r => unlocked.has(r));
}
};