add hp mp
This commit is contained in:
@@ -11,6 +11,7 @@ from src.classes.region import Region, CultivateRegion, NormalRegion, CityRegion
|
||||
from src.classes.event import Event, NULL_EVENT
|
||||
from src.classes.item import Item, items_by_name
|
||||
from src.classes.prices import prices
|
||||
from src.classes.hp_and_mp import HP_MAX_BY_REALM, MP_MAX_BY_REALM
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.classes.avatar import Avatar
|
||||
@@ -298,7 +299,33 @@ class Breakthrough(DefineAction, ActualActionMixin):
|
||||
assert self.avatar.cultivation_progress.can_break_through()
|
||||
success_rate = self.calc_success_rate()
|
||||
if random.random() < success_rate:
|
||||
old_realm = self.avatar.cultivation_progress.realm
|
||||
self.avatar.cultivation_progress.break_through()
|
||||
new_realm = self.avatar.cultivation_progress.realm
|
||||
|
||||
# 突破成功时更新HP和MP的最大值
|
||||
if new_realm != old_realm:
|
||||
self._update_hp_mp_on_breakthrough(new_realm)
|
||||
|
||||
def _update_hp_mp_on_breakthrough(self, new_realm):
|
||||
"""
|
||||
突破境界时更新HP和MP的最大值并完全恢复
|
||||
|
||||
Args:
|
||||
new_realm: 新的境界
|
||||
"""
|
||||
new_max_hp = HP_MAX_BY_REALM.get(new_realm, 100)
|
||||
new_max_mp = MP_MAX_BY_REALM.get(new_realm, 100)
|
||||
|
||||
# 计算增加的最大值
|
||||
hp_increase = new_max_hp - self.avatar.hp.max
|
||||
mp_increase = new_max_mp - self.avatar.mp.max
|
||||
|
||||
# 更新最大值并恢复相应的当前值
|
||||
self.avatar.hp.add_max(hp_increase)
|
||||
self.avatar.hp.recover(hp_increase) # 突破时完全恢复HP
|
||||
self.avatar.mp.add_max(mp_increase)
|
||||
self.avatar.mp.recover(mp_increase) # 突破时完全恢复MP
|
||||
|
||||
def get_event(self) -> Event:
|
||||
"""
|
||||
|
||||
@@ -18,6 +18,7 @@ from src.classes.typings import ACTION_NAME, ACTION_PARAMS, ACTION_PAIR, ACTION_
|
||||
from src.classes.persona import Persona, personas_by_id
|
||||
from src.classes.item import Item
|
||||
from src.classes.magic_stone import MagicStone
|
||||
from src.classes.hp_and_mp import HP, MP, HP_MAX_BY_REALM, MP_MAX_BY_REALM
|
||||
from src.utils.id_generator import get_avatar_id
|
||||
from src.utils.config import CONFIG
|
||||
|
||||
@@ -62,12 +63,20 @@ class Avatar:
|
||||
objective: str = ""
|
||||
magic_stone: MagicStone = field(default_factory=lambda: MagicStone(0)) # 灵石,即货币
|
||||
items: dict[Item, int] = field(default_factory=dict)
|
||||
hp: HP = field(default_factory=lambda: HP(0, 0)) # 将在__post_init__中初始化
|
||||
mp: MP = field(default_factory=lambda: MP(0, 0)) # 将在__post_init__中初始化
|
||||
|
||||
def __post_init__(self):
|
||||
"""
|
||||
在Avatar创建后自动初始化tile
|
||||
在Avatar创建后自动初始化tile和HP/MP
|
||||
"""
|
||||
self.tile = self.world.map.get_tile(self.pos_x, self.pos_y)
|
||||
|
||||
# 根据当前境界初始化HP和MP
|
||||
max_hp = HP_MAX_BY_REALM.get(self.cultivation_progress.realm, 100)
|
||||
max_mp = MP_MAX_BY_REALM.get(self.cultivation_progress.realm, 100)
|
||||
self.hp = HP(max_hp, max_hp)
|
||||
self.mp = MP(max_mp, max_mp)
|
||||
|
||||
def __hash__(self) -> int:
|
||||
return hash(self.id)
|
||||
@@ -77,7 +86,7 @@ class Avatar:
|
||||
获取avatar的详细信息
|
||||
尽量多打一些,因为会用来给LLM进行决策
|
||||
"""
|
||||
return f"Avatar(id={self.id}, 性别={self.gender}, 年龄={self.age}, name={self.name}, 区域={self.tile.region.name}, 灵根={self.root.value}, 境界={self.cultivation_progress})"
|
||||
return f"Avatar(id={self.id}, 性别={self.gender}, 年龄={self.age}, name={self.name}, 区域={self.tile.region.name}, 灵根={self.root.value}, 境界={self.cultivation_progress}, HP={self.hp}, MP={self.mp})"
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.get_info()
|
||||
|
||||
88
src/classes/hp_and_mp.py
Normal file
88
src/classes/hp_and_mp.py
Normal file
@@ -0,0 +1,88 @@
|
||||
from dataclasses import dataclass
|
||||
|
||||
from src.classes.cultivation import Realm
|
||||
|
||||
@dataclass
|
||||
class HP:
|
||||
"""
|
||||
血量。
|
||||
会因为战斗,天灾或者其他原因降低cur。
|
||||
会随时间或者服用丹药等补充cur。
|
||||
会因为突破境界,服用丹药等增加max。
|
||||
"""
|
||||
max: int
|
||||
cur: int
|
||||
|
||||
def reduce(self, value_2_reduce:int) -> bool:
|
||||
self.cur -= value_2_reduce
|
||||
is_alive = True
|
||||
if self.cur < 0:
|
||||
is_alive = False
|
||||
return is_alive
|
||||
|
||||
def recover(self, value_2_recover:int) -> bool:
|
||||
self.cur += value_2_recover
|
||||
if self.cur > self.max:
|
||||
self.cur = self.max
|
||||
return True
|
||||
|
||||
def add_max(self, value_2_add:int) -> bool:
|
||||
self.max += value_2_add
|
||||
return True
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"{self.cur}/{self.max}"
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return self.__str__()
|
||||
|
||||
HP_MAX_BY_REALM = {
|
||||
Realm.Qi_Refinement: 100,
|
||||
Realm.Foundation_Establishment: 200,
|
||||
Realm.Core_Formation: 300,
|
||||
Realm.Nascent_Soul: 400,
|
||||
}
|
||||
|
||||
|
||||
@dataclass
|
||||
class MP:
|
||||
"""
|
||||
灵力
|
||||
会因为战斗而消耗cur。
|
||||
会随时间或者服用丹药等补充cur。
|
||||
会因为突破境界,服用丹药等增加max。
|
||||
"""
|
||||
max: int
|
||||
cur: int
|
||||
|
||||
def can_cast(self, value_2_cast:int) -> bool:
|
||||
return self.cur >= value_2_cast
|
||||
|
||||
def reduce(self, value_2_reduce:int) -> bool:
|
||||
self.cur -= value_2_reduce
|
||||
if self.cur < 0:
|
||||
self.cur = 0
|
||||
return True
|
||||
|
||||
def recover(self, value_2_recover:int) -> bool:
|
||||
self.cur += value_2_recover
|
||||
if self.cur > self.max:
|
||||
self.cur = self.max
|
||||
return True
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"{self.cur}/{self.max}"
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return self.__str__()
|
||||
|
||||
def add_max(self, value_2_add:int) -> bool:
|
||||
self.max += value_2_add
|
||||
return True
|
||||
|
||||
MP_MAX_BY_REALM = {
|
||||
Realm.Qi_Refinement: 100,
|
||||
Realm.Foundation_Establishment: 200,
|
||||
Realm.Core_Formation: 300,
|
||||
Realm.Nascent_Soul: 400,
|
||||
}
|
||||
Reference in New Issue
Block a user