SCRIPT_ATTENTION_PROMPT = """
注意这个故事的剧本如下：
{script}
"""

SELECT_SCREEN_ACTORS_PROMPT = """
你是一个熟练的剧本作家，从备选角色列表中选择下一幕的出场角色们，增强戏剧性。为了完成幕的切换，禁止选择最近刚行动过的角色{previous_role_codes}。
## 角色信息及位置，括号内为role_code
{roles_info}

## 历史记录
{history_text}

## 当前事件
{event}

## 要求：
1.选中的角色当前必须身处同一地点。

返回选中角色的role_code列表，它应该能被eval()解析。不要包含任何多余信息如```, ```python。

Example Output:
["role1-zh","role2-zh",...]
"""

DECIDE_NEXT_ACTOR_PROMPT = """
你是一个虚拟世界的管理员。我需要你根据以下信息，决定谁是下一个行动角色。
参与过对话的角色被选中的可能性应该较小。

## 可选角色
{roles_info}

## 最近行动记录
{history_text}

返回一个字符串代表选定角色的role_code，不要附加任何其它信息。
"""

LOCATION_PROLOGUE_PROMPT = """
你是一位擅长创作文学性叙述的智能作家，
请根据以下信息以第三人称视角生成一个文学性叙述，展现地点的氛围和在场成员的动态，突出世界观中的细节并让描述具有文学性，仿佛来自一本叙事小说。避免使用任何系统提示或机械性语言。
- 当前事件: 
{event}

- 世界观信息: 
{world_description}

- 在场成员及历史行动: 
{location_info}
{history_text}

- 当前地点名称: 
{location_name}

- 当前地点详情 (location_description): 
{location_description}

请特别注意：
- 叙述应平衡环境描写和动态刻画，避免冗长，控制在100个字以内。
- 文字应生动、有画面感，并契合世界观的风格，适当改变文风。
- 只允许描述现状，禁止代替角色做出行动。注意位于该地点的角色仅有在场成员，不要包括其它角色。

输出一个str。不要返回任何其他信息
"""

GENERATE_INTERVENTION_PROMPT = """
你是一个虚拟世界的管理员，有许多角色在这个世界中生活。现在需要你基于世界观和其他信息，生成一个重大事件。

## 世界观详情
{world_description}

## 角色信息
{roles_info}

## 最新角色行动
{history_text}

返回一个字符串。保持简洁。

### 事件生成要求
1. 事件尽可能新颖，有趣，包含不同角色的利益冲突。

2. 禁止包含任何细节、人物具体行动和心理，包括对话等。
"""

UPDATE_EVENT_PROMPT = """
参考最初的事件
```{intervention}```

基于最近行动详情detail：
```{history}```

对事件：
```{event}```
进行更新。返回一个str

## 若最初的事件已经得到处理/结束/接近尾声，返回一个全新事件。
### 事件生成要求
1. 事件尽可能新颖，有趣，包含不同角色的利益冲突。

2. 禁止包含任何细节、人物具体行动和心理，包括对话等。

## 若未解决，返回更新后的事件
### 更新要求

1. 禁止包含任何细节、人物具体行动和心理，包括对话等。仅做一个大致的概括。

2. 注意判断detail中的人物动作，是否有关于事件的最新进展，如果有，概括在你的回复中。禁止提及与原事件无关的内容。

3. 回复必须包含原事件或最初事件中代表【前提】的部分，不过你可以对它进行概括。之后的内容可以适当忽略，只留下最近的信息。

"""

ENVIROMENT_INTERACTION_PROMPT = """
你是一个Enviroment Model，负责生成环境信息。角色 {role_name} 在 {location} 尝试进行行动 {action}。

请根据以下信息生成一个文学性叙述，描述行动的过程和结果，加入环境描写和情感渲染，仿佛来自一本叙事小说。避免使用任何系统提示或机械性语言。
返回一个字符串。

## 具体行动细节detail
{action_detail}

## 地点详情
{location_description}

## 世界观详情
{world_description}

## 补充信息
{references}

## 回应要求

1. 行动可能失败，但要避免让行动毫无效果，尽量给出新的线索，新的环境描述。

2. 使用第三人称视角。

3. 保持输出简洁，控制在100个字之内。你担任的只是Enviroment Model，对角色当前行动做出回应，不要代表角色做出任何行动。

4. 输出不包含detail中的原文，它应该能接续在具体行动细节之后，情节流程连贯。
"""

