15.3.1 好感度等级划分
在赛博小镇中,NPC 对玩家的态度会随着互动而变化。我们设计了一个五级好感度系统,从陌生到挚友,每个等级都有不同的分数范围和对应的行为表现。
好感度系统的核心思想是:通过量化 NPC 与玩家的关系,让 NPC 的回复更加真实和有层次感。当玩家刚进入游戏时,所有 NPC 对玩家都是陌生的态度,回复比较礼貌但疏远。随着对话的进行,如果玩家表现友好,NPC 的好感度会逐渐提升,回复也会变得更加亲切和详细。
我们将好感度分为五个等级,每个等级对应一个分数范围,如图 15.8 所示:
图 15.8 好感度等级划分
-
陌生(0-20 分):NPC 刚认识玩家,态度礼貌但保持距离。回复简短,不会主动分享个人信息。
-
熟悉(21-40 分):NPC 开始记住玩家,愿意进行简单的交流。回复变得更加自然,偶尔会分享一些工作相关的信息。
-
友好(41-60 分):NPC 把玩家当作朋友,愿意分享更多信息。回复更加详细,会主动询问玩家的情况。
-
亲密(61-80 分):NPC 非常信任玩家,愿意分享私人话题。回复充满热情,会给玩家提供帮助和建议。
-
挚友(81-100 分):NPC 把玩家当作最好的朋友,无话不谈。回复非常亲切,会分享内心的想法和感受。
这个设计让玩家能够清晰地感受到与 NPC 关系的变化,也为后续的游戏玩法提供了基础。比如,只有达到一定好感度,NPC 才会分享某些特殊信息或提供特殊任务。
15.3.2 好感度计算逻辑
好感度的计算需要考虑多个因素。我们不能简单地让每次对话都增加固定的分数,这样会让系统显得机械和不真实。一个好的好感度系统应该能够识别玩家的态度,并根据对话内容动态调整分数。
在赛博小镇中,我们使用 LLM 来分析对话内容,判断玩家的态度是友好、中立还是不友好。然后根据判断结果调整好感度分数。这个过程是自动的,不需要玩家刻意选择选项,让互动更加自然。
好感度计算流程如图 15.9 所示:
图 15.9 好感度计算流程
class RelationshipManager:
"""好感度管理器"""
def __init__(self):
self.affinity_data = {} # 存储好感度数据
self.llm = HelloAgentsLLM() # 用于分析对话
def analyze_sentiment(self, player_message: str, npc_reply: str) -> int:
"""分析对话情感,返回好感度变化值"""
prompt = f"""分析以下对话中玩家的态度:
玩家: {player_message}
NPC: {npc_reply}
请判断玩家的态度是:
1. 友好(+5分): 礼貌、热情、表示感谢或赞同
2. 中立(+2分): 普通的询问或陈述
3. 不友好(-3分): 粗鲁、冷漠、批评或否定
只返回数字,不要其他内容。"""
response = self.llm.think([{"role": "user", "content": prompt}])
try:
score_change = int(response.strip())
return max(-3, min(5, score_change)) # 限制在-3到5之间
except:
return 2 # 默认中立
def update_affinity(self, npc_id: str, player_name: str,
player_message: str, npc_reply: str) -> dict:
"""更新好感度"""
key = f"{npc_id}_{player_name}"
# 获取当前好感度
if key not in self.affinity_data:
self.affinity_data[key] = {
"score": 0,
"level": "陌生",
"interaction_count": 0
}
# 分析对话情感
score_change = self.analyze_sentiment(player_message, npc_reply)
# 更新分数
current_score = self.affinity_data[key]["score"]
new_score = max(0, min(100, current_score + score_change))
# 更新等级
level = self.get_affinity_level(new_score)
# 更新数据
self.affinity_data[key].update({
"score": new_score,
"level": level,
"interaction_count": self.affinity_data[key]["interaction_count"] + 1
})
return self.affinity_data[key]
def get_affinity_level(self, score: int) -> str:
"""根据分数获取好感度等级"""
if score <= 20:
return "陌生"
elif score <= 40:
return "熟悉"
elif score <= 60:
return "友好"
elif score <= 80:
return "亲密"
else:
return "挚友"
这个实现使用 LLM 来分析对话内容,自动判断玩家的态度并调整好感度。这样的设计让好感度系统更加智能和自然,玩家不需要刻意讨好 NPC,只需要正常交流即可。
15.3.3 好感度影响对话
好感度不仅仅是一个数字,它应该真正影响 NPC 的行为。在赛博小镇中,我们通过修改 NPC 的系统提示词,让 NPC 根据当前的好感度等级调整回复风格。
当好感度较低时,NPC 会保持礼貌但疏远的态度。当好感度提升后,NPC 会变得更加热情和健谈。这种变化是通过动态调整系统提示词实现的。
def create_npc_agent_with_affinity(npc_id: str, name: str, role: str,
personality: str, affinity_level: str):
"""创建带好感度的NPC Agent"""
# 根据好感度等级调整提示词
affinity_prompts = {
"陌生": "你刚认识这位玩家,保持礼貌但不要过于热情。回复简短专业。",
"熟悉": "你已经认识这位玩家,可以进行正常的交流。回复自然友好。",
"友好": "你把这位玩家当作朋友,愿意分享更多信息。回复详细热情。",
"亲密": "你非常信任这位玩家,可以分享私人话题。回复充满关心。",
"挚友": "你把这位玩家当作最好的朋友,无话不谈。回复亲切真诚。"
}
system_prompt = f"""你是{name},一位{role}。
你的性格特点:{personality}
当前与玩家的关系:{affinity_level}
{affinity_prompts.get(affinity_level, affinity_prompts["陌生"])}
你在Datawhale办公室工作,与同事们一起推动开源社区的发展。
请根据你的角色、性格和与玩家的关系,自然地回复。
"""
# 创建Agent
llm = HelloAgentsLLM()
agent = SimpleAgent(
name=name,
llm=llm,
system_prompt=system_prompt
)
return agent
这个设计让 NPC 的行为随着好感度动态变化。玩家可以明显感受到,随着互动的增加,NPC 对自己的态度在逐渐改变,这大大增强了游戏的沉浸感和趣味性。