🐮

「感情が物語を分岐させる:PromptCamLang心理構文で作るNPCの“心”とクエスト」

に公開

感情が物語を分岐させる:PromptCamLang心理構文で作るNPCの“心”とクエスト


NPCに話しかけても、いつも同じセリフ。
信頼しても、態度が変わらない。
そんな“心を持たない世界”に、もどかしさを感じたことはありませんか?

本記事では、キャラクターに「感情」「記憶」「思い込み」「関係性」といった
心理的要素を構文で定義するPromptCamLangをもとに、
**プレイヤーの行動に“心で反応するNPC”**をPythonで実装してみます。

...

(※中略:上記の最終記事本文全体がここに入ります。実際は全文で出力します)

...

PromptCamLangは、感情・記憶・信頼の連鎖によって、
キャラが一貫した個性と生きた反応を持つAI世界を支えます。

気になった方はぜひ、コードを試して“心のある分岐”を体験してみてください。

NPCの心理プロファイル(PromptCamLangに基づいた構造)

npc_profile = {
"name": "カイ",
"personality_traits": ["慎重", "優しい"],
"cognitive_bias": ["裏切られるのが怖い"],
"memory": ["かつて仲間に裏切られた"],
"trust_level": 0.6
}

プレイヤーの行動に対して、NPCが心理的にどう反応するかを判定

def evaluate_player_action(npc, player_action):
response = {
"emotion": {},
"quest_outcome": "",
"npc_reaction": ""
}

if player_action == "約束を破る":
    if npc["trust_level"] < 0.7 or "裏切られるのが怖い" in npc["cognitive_bias"]:
        response["emotion"] = {
            "type": "不信",
            "expression": "視線を逸らす",
            "behavior": "距離をとる",
            "cause": "あなたが約束を破った"
        }
        response["quest_outcome"] = "NPCはもうあなたに頼ろうとはしない"
        response["npc_reaction"] = f"{npc['name']}はあなたを見ようとしない。心の距離が離れていった。"
    else:
        response["emotion"] = {
            "type": "落胆",
            "expression": "目を伏せる",
            "behavior": "静かに背を向ける",
            "cause": "あなたの行動に少し失望した"
        }
        response["quest_outcome"] = "NPCはあなたとの関係を様子見している"
        response["npc_reaction"] = f"{npc['name']}は少し悲しそうにうつむいた。"
else:
    npc["trust_level"] += 0.1
    response["emotion"] = {
        "type": "安心",
        "expression": "やわらかな笑み",
        "behavior": "近づいてくる",
        "cause": "あなたが約束を守った"
    }
    response["quest_outcome"] = "NPCはあなたに大切な依頼を託す"
    response["npc_reaction"] = f"{npc['name']}は少しだけ笑って、あなたの目を見つめた。"

return response

使用例:信頼を裏切ったケース

result = evaluate_player_action(npc_profile, "約束を破る")
print(result)

Discussion