diff --git a/src/classes/action.py b/src/classes/action.py index b26c4c6..aabd08a 100644 --- a/src/classes/action.py +++ b/src/classes/action.py @@ -807,16 +807,10 @@ class Talk(DefineAction, ActualActionMixin): return Event(self.world.month_stamp, f"{self.avatar.name} 尝试与同区域的他人攀谈") def step(self) -> tuple[StepStatus, list[Event]]: - # 先找同tile对象 - same_tile_others = self._get_same_tile_others() - if not same_tile_others: - # 无同tile对象,本次作罢 - fail_event = Event(self.world.month_stamp, f"{self.avatar.name} 未在同一位置找到可攀谈之人") - self.avatar.add_event(fail_event) - return StepStatus.COMPLETED, [] + same_region_others = self._get_same_region_others() import random - target = random.choice(same_tile_others) + target = random.choice(same_region_others) # 进入交谈:由概率决定本次是否允许建立关系 from src.classes.mutual_action import Conversation diff --git a/src/front/events_panel.py b/src/front/events_panel.py index 1971671..b47d984 100644 --- a/src/front/events_panel.py +++ b/src/front/events_panel.py @@ -1,6 +1,29 @@ from typing import List +def _wrap_text_by_pixels(font, text: str, max_width_px: int) -> List[str]: + """ + 按像素宽度对单行文本进行硬换行,适配中英文混排(逐字符测量)。 + """ + if not text: + return [""] + lines: List[str] = [] + current = "" + for ch in str(text): + test = current + ch + w, _ = font.size(test) + if w <= max_width_px: + current = test + else: + if current: + lines.append(current) + # 新行从当前字符开始 + current = ch + if current: + lines.append(current) + return lines + + def draw_sidebar(pygame_mod, screen, colors, font, events: List[object], world_map, tile_size: int, margin: int, sidebar_width: int): sidebar_x = world_map.width * tile_size + margin * 2 @@ -23,15 +46,18 @@ def draw_sidebar(pygame_mod, screen, colors, font, events: List[object], (sidebar_x + sidebar_width - 10, line_y), 1) event_y = line_y + 15 - max_events = (screen.get_height() - event_y - margin) // 20 - recent_events = events[-max_events:] if len(events) > max_events else events - for event in reversed(recent_events): + # 预留左右边距各10px + usable_width = sidebar_width - 20 + # 从最新事件开始,逐条向下渲染,超出底部则停止 + for event in reversed(events): event_text = str(event) - if len(event_text) > 35: - event_text = event_text[:32] + "..." - event_surf = font.render(event_text, True, colors["event_text"]) - screen.blit(event_surf, (title_x, event_y)) - event_y += 20 + wrapped_lines = _wrap_text_by_pixels(font, event_text, usable_width) + for line in wrapped_lines: + event_surf = font.render(line, True, colors["event_text"]) + screen.blit(event_surf, (title_x, event_y)) + event_y += event_surf.get_height() + 2 + if event_y > screen.get_height() - margin: + break if event_y > screen.get_height() - margin: break diff --git a/src/run/run.py b/src/run/run.py index 1469675..3c7554c 100644 --- a/src/run/run.py +++ b/src/run/run.py @@ -89,18 +89,18 @@ def make_avatars(world: World, count: int = 12, current_month_stamp: MonthStamp # 随机分配阵营(正/邪) avatar.alignment = random.choice(list(Alignment)) 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: - # 师徒(有向):第5位是师傅,第6位是徒弟 - avatar_list[4].set_relation(avatar_list[5], Relation.MASTER) - if len(avatar_list) >= 8: - # 情侣 - avatar_list[6].set_relation(avatar_list[7], Relation.LOVERS) + # # —— 为演示添加少量示例关系 —— + # 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: + # # 师徒(有向):第5位是师傅,第6位是徒弟 + # avatar_list[4].set_relation(avatar_list[5], Relation.MASTER) + # if len(avatar_list) >= 8: + # # 情侣 + # avatar_list[6].set_relation(avatar_list[7], Relation.LOVERS) return avatars diff --git a/static/config.yml b/static/config.yml index 7537b84..35b29d9 100644 --- a/static/config.yml +++ b/static/config.yml @@ -24,5 +24,4 @@ avatar: # 社交相关配置 social: - # 攀谈触发关系的基础概率(仅“攀谈”驱动的交谈会尝试;直接“交谈”不会) talk_into_relation_probability: 0.1 \ No newline at end of file diff --git a/static/templates/talk.txt b/static/templates/talk.txt index 78aecfa..d4d2571 100644 --- a/static/templates/talk.txt +++ b/static/templates/talk.txt @@ -14,7 +14,7 @@ {avatar_name_2}: {{ "thinking": ..., // 简单思考应该怎么决策 "feedback": ... // 面对{avatar_name_1}的行为的合法feedback action name - "talk_content": ... // 如果返回的action为Talk,则输出对话的大概内容。为Reject则返回空str。 + "talk_content": ... // 如果返回的action为Talk,则输出双方交谈的主体与大体内容。 "into_relation": ... // 如果你认为可以让两者产生某种身份关系,则返回。注意这是{avatar_name_2}相对于{avatar_name_1}的身份。 }} }} \ No newline at end of file