Procedural Reward for Good Behavior (Lite)
Implementation of procedural reward for good behavior (lite) that defines how players interact with this aspect of the game, including feedback and progression.
Overview
This mechanic, commonly known as procedural reward for good behavior (lite), 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. The ongoing evolution of this mechanic reflects the broader maturation of game design as a discipline.
Game Examples
Third-Person Shooters
Third-Person Shooters use this mechanic where players allocate limited resources to reach the highest tier. Edge cases create memorable moments, resulting in social interaction.
Stealth Games
Stealth Games use this mechanic where players plan their approach to support their team effectively. The learning curve is steep but rewarding, resulting in meaningful player agency.
Pros & Cons
Advantages
- Encourages defensive playstyles and experimentation
- Creates satisfying numerical loops
- Provides long-term collection objectives for dedicated players
- Easy to understand but difficult to master
- Rewards both resource management and creative problem-solving
Disadvantages
- Risk of tedium in competitive environments
- Can become overpowered in the late game
- Difficult to balance across a wide range of skill levels
- May reduce immersion if implemented poorly
- Creates potential for abuse by experienced players
Implementation Patterns
Reputation Calculator
Event-driven pattern that reacts to procedural reward for good behavior (lite) changes and updates dependent systems.
class ProceduralRewardForGoodBehaviorLiteSystem {
members: Map<string, { role: string; joinedAt: Date }> = new Map();
add(playerId: string, role = "member") {
if (this.members.size >= 8) 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;
}
}