This commit is contained in:
bridge
2025-08-23 21:45:05 +08:00
parent f72bccf0d3
commit a94ea2bd8b
10 changed files with 353 additions and 56 deletions

View File

@@ -2,6 +2,9 @@ from __future__ import annotations
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING
from src.classes.essence import Essence, EssenceType
from src.classes.root import Root, corres_essence_type
if TYPE_CHECKING:
from src.classes.avatar import Avatar
from src.classes.world import World
@@ -58,4 +61,26 @@ class Move(DefineAction):
self.avatar.tile = target_tile
else:
# 超出边界不改变位置与tile
pass
pass
class Cultivate(DefineAction):
"""
修炼动作,可以增加修仙进度。
"""
def execute(self, root: Root, essence: Essence):
"""
修炼
获得的exp增加取决于essence的对应灵根的大小。
"""
essence_type = corres_essence_type[root]
essence_density = essence.get_density(essence_type)
exp = self.get_exp(essence_density)
self.avatar.cultivation_progress.add_exp(exp)
def get_exp(self, essence_density: int) -> int:
"""
根据essence的密度计算获得的exp。
公式为base * essence_density
"""
base = 100
return base * essence_density

65
src/classes/age.py Normal file
View File

@@ -0,0 +1,65 @@
import random
from src.classes.cultivation import Realm
class Age:
"""
角色寿命管理
基于境界计算期望寿命,超过期望寿命后有概率老死
"""
# 各境界的基础期望寿命(年)
# REALM_LIFESPAN = {
# Realm.Qi_Refinement: 100, # 练气期100年
# Realm.Foundation_Establishment: 200, # 筑基期200年
# Realm.Core_Formation: 500, # 金丹期500年
# Realm.Nascent_Soul: 1000, # 元婴期1000年
# }
REALM_LIFESPAN = {
Realm.Qi_Refinement: 50, # 练气期100年
Realm.Foundation_Establishment: 60, # 筑基期200年
Realm.Core_Formation: 70, # 金丹期500年
Realm.Nascent_Soul: 80, # 元婴期1000年
}
def __init__(self, age: int):
self.age = age
def get_age(self) -> int:
"""获取当前年龄"""
return self.age
def get_expected_lifespan(self, realm: Realm) -> int:
"""获取期望寿命"""
return self.REALM_LIFESPAN.get(realm, 100)
def get_death_probability(self, realm: Realm) -> float:
"""
计算当月老死的概率
返回:
老死概率范围0.0-0.1
"""
if self.age < self.get_expected_lifespan(realm):
return 0.0
# 超过期望寿命的年数
years_over_lifespan = self.age - self.get_expected_lifespan(realm)
# 基础概率每超过1年增加0.01的概率
death_probability = min(years_over_lifespan * 0.01, 0.1)
return death_probability
def death_by_old_age(self, realm: Realm) -> bool:
"""
判断是否老死
"""
return random.random() < self.get_death_probability(realm)
def __str__(self) -> str:
"""返回年龄的字符串表示"""
return str(self.age)
def __repr__(self) -> str:
"""返回年龄的详细字符串表示"""
return f"Age({self.age})"

View File

@@ -7,8 +7,9 @@ from src.classes.calendar import Month, Year
from src.classes.action import Action
from src.classes.world import World
from src.classes.tile import Tile
from src.classes.cultivation import CultivationProgress
from src.classes.cultivation import CultivationProgress, Realm
from src.classes.root import Root
from src.classes.age import Age
from src.utils.strings import to_snake_case
class Gender(Enum):
@@ -34,7 +35,7 @@ class Avatar:
id: int
birth_month: Month
birth_year: Year
age: int
age: Age
gender: Gender
cultivation_progress: CultivationProgress = field(default_factory=lambda: CultivationProgress(0))
pos_x: int = 0
@@ -74,4 +75,43 @@ class Avatar:
决定做什么。
"""
# 目前只做一个事情,就是随机移动。
return "Move", {"delta_x": random.randint(-1, 1), "delta_y": random.randint(-1, 1)}
return "Move", {"delta_x": random.randint(-1, 1), "delta_y": random.randint(-1, 1)}
def update_cultivation(self, new_level: int):
"""
更新修仙进度,并在境界提升时更新寿命
"""
old_realm = self.cultivation_progress.realm
self.cultivation_progress.level = new_level
self.cultivation_progress.realm = self.cultivation_progress.get_realm(new_level)
# 如果境界提升了,更新寿命期望
if self.cultivation_progress.realm != old_realm:
self.age.update_realm(self.cultivation_progress.realm)
def death_by_old_age(self) -> bool:
"""
检查是否老死
返回:
如果老死返回True否则返回False
"""
return self.age.death_by_old_age(self.cultivation_progress.realm)
def get_age_info(self) -> dict:
"""
获取年龄相关信息
返回:
包含年龄、期望寿命、死亡概率等信息的字典
"""
current_age, expected_lifespan = self.age.get_lifespan_progress()
death_probability = self.age.get_death_probability()
return {
"current_age": round(current_age, 2),
"expected_lifespan": expected_lifespan,
"is_elderly": self.age.is_elderly(),
"death_probability": round(death_probability, 4),
"realm": self.cultivation_progress.realm.value
}

View File

@@ -1,6 +1,4 @@
from enum import Enum
from dataclasses import dataclass
class Month(Enum):
JANUARY = 1
@@ -16,6 +14,12 @@ class Month(Enum):
NOVEMBER = 11
DECEMBER = 12
def __str__(self) -> str:
return str(self.value)
def __repr__(self) -> str:
return str(self.value)
class Year(int):
def __add__(self, other: int) -> 'Year':
return Year(int(self) + other)

View File

@@ -65,7 +65,7 @@ class CultivationProgress:
def get_exp_required(self, target_level: int) -> int:
"""
计算升级到指定等级需要的经验值
使用指数增长公式base_exp * (growth_rate ^ level) * realm_multiplier
使用简单的代数加法base_exp + (level - 1) * increment + realm_bonus
参数:
target_level: 目标等级
@@ -77,13 +77,15 @@ class CultivationProgress:
return 0
base_exp = 100 # 基础经验值
growth_rate = 1.15 # 每级增长15%
increment = 50 # 每级增加50点经验值
# 境界加成倍数每跨越一个境界经验需求增加50%
realm_multiplier = 1 + (target_level // 30) * 0.5
# 基础经验值计算
exp_required = base_exp + (target_level - 1) * increment
exp_required = int(base_exp * (growth_rate ** target_level) * realm_multiplier)
return exp_required
# 境界加成每跨越一个境界额外增加1000点经验值
realm_bonus = (target_level // 30) * 1000
return exp_required + realm_bonus
def can_level_up(self) -> bool:
"""

View File

@@ -1,17 +1,28 @@
"""
灵根
目前只有五行灵根,金木水火土。
目前只有五行金木水火土。
其实和EssenceType很类似
但是单独拿出来是因为,之后可能整特殊的复杂灵根
所以这里单独定义一个Root类用来描述灵根。
"""
from enum import Enum
from src.classes.essence import EssenceType
class Root(Enum):
"""
灵根
"""
Metal = ""
Wood = ""
Water = ""
Fire = ""
Earth = ""
GOLD = ""
WOOD = ""
WATER = ""
FIRE = ""
EARTH = ""
corres_essence_type = {
Root.GOLD: EssenceType.GOLD,
Root.WOOD: EssenceType.WOOD,
Root.WATER: EssenceType.WATER,
Root.FIRE: EssenceType.FIRE,
Root.EARTH: EssenceType.EARTH,
}