Skip to content

Commit bc1488f

Browse files
committed
feat: Update level calculation to 50 * level^2 and randomize XP increments.
1 parent f966e55 commit bc1488f

File tree

2 files changed

+12
-22
lines changed

2 files changed

+12
-22
lines changed

src/tux/database/controllers/levels.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ async def add_xp(self, member_id: int, guild_id: int, xp_amount: float) -> Level
8080
"""
8181
levels = await self.get_or_create_levels(member_id, 0)
8282
new_xp = levels.xp + xp_amount
83-
new_level = int(new_xp**0.5) # Simple level calculation
83+
new_level = int((new_xp / 50.0) ** 0.5) # Global level calculation (50x^2)
8484

8585
return (
8686
await self.update_by_id(
@@ -102,7 +102,7 @@ async def set_xp(self, member_id: int, guild_id: int, xp: float) -> Levels:
102102
The updated levels record.
103103
"""
104104
levels = await self.get_or_create_levels(member_id, 0)
105-
new_level = int(xp**0.5)
105+
new_level = int((xp / 50.0) ** 0.5)
106106

107107
return (
108108
await self.update_by_id(
@@ -124,7 +124,7 @@ async def set_level(self, member_id: int, guild_id: int, level: int) -> Levels:
124124
The updated levels record.
125125
"""
126126
levels = await self.get_or_create_levels(member_id, 0)
127-
xp = level**2 # Reverse level calculation
127+
xp = 50.0 * (level**2) # Reverse level calculation (50x^2)
128128

129129
return (
130130
await self.update_by_id(

src/tux/modules/features/levels.py

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"""
88

99
import datetime
10+
import random
1011
import time
1112

1213
import discord
@@ -355,8 +356,7 @@ def calculate_xp_for_level(self, level: int, guild_id: int = 0) -> float:
355356
The XP required for the level.
356357
"""
357358
# Get server-specific exponent or use default
358-
exponent = self.levels_exponent.get(guild_id, self.levels_exponent.get(0, 2.0))
359-
return 500 * (level / 5) ** exponent
359+
return 50.0 * (level**2)
360360

361361
def calculate_xp_increment(
362362
self,
@@ -386,11 +386,14 @@ def calculate_xp_increment(
386386
for role in CONFIG.XP_CONFIG.XP_MULTIPLIERS[guild_id]
387387
}
388388

389-
return max(
390-
(guild_multipliers.get(role.id, 1) for role in member.roles),
391-
default=1,
389+
base_xp = random.randint(10, 20)
390+
multiplier = max(
391+
(guild_multipliers.get(role.id, 1.0) for role in member.roles),
392+
default=1.0,
392393
)
393394

395+
return float(base_xp * multiplier)
396+
394397
def calculate_level(self, xp: float, guild_id: int = 0) -> int:
395398
"""
396399
Calculate a level based on XP.
@@ -407,20 +410,7 @@ def calculate_level(self, xp: float, guild_id: int = 0) -> int:
407410
int
408411
The calculated level.
409412
"""
410-
# Ensure XP is non-negative to prevent complex number errors
411-
xp = max(0.0, xp)
412-
413-
# Get server-specific exponent or use default
414-
exponent = self.levels_exponent.get(guild_id, self.levels_exponent.get(0, 2.0))
415-
416-
# Guard against division by zero
417-
if exponent == 0:
418-
logger.error(
419-
f"levels_exponent for guild {guild_id} cannot be 0, using default value of 2",
420-
)
421-
exponent = 2.0
422-
423-
return int((xp / 500) ** (1 / exponent) * 5)
413+
return int((xp / 50.0) ** 0.5)
424414

425415
# *NOTE* Do not move this function to utils.py, as this results in a circular import.
426416
def valid_xplevel_input(self, user_input: int) -> discord.Embed | None:

0 commit comments

Comments
 (0)