add sect ranks

This commit is contained in:
bridge
2025-11-08 02:42:28 +08:00
parent eb0dde2e5c
commit d8cb9389fb
6 changed files with 536 additions and 20 deletions

165
tests/test_sect_ranks.py Normal file
View File

@@ -0,0 +1,165 @@
"""
测试宗门等级系统
"""
import pytest
from src.classes.cultivation import CultivationProgress, Realm
from src.classes.sect_ranks import (
SectRank,
get_rank_from_realm,
get_rank_display_name,
should_auto_promote,
)
from src.classes.sect import sects_by_name
from src.classes.world import World
from src.classes.map import Map
from src.classes.calendar import MonthStamp
from src.sim.new_avatar import make_avatars
def test_rank_from_realm():
"""测试境界到宗门职位的映射"""
assert get_rank_from_realm(Realm.Qi_Refinement) == SectRank.OuterDisciple
assert get_rank_from_realm(Realm.Foundation_Establishment) == SectRank.InnerDisciple
assert get_rank_from_realm(Realm.Core_Formation) == SectRank.Elder
assert get_rank_from_realm(Realm.Nascent_Soul) == SectRank.Patriarch
def test_rank_display_name():
"""测试职位显示名称"""
assert get_rank_display_name(SectRank.Patriarch) == "掌门"
assert get_rank_display_name(SectRank.Elder) == "长老"
assert get_rank_display_name(SectRank.InnerDisciple) == "内门弟子"
assert get_rank_display_name(SectRank.OuterDisciple) == "外门弟子"
def test_rank_comparison():
"""测试职位比较"""
assert SectRank.Patriarch > SectRank.Elder
assert SectRank.Elder > SectRank.InnerDisciple
assert SectRank.InnerDisciple > SectRank.OuterDisciple
assert SectRank.OuterDisciple < SectRank.Patriarch
def test_auto_promote():
"""测试自动晋升逻辑"""
assert should_auto_promote(Realm.Qi_Refinement, Realm.Foundation_Establishment) == True
assert should_auto_promote(Realm.Foundation_Establishment, Realm.Core_Formation) == True
assert should_auto_promote(Realm.Core_Formation, Realm.Nascent_Soul) == True
assert should_auto_promote(Realm.Qi_Refinement, Realm.Qi_Refinement) == False
def test_avatar_sect_rank_assignment():
"""测试avatar创建时宗门职位分配"""
from src.run.create_map import create_cultivation_world_map
game_map = create_cultivation_world_map()
world = World(
map=game_map,
month_stamp=MonthStamp(100 * 12),
)
# 创建多个avatar
avatars_dict = make_avatars(world, count=20, current_month_stamp=MonthStamp(100 * 12))
avatars = list(avatars_dict.values())
# 检查所有有宗门的avatar都有职位
for avatar in avatars:
if avatar.sect is not None:
assert avatar.sect_rank is not None, f"{avatar.name} 有宗门但没有职位"
# 职位应该匹配境界
expected_rank = get_rank_from_realm(avatar.cultivation_progress.realm)
# 如果不是预期职位,只可能是元婴修士被降为长老(因为掌门唯一性)
if avatar.sect_rank != expected_rank:
assert avatar.cultivation_progress.realm == Realm.Nascent_Soul
assert avatar.sect_rank == SectRank.Elder
else:
assert avatar.sect_rank is None, f"{avatar.name} 散修不应该有职位"
def test_patriarch_uniqueness():
"""测试每个宗门只有一个掌门"""
from src.run.create_map import create_cultivation_world_map
game_map = create_cultivation_world_map()
world = World(
map=game_map,
month_stamp=MonthStamp(100 * 12),
)
# 创建足够多的avatar
avatars_dict = make_avatars(world, count=50, current_month_stamp=MonthStamp(100 * 12))
avatars = list(avatars_dict.values())
# 统计每个宗门的掌门数量
sect_patriarchs = {}
for avatar in avatars:
if avatar.sect is not None and avatar.sect_rank == SectRank.Patriarch:
sect_id = avatar.sect.id
if sect_id not in sect_patriarchs:
sect_patriarchs[sect_id] = []
sect_patriarchs[sect_id].append(avatar.name)
# 确保每个宗门最多只有一个掌门
for sect_id, patriarchs in sect_patriarchs.items():
assert len(patriarchs) <= 1, f"宗门 {sect_id} 有多个掌门: {patriarchs}"
def test_sect_str_display():
"""测试宗门信息显示"""
from src.run.create_map import create_cultivation_world_map
game_map = create_cultivation_world_map()
world = World(
map=game_map,
month_stamp=MonthStamp(100 * 12),
)
avatars_dict = make_avatars(world, count=20, current_month_stamp=MonthStamp(100 * 12))
avatars = list(avatars_dict.values())
for avatar in avatars:
sect_str = avatar.get_sect_str()
if avatar.sect is None:
assert sect_str == "散修"
else:
# 应该包含宗门名
assert avatar.sect.name in sect_str
# 应该包含职位名
if avatar.sect_rank is not None:
rank_name = get_rank_display_name(avatar.sect_rank, avatar.sect)
assert rank_name in sect_str
def test_cultivation_breakthrough_promotion():
"""测试突破境界后自动晋升"""
from src.run.create_map import create_cultivation_world_map
game_map = create_cultivation_world_map()
world = World(
map=game_map,
month_stamp=MonthStamp(100 * 12),
)
avatars_dict = make_avatars(world, count=10, current_month_stamp=MonthStamp(100 * 12))
avatars = list(avatars_dict.values())
# 找一个练气期的宗门弟子
target_avatar = None
for avatar in avatars:
if avatar.sect is not None and avatar.cultivation_progress.realm == Realm.Qi_Refinement:
target_avatar = avatar
break
if target_avatar is not None:
# 记录原职位
old_rank = target_avatar.sect_rank
assert old_rank == SectRank.OuterDisciple
# 突破到筑基
target_avatar.cultivation_progress.level = 31 # 筑基初期
target_avatar.update_cultivation(31)
# 检查职位是否晋升
assert target_avatar.sect_rank == SectRank.InnerDisciple
assert target_avatar.sect_rank > old_rank
if __name__ == "__main__":
pytest.main([__file__, "-v"])