236 lines
7.4 KiB
Python
236 lines
7.4 KiB
Python
from enum import Enum
|
||
from functools import total_ordering
|
||
|
||
@total_ordering
|
||
class Realm(Enum):
|
||
Qi_Refinement = "练气"
|
||
Foundation_Establishment = "筑基"
|
||
Core_Formation = "金丹"
|
||
Nascent_Soul = "元婴"
|
||
|
||
@classmethod
|
||
def from_id(cls, realm_id: int) -> "Realm":
|
||
order: tuple[Realm, ...] = (
|
||
cls.Qi_Refinement,
|
||
cls.Foundation_Establishment,
|
||
cls.Core_Formation,
|
||
cls.Nascent_Soul,
|
||
)
|
||
index = realm_id - 1
|
||
if index < 0 or index >= len(order):
|
||
raise ValueError(f"Unknown realm_id: {realm_id}")
|
||
return order[index]
|
||
|
||
def __lt__(self, other):
|
||
if not isinstance(other, Realm):
|
||
return NotImplemented
|
||
order: tuple[Realm, ...] = (
|
||
Realm.Qi_Refinement,
|
||
Realm.Foundation_Establishment,
|
||
Realm.Core_Formation,
|
||
Realm.Nascent_Soul,
|
||
)
|
||
return order.index(self) < order.index(other)
|
||
|
||
class Stage(Enum):
|
||
Early_Stage = "前期"
|
||
Middle_Stage = "中期"
|
||
Late_Stage = "后期"
|
||
|
||
LEVELS_PER_REALM = 30
|
||
LEVELS_PER_STAGE = 10
|
||
|
||
REALM_TO_MOVE_STEP = {
|
||
Realm.Qi_Refinement: 2,
|
||
Realm.Foundation_Establishment: 3,
|
||
Realm.Core_Formation: 4,
|
||
Realm.Nascent_Soul: 5,
|
||
}
|
||
|
||
class CultivationProgress:
|
||
"""
|
||
修仙进度(包含等级、境界和经验值)
|
||
目前一个四个大境界,每个境界分前期、中期、后期。每一期对应10级。
|
||
所以每一个境界对应30级。境界的级别满了之后,需要突破才能进入下一个境界与升级。
|
||
所以有:
|
||
练气(Qi Refinement):前期(1-10)、中期(11-20)、后期(21-30)、突破(31)
|
||
筑基(Foundation Establishment):前期(31-40)、中期(41-50)、后期(51-60)、突破(61)
|
||
金丹(Core Formation):前期(61-70)、中期(71-80)、后期(81-90)、突破(91)
|
||
元婴(Nascent Soul):前期(91-100)、中期(101-110)、后期(111-120)、突破(121)
|
||
"""
|
||
|
||
def __init__(self, level: int, exp: int = 0):
|
||
self.level = level
|
||
self.exp = exp
|
||
self.realm = self.get_realm(level)
|
||
self.stage = self.get_stage(level)
|
||
|
||
def get_realm(self, level: int) -> Realm:
|
||
"""获取境界(算术推导,不依赖映射表)"""
|
||
if level <= 0:
|
||
return Realm.Qi_Refinement
|
||
realm_index = (level - 1) // LEVELS_PER_REALM # 0-based index
|
||
order: tuple[Realm, ...] = (
|
||
Realm.Qi_Refinement,
|
||
Realm.Foundation_Establishment,
|
||
Realm.Core_Formation,
|
||
Realm.Nascent_Soul,
|
||
)
|
||
return order[min(realm_index, len(order) - 1)]
|
||
|
||
def get_stage(self, level: int) -> Stage:
|
||
"""获取阶段(算术推导:1-10前期,11-20中期,21-30后期)"""
|
||
if level <= 0:
|
||
return Stage.Early_Stage
|
||
stage_index = ((level - 1) % LEVELS_PER_REALM) // LEVELS_PER_STAGE
|
||
order: tuple[Stage, ...] = (
|
||
Stage.Early_Stage,
|
||
Stage.Middle_Stage,
|
||
Stage.Late_Stage,
|
||
)
|
||
return order[min(stage_index, len(order) - 1)]
|
||
|
||
def get_move_step(self) -> int:
|
||
"""
|
||
每月能够移动的距离,
|
||
练气,筑基为1
|
||
金丹,元婴为2
|
||
"""
|
||
return REALM_TO_MOVE_STEP[self.realm]
|
||
|
||
def __str__(self) -> str:
|
||
return self.get_info()
|
||
|
||
def get_info(self) -> str:
|
||
can_break_through = self.can_break_through()
|
||
can_break_through_str = "可以突破" if can_break_through else "不可以突破"
|
||
return f"{self.realm.value}{self.stage.value}({self.level}级){can_break_through_str}"
|
||
|
||
def get_detailed_info(self) -> str:
|
||
return self.get_info()
|
||
|
||
def get_exp_required(self) -> int:
|
||
"""
|
||
计算升级到指定等级需要的经验值
|
||
使用简单的代数加法:base_exp + (level - 1) * increment + realm_bonus
|
||
|
||
参数:
|
||
target_level: 目标等级
|
||
|
||
返回:
|
||
需要的经验值
|
||
"""
|
||
next_level = self.level + 1
|
||
|
||
base_exp = 100 # 基础经验值
|
||
increment = 50 # 每级增加50点经验值
|
||
|
||
# 基础经验值计算
|
||
exp_required = base_exp + (next_level - 1) * increment
|
||
|
||
# 境界加成:按 next_level 所处境界(延后入境界,算术推导)增加
|
||
realm_index = (max(1, next_level) - 1) // LEVELS_PER_REALM
|
||
realm_bonus = realm_index * 1000
|
||
|
||
return exp_required + realm_bonus
|
||
|
||
def get_exp_progress(self) -> tuple[int, int]:
|
||
"""
|
||
获取当前经验值进度
|
||
|
||
返回:
|
||
(当前经验值, 升级所需经验值)
|
||
"""
|
||
required_exp = self.get_exp_required()
|
||
return self.exp, required_exp
|
||
|
||
def add_exp(self, exp_amount: int) -> bool:
|
||
"""
|
||
增加经验值
|
||
|
||
参数:
|
||
exp_amount: 要增加的经验值数量
|
||
|
||
返回:
|
||
如果升级了则返回True
|
||
"""
|
||
self.exp += exp_amount
|
||
|
||
leveled_up = False
|
||
# 支持多级升级,但在瓶颈(30/60/90…)停下,等待突破
|
||
while True:
|
||
# 瓶颈位:level > 0 且 level % LEVELS_PER_REALM == 0
|
||
if self.is_in_bottleneck():
|
||
break
|
||
if not self.is_level_up():
|
||
break
|
||
required_exp = self.get_exp_required()
|
||
self.exp -= required_exp
|
||
self.level += 1
|
||
self.realm = self.get_realm(self.level)
|
||
self.stage = self.get_stage(self.level)
|
||
leveled_up = True
|
||
if self.is_in_bottleneck():
|
||
break
|
||
|
||
return leveled_up
|
||
|
||
def break_through(self):
|
||
"""
|
||
突破境界
|
||
"""
|
||
self.level += 1
|
||
self.realm = self.get_realm(self.level)
|
||
self.stage = self.get_stage(self.level)
|
||
|
||
def is_in_bottleneck(self) -> bool:
|
||
"""
|
||
是否处于瓶颈期。
|
||
处于每个大境界的第 30、60、90…级时(level > 0 且 level % LEVELS_PER_REALM == 0)。
|
||
"""
|
||
return self.level > 0 and (self.level % LEVELS_PER_REALM == 0)
|
||
|
||
def can_break_through(self) -> bool:
|
||
"""
|
||
检查是否可以突破
|
||
"""
|
||
return self.is_in_bottleneck()
|
||
|
||
def can_cultivate(self) -> bool:
|
||
"""
|
||
检查是否可以修炼
|
||
可以突破,说明到顶了,说明不能修炼了,必须突破后才能正常修炼。
|
||
"""
|
||
return not self.is_in_bottleneck()
|
||
|
||
def is_level_up(self) -> bool:
|
||
"""
|
||
检查是否可以进入下一级
|
||
"""
|
||
exp_required = self.get_exp_required()
|
||
return self.exp >= exp_required
|
||
|
||
def __str__(self) -> str:
|
||
return f"{self.realm.value}{self.stage.value}({self.level}级)。在瓶颈期:{self.is_in_bottleneck()}"
|
||
|
||
def get_breakthrough_success_rate(self) -> float:
|
||
return breakthrough_success_rate_by_realm[self.realm]
|
||
|
||
def get_breakthrough_fail_reduce_lifespan(self) -> int:
|
||
return breakthrough_fail_reduce_lifespan_by_realm[self.realm]
|
||
|
||
|
||
|
||
breakthrough_success_rate_by_realm = {
|
||
Realm.Qi_Refinement: 0.8, # 练气,80%
|
||
Realm.Foundation_Establishment: 0.6, # 筑基,60%
|
||
Realm.Core_Formation: 0.4, # 金丹,40%
|
||
Realm.Nascent_Soul: 0.2, # 元婴,20%
|
||
}
|
||
|
||
breakthrough_fail_reduce_lifespan_by_realm = {
|
||
Realm.Qi_Refinement: 5,
|
||
Realm.Foundation_Establishment: 10,
|
||
Realm.Core_Formation: 15,
|
||
Realm.Nascent_Soul: 20,
|
||
} |