update (still bug remains)

This commit is contained in:
bridge
2025-09-24 01:13:14 +08:00
parent 3c3724c997
commit e5d8bf9bf4
5 changed files with 47 additions and 26 deletions

View File

@@ -442,18 +442,27 @@ class Hunt(DefineAction, ActualActionMixin):
COMMENT = "在当前区域狩猎动物,获取动物材料"
DOABLES_REQUIREMENTS = "在有动物的普通区域且avatar的境界必须大于等于动物的境界"
PARAMS = {}
def get_available_animals(self) -> list[Animal]:
"""
获取avatar境界足够的动物
"""
region = self.avatar.tile.region
avatar_realm = self.avatar.cultivation_progress.realm
return [animal for animal in region.animals if avatar_realm >= animal.realm]
def _execute(self) -> None:
"""
执行狩猎动作
"""
region = self.avatar.tile.region
success_rate = self.get_success_rate()
available_animals = self.get_available_animals()
if len(available_animals) == 0:
# TODO: 我的doable检查有问题之后看看问题在哪里
return
if random.random() < success_rate:
# 成功狩猎从avatar境界足够的动物中随机选择一种
avatar_realm = self.avatar.cultivation_progress.realm
available_animals = [animal for animal in region.animals if avatar_realm >= animal.realm]
target_animal = random.choice(available_animals)
# 随机选择该动物的一种物品
item = random.choice(target_animal.items)
@@ -478,15 +487,12 @@ class Hunt(DefineAction, ActualActionMixin):
判断是否可以狩猎必须在有动物的普通区域且avatar的境界必须大于等于动物的境界
"""
region = self.avatar.tile.region
if not isinstance(region, NormalRegion) or len(region.animals) == 0:
if not isinstance(region, NormalRegion):
return False
# 检查avatar的境界是否足够狩猎区域内的动物
avatar_realm = self.avatar.cultivation_progress.realm
for animal in region.animals:
if avatar_realm >= animal.realm:
return True
return False
available_animals = self.get_available_animals()
if len(available_animals) == 0:
return False
return True
@long_action(step_month=6)
@@ -513,6 +519,9 @@ class Harvest(DefineAction, ActualActionMixin):
"""
success_rate = self.get_success_rate()
available_plants = self.get_available_plants()
if len(available_plants) == 0:
# TODO: 我的doable检查有问题之后看看问题在哪里
return
if random.random() < success_rate:
# 成功采集从avatar境界足够的植物中随机选择一种

View File

@@ -157,6 +157,13 @@ class Avatar:
return None
action_name, action_params = self.next_actions.pop(0)
action = self.create_action(action_name)
while not action.is_doable and self.next_actions:
action_name, action_params = self.next_actions.pop(0)
action = self.create_action(action_name)
if not action.is_doable:
return None
self.cur_action_pair = (action, action_params)
try:
event = action.get_event(**action_params)
@@ -185,6 +192,7 @@ class Avatar:
action = self.create_action(action_name)
doable = action.is_doable
assert isinstance(doable, bool)
del action
return doable
async def act(self) -> List[Event]:

View File

@@ -56,7 +56,8 @@ def make_avatars(world: World, count: int = 12, current_month_stamp: MonthStamp
name = get_random_name(gender)
# 随机生成level范围从0到120对应四个大境界
level = random.randint(0, 120)
# level = random.randint(0, 120)
level = 29
cultivation_progress = CultivationProgress(level)
# 创建Age实例传入年龄与当前境界
@@ -88,16 +89,16 @@ def make_avatars(world: World, count: int = 12, current_month_stamp: MonthStamp
avatars[avatar.id] = avatar
# —— 为演示添加少量示例关系 ——
avatar_list = list(avatars.values())
if len(avatar_list) >= 2:
avatar_list[0].set_relation(avatar_list[1], Relation.ENEMY)
if len(avatar_list) >= 4:
avatar_list[2].set_relation(avatar_list[3], Relation.FRIEND)
if len(avatar_list) >= 6:
# 师徒(随意指派方向,关系对称)
avatar_list[4].set_relation(avatar_list[5], Relation.MASTER_APPRENTICE)
if len(avatar_list) >= 8:
# 情侣
avatar_list[6].set_relation(avatar_list[7], Relation.LOVERS)
# if len(avatar_list) >= 2:
# avatar_list[0].set_relation(avatar_list[1], Relation.ENEMY)
# if len(avatar_list) >= 4:
# avatar_list[2].set_relation(avatar_list[3], Relation.FRIEND)
# if len(avatar_list) >= 6:
# # 师徒(随意指派方向,关系对称)
# avatar_list[4].set_relation(avatar_list[5], Relation.MASTER_APPRENTICE)
# if len(avatar_list) >= 8:
# # 情侣
# avatar_list[6].set_relation(avatar_list[7], Relation.LOVERS)
return avatars

View File

@@ -55,11 +55,13 @@ class Simulator:
# 结算角色行为
for avatar_id, avatar in self.world.avatar_manager.avatars.items():
new_events = []
if avatar.is_next_action_doable():
new_events = await avatar.act()
# 只在当前有动作时执行当前动作,不再检查“下一个动作”的可执行性
new_events = await avatar.act()
if new_events:
events.extend(new_events)
# 结算寿命逻辑
for avatar_id, avatar in self.world.avatar_manager.avatars.items():
if avatar.death_by_old_age():
death_avatar_ids.append(avatar_id)
event = Event(self.world.month_stamp, f"{avatar.name} 老死了,时年{avatar.age.get_age()}")