fix: death rate to 100% after reaching max age
This commit is contained in:
84
tests/test_age_death_mechanic.py
Normal file
84
tests/test_age_death_mechanic.py
Normal file
@@ -0,0 +1,84 @@
|
||||
import pytest
|
||||
from src.classes.age import Age
|
||||
from src.classes.cultivation import Realm
|
||||
|
||||
class TestAgeDeathMechanic:
|
||||
"""测试新的寿命与老死机制"""
|
||||
|
||||
def test_safe_zone(self):
|
||||
"""测试安全期:年龄 < 寿命上限 - 20"""
|
||||
# 练气期寿命 100
|
||||
age = Age(50, Realm.Qi_Refinement)
|
||||
assert age.max_lifespan == 100
|
||||
|
||||
# 50岁肯定安全
|
||||
assert age.get_death_probability() == 0.0
|
||||
|
||||
# 79岁也安全 (100 - 20 = 80)
|
||||
age.age = 79
|
||||
assert age.get_death_probability() == 0.0
|
||||
|
||||
def test_twilight_zone(self):
|
||||
"""测试衰退期:寿命上限 - 20 <= 年龄 < 寿命上限"""
|
||||
# 练气期寿命 100,衰退期开始于 80
|
||||
age = Age(80, Realm.Qi_Refinement)
|
||||
|
||||
# 刚进入衰退期
|
||||
prob_80 = age.get_death_probability()
|
||||
assert prob_80 == 0.0 # (80 - 80) * 0.005 = 0
|
||||
|
||||
# 81岁
|
||||
age.age = 81
|
||||
prob_81 = age.get_death_probability()
|
||||
assert prob_81 > 0.0
|
||||
assert prob_81 == 0.005 # (81 - 80) * 0.005
|
||||
|
||||
# 90岁
|
||||
age.age = 90
|
||||
prob_90 = age.get_death_probability()
|
||||
assert prob_90 == 0.05 # (90 - 80) * 0.005
|
||||
|
||||
# 99岁
|
||||
age.age = 99
|
||||
prob_99 = age.get_death_probability()
|
||||
assert prob_99 > prob_90
|
||||
assert prob_99 < 1.0
|
||||
|
||||
def test_doom_zone(self):
|
||||
"""测试大限:年龄 >= 寿命上限"""
|
||||
age = Age(100, Realm.Qi_Refinement)
|
||||
|
||||
# 刚好到达大限
|
||||
assert age.get_death_probability() == 1.0
|
||||
|
||||
# 超过大限
|
||||
age.age = 101
|
||||
assert age.get_death_probability() == 1.0
|
||||
|
||||
def test_realm_breakthrough_extends_life(self):
|
||||
"""测试突破境界延长寿命,脱离危险区"""
|
||||
# 练气期 90岁 (寿命100),处于危险区
|
||||
age = Age(90, Realm.Qi_Refinement)
|
||||
assert age.get_death_probability() > 0.0
|
||||
|
||||
# 突破到筑基期 (寿命150)
|
||||
age.update_realm(Realm.Foundation_Establishment)
|
||||
assert age.max_lifespan == 150
|
||||
|
||||
# 90岁对于150岁上限来说,远未到危险区 (150-20=130)
|
||||
assert age.get_death_probability() == 0.0
|
||||
|
||||
def test_lifespan_reduction_items(self):
|
||||
"""测试寿命上限减少导致提前进入危险区"""
|
||||
age = Age(50, Realm.Qi_Refinement)
|
||||
assert age.max_lifespan == 100
|
||||
|
||||
# 遭受重创,折寿40年 -> 上限变60
|
||||
age.decrease_max_lifespan(40)
|
||||
assert age.max_lifespan == 60
|
||||
|
||||
# 50岁对于60岁上限来说,已进入危险区 (60-20=40)
|
||||
assert age.get_death_probability() > 0.0
|
||||
# (50 - 40) * 0.005 = 0.05
|
||||
assert age.get_death_probability() == 0.05
|
||||
|
||||
@@ -28,16 +28,28 @@ class TestAgeLifespanConstraint:
|
||||
)
|
||||
|
||||
def test_batch_creation_no_immediate_death(self, base_world):
|
||||
"""批量创建的角色不应该一出生就处于老死状态."""
|
||||
"""批量创建的角色不应该一出生就处于必死状态.
|
||||
|
||||
注:新机制下,大限前20年会有死亡概率,所以不能断言概率为0,
|
||||
只能断言概率不为1.0(即没死透)。
|
||||
"""
|
||||
avatars = make_avatars(base_world, count=100)
|
||||
|
||||
for avatar in avatars.values():
|
||||
# 不应该有老死概率
|
||||
death_prob = avatar.age.get_death_probability()
|
||||
assert death_prob == 0.0, (
|
||||
f"角色 {avatar.name} 年龄 {avatar.age.age}/"
|
||||
f"{avatar.age.max_lifespan} 有老死概率 {death_prob}"
|
||||
|
||||
# 1. 刚生成的活人角色不应该必死
|
||||
assert death_prob < 1.0, (
|
||||
f"角色 {avatar.name} 刚生成就必死 (prob={death_prob})"
|
||||
)
|
||||
|
||||
# 2. 如果在安全期,概率应为0
|
||||
safe_limit = avatar.age.max_lifespan - 20
|
||||
if avatar.age.age < safe_limit:
|
||||
assert death_prob == 0.0, (
|
||||
f"角色 {avatar.name} 处于安全期 ({avatar.age.age}/{safe_limit}) "
|
||||
f"却有老死概率 {death_prob}"
|
||||
)
|
||||
|
||||
def test_multiple_batch_creations_consistent(self, base_world):
|
||||
"""多次批量创建应该都满足年龄约束."""
|
||||
@@ -54,7 +66,7 @@ class TestRealmLifespanMapping:
|
||||
"""测试各境界的寿命上限映射."""
|
||||
|
||||
def test_qi_refinement_lifespan(self, base_world):
|
||||
"""练气期角色年龄应不超过80岁."""
|
||||
"""练气期角色年龄应不超过100岁."""
|
||||
from src.classes.cultivation import Realm
|
||||
|
||||
avatars = make_avatars(base_world, count=100)
|
||||
@@ -63,13 +75,16 @@ class TestRealmLifespanMapping:
|
||||
if av.cultivation_progress.realm == Realm.Qi_Refinement
|
||||
]
|
||||
|
||||
# 获取当前配置的寿命
|
||||
limit = Age.REALM_LIFESPAN[Realm.Qi_Refinement]
|
||||
|
||||
for avatar in qi_refinement_avatars:
|
||||
assert avatar.age.age < 80, (
|
||||
f"练气期角色 {avatar.name} 年龄 {avatar.age.age} 超过 80"
|
||||
assert avatar.age.age < limit, (
|
||||
f"练气期角色 {avatar.name} 年龄 {avatar.age.age} 超过 {limit}"
|
||||
)
|
||||
|
||||
def test_foundation_establishment_lifespan(self, base_world):
|
||||
"""筑基期角色年龄应不超过120岁."""
|
||||
"""筑基期角色年龄应不超过150岁."""
|
||||
from src.classes.cultivation import Realm
|
||||
|
||||
avatars = make_avatars(base_world, count=100)
|
||||
@@ -78,7 +93,10 @@ class TestRealmLifespanMapping:
|
||||
if av.cultivation_progress.realm == Realm.Foundation_Establishment
|
||||
]
|
||||
|
||||
# 获取当前配置的寿命
|
||||
limit = Age.REALM_LIFESPAN[Realm.Foundation_Establishment]
|
||||
|
||||
for avatar in fe_avatars:
|
||||
assert avatar.age.age < 120, (
|
||||
f"筑基期角色 {avatar.name} 年龄 {avatar.age.age} 超过 120"
|
||||
assert avatar.age.age < limit, (
|
||||
f"筑基期角色 {avatar.name} 年龄 {avatar.age.age} 超过 {limit}"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user