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:
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"
return base_time + timedelta(seconds=math.ceil((600*(1.16**59)) + ((60*60*24)*(current_level-59))))
return base_time + timedelta(seconds=math.ceil(600*(1.16**current_level)))
# this is an logarithmic curve that starts peaking at 10ish days per level
return base_time + timedelta(seconds=int(24*60*60*1.4*(5+math.log(0.01*(current_level+1)))))
class CharacterManager(models.Manager):

View File

@ -135,24 +135,22 @@ class CharacterTest(TestCase):
char = Character.objects.get(pk=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
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
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
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
char.level = 60
assert char.calculate_datetime_to_next_level() == char.next_level + (timedelta(seconds=3812174) +
timedelta(seconds=86400))
assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=545009)
# level 61 -> 62
char.level = 61
assert char.calculate_datetime_to_next_level() == char.next_level + (timedelta(seconds=3812174) +
timedelta(seconds=86400*2))
assert char.calculate_datetime_to_next_level() == char.next_level + timedelta(seconds=546976)
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."""
@ -169,7 +167,7 @@ class CharacterTest(TestCase):
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.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.password[0:13] == 'pbkdf2_sha256'
@ -203,7 +201,7 @@ class CharacterTest(TestCase):
char.level_up()
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):
"""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_1.next_level != char_2.next_level
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),
])
assert self.mock_bot.reply.call_count == 2