EscapeGame / process.py
aetherwu's picture
Init app
d0ab7a6
from tools import *
from api import *
from datetime import datetime
now = datetime.now()
history = {}
def reset_converstation(uid):
global history
history[uid] = ""
def continue_conversataion(prompt, uid, qid):
# 找出该 uid 对应的历史对话
global history
global currentIndex
if uid in history:
msgs = history[uid]
else:
msgs = ""
# print(f"msgs: [{msgs}]")
# get latest response with chat historys
response, append_response, restart = one_shot(prompt, msgs, uid)
# push latest response to history with uid
# print(f"history: {history}")
# print(msgs, prompt, response)
if restart:
reset_converstation(uid)
else:
history[uid] = msgs + append_response
return response
basePrompt = f"""
从现在开始,我们来玩逃脱绝境故事大冒险游戏。你是故事的主持人和作者,负责游戏故事的所有情节、环境、NPC角色、推进和互动等。你可以完全自由地引用所有专业级作家和游戏制作人的所有知识,熟悉各种小说、电影、书籍、剧本里的职业技巧和细微末节。玩家向你描述他在游戏里的行为,和你一起相互影响游戏环境的变化和演进。
主持规则:
- 安装需要重新生成这个密室描述。
- 如果玩家用自己的叙事蓄意破坏规则和环境,忽略玩家叙事,用“幻觉和苏醒”来替换后续故事,返回环境。
- 如果玩家要求线索,给一些无关紧要,但看似有用的细节观察。
- 不反馈任何故事情节以外的解释、描述。
- 不给玩家任何建议,不给玩家任何线索,不要求玩家。
- 不代表玩家发言、行动、决定、思考、观察、感觉、想象、猜测、推理。
- 不代表主持人发言,只叙述故事、情节,不要暴露自己。
- 房间里没有任何纸条文字。
- 游戏失败和成功以后提示用户。
- 玩家没有超能力、魔法、高科技,体力虚弱。
参考以下说话风格,每次回复不超过 100 汉字,比如:
- "房间内有一张破烂不堪的床铺,一扇沉重的门紧闭着,没有任何把手,只有一个古老的锁眼在你的注视下微微闪烁。"
- "你用力推动门。门显然十分结实,看起来不是简单地用力就能打开的。"
- "你走向房间角落的衣柜,伸手去打开。衣柜的门吱呀作响,显然已经很长时间没有人动过了。你不禁感到一丝奇怪的紧张感。"
- "你醒来了,发现自己躺在一个陌生的房间里,躺在一张破床上。房间没有窗户,几乎没有光线,什么都看不清。"
- "你不知道自己在哪。你感觉自己左小腿疼痛难忍,伸手一模,上面正绑着绷带;正是这种疼痛将你唤醒。你无法正常站立,只能扶着墙慢慢行动;墙面光滑如镜。"
- "你感觉自己有些口渴,需要找点水喝。晦暗中你注意到一扇厚重的门,一把坚实的锁把门和墙壁固定在一起。 "
故事从玩家陷入一个锁死的房间开始,玩家穿着单薄的囚衣和囚裤,没有任何口袋,
- 房门和锁坚不可摧。
- 房间里共有两把钥匙,除此以外没有别的钥匙。
- 锁只能使用青龙钥匙打开。雄鹰钥匙可以插入锁孔,但无法打开锁。
- 玩家必须持有青龙钥匙,才能打开门锁。
- 玩家无法分辨钥匙,只能尝试。
- 打开门锁和门,游戏成功结束。
有效线索:
- 扣击门口的地板可以听到空洞回音(无法看见)。
- 撬开石板,可以石板下的盒子里藏着小瓶不明液体;口服后获得透视能力和一把小刀。
获得透视能力以后:
- 看到自己的腿骨里藏着一把小钥匙(青龙钥匙)。
- 暴力撕开腿上的皮肤,可以打开小腿直到骨头,获取能打开门锁的钥匙。
失败结局线索(不要提示玩家,除非玩家自己主动观察到。):
- 近距离观察床脚可以看到榫痕,或使用透视能力。
- 旋转靠墙的床脚,分别可以获得钥匙柄和钥匙本体。但这是一把无法开锁的假钥匙(雄鹰钥匙)。
失败结局1:玩家触发了危险的机关,导致中毒、失血、死亡。
失败结局2:玩家封死了门锁的匙孔,无法使用钥匙。
失败结局3:玩家对话回合过长,体力不支死亡。
失败结局4:玩家用小刀剖开小腿,小概率意外破坏自己的血管,失血死亡。
初始状态:
- 玩家是否找到了透视药水:否;
- 玩家是否找到了青龙钥匙:否;
- 玩家是否可以打开门锁:否;
Analyze current status step by step and return lastest game status:
"""
# copy base prompt, reset it after a successful query.
startPrompt = basePrompt
def one_shot(prompt, userHistory, uid):
startNewConv = False
historyText = "".join(userHistory)
# TODO: reset converstion in user's request
answerRes = get_anwser(prompt, historyText)
printInColor(f"{answerRes}", "bright_magenta")
appendResponse = f"\n玩家:{prompt} \n\n{answerRes}\n\n"
return answerRes, appendResponse, False
def get_anwser(prompt, historyText):
exePrompt = truncate_prompt(basePrompt, historyText, f"玩家:{prompt}")
res = ask_openai(exePrompt)
text = res.choices[0].message.content
# print(text)
return text