fix death bug

This commit is contained in:
bridge
2026-01-06 21:23:06 +08:00
parent 3f980d4593
commit b60481c99c
7 changed files with 157 additions and 93 deletions

82
tests/test_birth.py Normal file
View File

@@ -0,0 +1,82 @@
import pytest
from src.classes.avatar import Avatar, Gender
from src.classes.age import Age
from src.classes.cultivation import Realm, CultivationProgress
from src.utils.id_generator import get_avatar_id
from src.classes.root import Root
from src.classes.calendar import create_month_stamp, Year, Month
def test_register_avatar_buffer(base_world):
"""测试注册新角色时的缓冲区逻辑"""
manager = base_world.avatar_manager
# 1. 注册普通角色(非新生,例如加载存档)
a1 = Avatar(
world=base_world,
name="OldGuy",
id=get_avatar_id(),
birth_month_stamp=create_month_stamp(Year(100), Month.JANUARY),
age=Age(20, Realm.Qi_Refinement),
gender=Gender.MALE
)
manager.register_avatar(a1, is_newly_born=False)
assert a1.id in manager.avatars
assert len(manager.pop_newly_born()) == 0
# 2. 注册新生角色
a2 = Avatar(
world=base_world,
name="Baby",
id=get_avatar_id(),
birth_month_stamp=create_month_stamp(Year(200), Month.JANUARY),
age=Age(1, Realm.Qi_Refinement),
gender=Gender.FEMALE
)
manager.register_avatar(a2, is_newly_born=True)
assert a2.id in manager.avatars
newly_born = manager.pop_newly_born()
assert len(newly_born) == 1
assert str(a2.id) in newly_born
# 3. 再次获取应为空
assert len(manager.pop_newly_born()) == 0
@pytest.mark.asyncio
async def test_simulator_birth_logic(base_world):
"""测试模拟器中的生子逻辑集成"""
from src.sim.simulator import Simulator
from unittest.mock import patch
from src.classes.avatar import Avatar
from src.classes.age import Age
from src.classes.cultivation import Realm, CultivationProgress
# 构造一个简单的模拟返回值
mock_avatar = Avatar(
world=base_world,
name="MockBaby",
id="mock_id_123",
birth_month_stamp=base_world.month_stamp,
age=Age(1, Realm.Qi_Refinement),
gender=Gender.MALE
)
sim = Simulator(base_world)
sim.birth_rate = 1.0 # 必生
# Patch 掉 create_random_mortal避免依赖复杂的宗门/地图数据
with patch('src.sim.simulator.create_random_mortal', return_value=mock_avatar):
# 执行一次更新
events = sim._phase_update_age_and_birth()
# 验证产生了一个新角色
newly_born = base_world.avatar_manager.pop_newly_born()
assert len(newly_born) == 1
assert newly_born[0] == mock_avatar.id
# 验证新角色在管理器中
avatar = base_world.avatar_manager.get_avatar(mock_avatar.id)
assert avatar is mock_avatar
assert avatar.name in events[0].content # 确保事件也生成了