From e5d8bf9bf47e919d19f044aaef34612d9d09cb96 Mon Sep 17 00:00:00 2001 From: bridge Date: Wed, 24 Sep 2025 01:13:14 +0800 Subject: [PATCH] update (still bug remains) --- src/classes/action.py | 31 ++++++++++++++++++++----------- src/classes/avatar.py | 8 ++++++++ src/run/run.py | 23 ++++++++++++----------- src/sim/simulator.py | 8 +++++--- static/game_configs/persona.csv | 3 ++- 5 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/classes/action.py b/src/classes/action.py index 5cf369e..a388da6 100644 --- a/src/classes/action.py +++ b/src/classes/action.py @@ -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境界足够的植物中随机选择一种 diff --git a/src/classes/avatar.py b/src/classes/avatar.py index 9fffe61..26a7a66 100644 --- a/src/classes/avatar.py +++ b/src/classes/avatar.py @@ -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]: diff --git a/src/run/run.py b/src/run/run.py index 532c498..7203fe2 100644 --- a/src/run/run.py +++ b/src/run/run.py @@ -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 diff --git a/src/sim/simulator.py b/src/sim/simulator.py index 2e68708..27f415a 100644 --- a/src/sim/simulator.py +++ b/src/sim/simulator.py @@ -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()}岁") diff --git a/static/game_configs/persona.csv b/static/game_configs/persona.csv index 59be27d..add8edb 100644 --- a/static/game_configs/persona.csv +++ b/static/game_configs/persona.csv @@ -17,4 +17,5 @@ id,name,exclusion_ids,prompt 15,好斗,11;14;10;17,你是一个好斗的人,你直面冲突,偏好以力量与对抗解决问题,越挫越勇。 16,鲁莽,1;9;10,你是一个鲁莽的人,你行事冲动、少考虑后果,常凭直觉立刻行动。 17,胆小,4;15;12,你是一个胆小的人,你谨小慎微,容易畏惧风险,倾向回避正面冲突。 -18,霸道,11;17,你是一个霸道的人,你行事强势,不讲道理,习惯以自己的利益为先,倾向多吃多占、压人一步,对他人的反对不以为意。 \ No newline at end of file +18,霸道,11;17,你是一个霸道的人,你行事强势,不讲道理,习惯以自己的利益为先,倾向多吃多占、压人一步,对他人的反对不以为意。 +19,修行痴迷,2;3;5,你是一个对修行极度痴迷的人,你将绝大多数时间用于修炼,厌恶与修行无关的社交与享乐。