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