This commit is contained in:
bridge
2025-10-02 23:04:15 +08:00
parent bdb1d7fec7
commit 2ad784dd24
5 changed files with 49 additions and 30 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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