change the level up time to a logarithmic curve
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
This commit is contained in:
parent
14a1c5ceb6
commit
e9b985bd79
@ -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):
|
||||||
|
@ -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."""
|
||||||
|
@ -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
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user