change the level up time to a logarithmic curve

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
This commit is contained in:
Brian S. Stephan 2024-05-17 12:46:11 -05:00
parent 14a1c5ceb6
commit e9b985bd79
Signed by: bss
GPG Key ID: 3DE06D3180895FCB
3 changed files with 12 additions and 16 deletions

View File

@ -47,10 +47,9 @@ class Game(models.Model):
""" """
if not base_time: if not base_time:
base_time = timezone.now() base_time = timezone.now()
if current_level >= 60:
# "The exponent method code had simply gotten to that point that levels were taking too long to complete" # this is an logarithmic curve that starts peaking at 10ish days per level
return base_time + timedelta(seconds=math.ceil((600*(1.16**59)) + ((60*60*24)*(current_level-59)))) return base_time + timedelta(seconds=int(24*60*60*1.4*(5+math.log(0.01*(current_level+1)))))
return base_time + timedelta(seconds=math.ceil(600*(1.16**current_level)))
class CharacterManager(models.Manager): class CharacterManager(models.Manager):

View File

@ -135,24 +135,22 @@ class CharacterTest(TestCase):
char = Character.objects.get(pk=1) char = Character.objects.get(pk=1)
# level 0 -> 1 # level 0 -> 1
assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=600) assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=47758)
# level 1 -> 2 # level 1 -> 2
char.level = 1 char.level = 1
assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=696) assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=131601)
# level 24 -> 25 # level 24 -> 25
char.level = 24 char.level = 24
assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=21142) assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=437113)
# level 59 -> 60 # level 59 -> 60
char.level = 59 char.level = 59
assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=3812174) assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=543010)
# level 60 -> 61 # level 60 -> 61
char.level = 60 char.level = 60
assert char.calculate_datetime_to_next_level() == char.next_level + (timedelta(seconds=3812174) + assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=545009)
timedelta(seconds=86400))
# level 61 -> 62 # level 61 -> 62
char.level = 61 char.level = 61
assert char.calculate_datetime_to_next_level() == char.next_level + (timedelta(seconds=3812174) + assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=546976)
timedelta(seconds=86400*2))
def test_calculate_datetime_to_next_level_not_time_yet(self): def test_calculate_datetime_to_next_level_not_time_yet(self):
"""Test that we just bail with the current next_level if it hasn't been reached yet.""" """Test that we just bail with the current next_level if it hasn't been reached yet."""
@ -169,7 +167,7 @@ class CharacterTest(TestCase):
new_char = Character.objects.register('new', game, 'pass', 'bss!bss@test_register', 'unit tester') new_char = Character.objects.register('new', game, 'pass', 'bss!bss@test_register', 'unit tester')
assert new_char.status == Character.CHARACTER_STATUS_LOGGED_IN assert new_char.status == Character.CHARACTER_STATUS_LOGGED_IN
assert new_char.next_level == register_time + timedelta(seconds=600) assert new_char.next_level == register_time + timedelta(seconds=47758)
assert new_char.last_login == register_time assert new_char.last_login == register_time
assert new_char.password[0:13] == 'pbkdf2_sha256' assert new_char.password[0:13] == 'pbkdf2_sha256'
@ -203,7 +201,7 @@ class CharacterTest(TestCase):
char.level_up() char.level_up()
assert char.level == old_level + 1 assert char.level == old_level + 1
assert char.next_level == old_next_level + timedelta(seconds=600) assert char.next_level == old_next_level + timedelta(seconds=47758)
def test_level_up_fail_not_time(self): def test_level_up_fail_not_time(self):
"""Test the failure condition for trying to level up before the timestamp.""" """Test the failure condition for trying to level up before the timestamp."""

View File

@ -367,7 +367,6 @@ class IrcPluginTest(TestCase):
assert char_2.level == 0 assert char_2.level == 0
assert char_1.next_level != char_2.next_level assert char_1.next_level != char_2.next_level
self.mock_bot.reply.assert_has_calls([ self.mock_bot.reply.assert_has_calls([
mock.call(None, "test_level_1, the tester, has attained level 1! Next level at 2024-05-16 00:10:00 UTC.", mock.call(None, "test_level_1, the tester, has attained level 1! Next level at 2024-05-16 13:15:58 UTC.",
explicit_target=game.channel.name), explicit_target=game.channel.name),
]) ])
assert self.mock_bot.reply.call_count == 2