Files
aurorabot/shared/modules/leveling/CLAUDE.md
syntaxbullet 56db5bc998 refactor(games): rework room lifecycle events and remove chess plugin
Consolidate room leave/delete event handling into RoomManager emitter,
remove redundant PLAYER_LEFT publishes from GameServer, and delete the
chess game plugin (board, types, tests) in favor of the new plugin
architecture. Add per-module CLAUDE.md files for leveling, guild-settings,
feature-flags, db, api, and panel to improve agent navigability.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:19:51 +02:00

1.1 KiB

Leveling Module

  • Level is derived, not stored. Total XP is the source of truth. getLevelFromXp() recalculates level from cumulative XP on every addXp() call. Levels are monotonic — they never decrease.
  • XP curve is a power law: xpForLevel(n) = floor(base * n^exponent) where defaults are base: 100, exponent: 1.5. Config comes from gameSettingsService (30s cache TTL).
  • Chat XP (processChatXp()) awards random XP between minXp (5) and maxXp (15) per message, gated by a 60-second per-user cooldown (TimerType.COOLDOWN, key TimerKey.CHAT_XP). The cooldown is upserted atomically.
  • Quest/reward XP uses addXp() directly — it bypasses the chat cooldown.
  • XP boost multipliers come from active TimerType.EFFECT timers with key 'xp_boost' (metadata field: multiplier).
  • All XP values are bigint in the DB but converted to Number for arithmetic. Watch for overflow at extremely high XP values.
  • addXp() and processChatXp() run inside transactions. They emit XP_GAINED (fire-and-forget) which the quest system listens to — the weight equals the XP amount.