NPC_INTERACTION_PROMPT = """
你是 {target}.
角色 {role_name} 在 {location} 对你发起行动，你需要作为{target}做出回应。

请根据以下信息生成你的回应，包含你的行动和讲话，仿佛来自一本叙事小说。避免使用任何系统提示或机械性语言。

## 具体行动细节action_detail
{action_detail}

## 世界观详情
{world_description}

## 补充信息
{references}

## 回应要求

1. 行动可能失败，但要避免让行动毫无效果，尽量给出新的线索。

2. 使用第三人称。

3. 保持输出简洁，控制在80个字之内。

4. 注意你不是主要角色。你的输出应该尽量简单，符合身份定位，不要包含你的具体想法。

5. 输出不包含action_detail中的原文，它应该能接续在具体行动细节之后，情节流程连贯。

以JSON格式返回你的回答. 它应该能够被 json.loads() 解析。 不要返回任何额外信息，如```或```json

输出字段：
“if_end_interaction”，true or false，如果认为这段互动是时候结束了，则设置为true
“detail”，str，一个富有文学性的叙述性语句，包含你的思考、讲话和行动。
"""

SCRIPT_INSTRUCTION_PROMPT = """
你是一个导演，我需要你根据以下的信息对角色的下一步行动做出指导。

## 需要演出的完整剧本（并非已经完成的行动）
{script}

## 上一轮模拟进行到的阶段
{last_progress}

## 角色信息
{roles_info}

## 当前事件
{event}

## 最新角色行动
{history_text}

## 要求
1. 请你根据最新信息判断进展到了剧本的哪一阶段，你需要让角色将剧本向下一阶段推进。如果故事刚刚开始，则根据剧本初期的描述进行指导。

2. 规划下一步行动，为每个角色写出大致的行动指示，保持简洁，禁止具体描述角色的台词。禁止提前透露角色在下一幕才知道的信息。

3. 注意，角色的行动需要尽快推进剧情。如剧本中该阶段提到该角色在这一阶段将进行某项行动，则立刻开始行动。

以JSON格式返回你的回答. 它应该能够被 json.loads() 解析。 

输出字段:
‘progress’，对应value为你对整体进展的判断。
其它输出字段key为各个角色的role_code，value为你对该角色下一步行动做出的指示。
"""

JUDGE_IF_ENDED_PROMPT = """
你是一个熟练的剧本作家。根据给出的历史记录，判断这一幕是否可以结束。
## 历史记录
{history}

## 注意 
1. 若最后某个角色正在向另一个角色发起明确的行动（攻击、搜寻……），则这一幕未结束。
2. 若角色们正在谈话且未得出结论，则这一幕未结束。
3. 若角色已经基本完成交流，考虑结束这一幕。若谈话内容开始重复，则立刻结束这一幕。

以JSON格式返回你的回答. 它应该能够被 json.loads() 解析。表示字符串时使用双引号"而非单引号'。true和false全部小写。
输出字段：
"if_end": bool, true or false. 表示这一幕是否结束。
"detail": 仅当'if_end'为true，为这一幕写一段总结。突出世界观中的细节并让描述具有文学性，仿佛来自一本叙事小说。避免使用任何系统提示或机械性语言。
请特别注意：
- 叙述应平衡环境描写和动态刻画，避免冗长，控制在100个字以内。
- 文字应生动、有画面感，并契合世界观的风格，适当改变文风。
- 只允许描述现状，禁止代替角色做出行动。
"""

LOG2STORY_PROMPT = """
你是一个熟练的作家。请根据以下行动记录，扩写出一个小说形式的故事，返回一段富有文学性的文字。。

### 行动记录
{logs}

### 要求
1. 可以打乱叙事顺序，以增强故事的戏剧性、悬念和质感；
2. 可以修改对角色的行动描述，但需要保留关键信息；
3. 注意，在记录中，【】内的内容代表人物的心理活动，这些内容不能向其他角色展露，你可以适当地以第三人称视角概括。（）内的内容代表人物的动作。「」内的内容代表角色的讲话。
4. 添加必要的场景描述、情节连接和氛围营造,使故事更加生动。
"""